<상속관계 매핑>
RDB는 상속관계가 존재하지 않는다.
슈퍼타입 / 서브타입 관계라는 모델링 기법이 객체 상속과 유사
객체 구조
공통 속성을 상위 객체인 'Item'으로 묶고, 하위 객체 안에는 각자의 속성을 구성
<Entity로 객체를 구성>
<< 상속관계 매핑 전략 (3가지) >>
※ JPA의 기본 전략 : 단일 테이블(SINGLE_TABLE)
※ 모든 전략에서 상위테이블(ITEM)은 추상 클래스(abstract)로 해야한다.
=> 추상 클래스로 설정하지 않는다면, 상속관계와는 별도의 클래스로 사용될 우려가 있기 때문이다.
1. 조인 전략 (JOINED)
▶기본적으로 "정석"으로 사용되는 전략◀
* JPA의 기본 전략인 단일 테이블( SINGLE_TABLE )을 조인 전략(JOINED)로 변경하기
** 상위 엔티티(Item)에 @Inheritance(strategy = InheritanceType.JOINED)
<테이블 생성 로그>
다시 movie를 찾아올때는 INNER JOIN을 사용해서 ITEM, MOVIE 테이블을 통해 가져오는 것을 볼 수 있다.
※ 어노테이션으로 DTYPE 만들기
@DiscriminatorColumn
자식 테이블을 나타내는 DTYPE 이 Movie 테이블의 경우 :Movie 지만 M 으로 축약하는 방법
2. 단일 테이블 전략 (SINGLE_TABLE)
** 상위 엔티티(Item)에 @Inheritance(strategy = InheritanceType.SINGLE_TABLE)
※ 기본전략이 'SINGLE_TABLE' 이기때문에 별도로 설정해 주지 않아도 된다.
* 데이터를 INSERT 할때 여러 테이블의 INSERT 쿼리를 동작할 필요가 없이 ITEM 테이블에 대한 INSERT 쿼리만 동작하는 성능상의 장점이 있다.
* 단일 테이블 전략은 ITEM 테이블만 생성되기 때문에, 하위 속성을 나타내는 'DTYPE' 이 반드시 별도로 생성된다.
3. 구현 클래스 마다 테이블 전략 (TABLE_PER_CLASS)
▶사용하면 안되는 전략◀
: 데이터베이스 전문가 / ORM 전문가 모두 추천하지 않는 전략
공통으로 묶이는 부분이 없기 때문에 통합이 어려움, 조회시 Union으로 모든 테이블을 찾아야 하는 치명적 성능 단점.
** 상위 엔티티(Item)에 @Inheritance(strategy = InheritanceType. TABLE_PER_CLASS)
상위 테이블(ITEM)은 생성되지 않고, 하위 테이블들만 생성된다.
TABLE_PER_CLASS 전략에서는 @DiscriminatorColumn 이 무의미 하다.
왜냐하면, 하위 테이블(MOVIE, ALBUM, BOOK)만 생성되기에 구분할 필요가 없기 때문이다.
※ 정리
* 장단점을 잘따져서 JOINED 와 SINGLE_TABLE 전략 중 선택
- 보통 JOINED 전략을 기본으로 사용.
- 데이터가 얼마 안되고, 정말 단순한 구조라면, SINGLE_TABLE 전략을 사용
* TABLE_PER_CLASS 전략은 사용을 지양
@MappedSuperclass
@MappedSuperclass는 공통 속성을 상위 클래스로 만든 후 상속 받아서 사용한다.
예시)
MEMBER 테이블 과 TEAM 테이블에 아래와 같은 공통 컬럼이 필요하다고 하자.
이를 '@MappedSuperclass'를 이용하여 상위 클래스(BaseEntity.class)에 공통 속성을 모은 뒤 상속 받아 사용하여라.
createdBy(생성자)
createdDate(생성일자)
lastmodifiedBy(최종 수정자)
lastmodifiedDate(최종 수정일자)
1. 'BaseEntity.class' 생성
<BaseEntity.class>
@MappedSuperclass 어노테이션을 통해 상속을 위한 공통 속성임을 명시한다.
2. 'Team.class' , 'Member.class'가 'BaseEntity.class'를 상속받는다.
3. MEMBER , TEAM 테이블에 공통 컬럼이 제대로 추가 되는지 확인
CREATE 쿼리를 살펴보면, 공통속성인
'createBy' , 'createdDate' , 'lastmodifiedBy' , 'lastmodifiedDate' 4개의 컬럼이 생긴것을 볼 수 있다.
< Member 객체를 삽입 >
공통 컬럼에 데이터를 삽입한다.
< [MEMBER] TABLE 확인>
공통 속성이 'CREATEBY' , 'CREATEDATE' 에 값이 입력되었다.
'Spring > JPA' 카테고리의 다른 글
[JPA - 10] 즉시로딩 / 지연로딩 (0) | 2023.12.07 |
---|---|
[JPA - 9] 프록시 (Proxy) (0) | 2023.12.05 |
[JPA - 7] 다양한 연관관계 매핑 (0) | 2023.12.01 |
[JPA - 6] 연관관계 매핑 (양방향 연관관계 / 연관관계의 주인 - 중점) (0) | 2023.11.26 |
[JPA - 5] Entity Mapping (0) | 2023.11.25 |