상속 관계 매핑
1. 각각의 테이블로 변환(조인 전략)
- 장점
- 테이블이 정규화된다.
- 외래키 참조 무결성 제약조건을 활용할 수 있다.
- 저장공간을 효율적으로 사용한다.
- 단점
- 조회할 때 조인이 많이 사용되므로 성능이 저하될 수 있다.
- 조회 쿼리가 복잡하다.
- 데이터를 등록할 때 INSERT SQL을 두 번 실행한다.
2. 통합 테이블로 변환(단일 테이블 전략)
- 장점
- 조인이 필요없으므로 일반적으로 조회 성능이 빠르다.
- 조회 쿼리가 단순하다.
- 단점
- 자식 엔티티가 매핑한 컬럼은 모두 null을 허용해야 한다.
- 단일 테이블에 모든 것을 저장하므로 테이블이 커질 수 있다. 그러므로 상황에 따라서는 조회 성능이 오히려 느려질 수 있다.
- 구분 컬럼을 꼭 사용해야 한다. @DiscriminatorColumn을 꼭 설정해야 한다.
- @DiscriminatorValue를 지정하지 않으면 기본으로 엔티티 이름을 사용한다.
3. 서브타입 테이블로 변환(구현 클래스마다 테이블 전략)
- 장점
- 서브 타입을 구분해서 처리할 때 효과적이다.
- not null 제약조건을 사용할 수 있다.
- 단점
- 여러 자식 테이블을 함께 조회할 때 성능이 느리다(SQL에 UNION을 사용해야 한다).
- 자식 테이블을 통합해서 쿼리하기 어렵다.
- 완전 비추
@MappedSuperclass
부모 클래스를 상속받는 자식 클래스에게 매핑 정보만 제공하고 싶으면 @MappedSuperclass를 사용한다.
실제 테이블과 매핑되지 않고, 단순히 매핑 정보를 상속할 목적으로만 사용된다.
추상 클래스와 비슷하다.
- 테이블과 매핑되지 않고 자식 클래스에 엔티티의 매핑 정보를 상속하기 위해 사용한다.
- @MappedSuperclass로 지정한 클래스는 엔티티가 아니므로 em.find()나 JPQL에서 사용할 수 없다.
- 이 클래스를 직접 생성해서 사용할 일은 거의 없으므로 추상 클래스로 만드는 것을 권장한다.
'자바 ORM 표준 JPA 프로그래밍' 카테고리의 다른 글
9장_값 타입 (0) | 2022.01.12 |
---|---|
8장_프록시와 연관관계 정리 (0) | 2022.01.11 |
6장_다양한 연관관계 매핑 (0) | 2022.01.10 |
5장_연관관계 매핑 기초 (0) | 2022.01.10 |
4장_엔티티 매핑 (0) | 2022.01.06 |