07. 고급 매핑
#
상속관계 매핑- RDB는 상속 관계 X
- 그나마 비슷한게 슈퍼타입, 서브타입 모델링 기법이 객체 상속과 유사
- 상속관계 매핑: 객체의 상속구조와 DB의 슈퍼/서브타입 관계 매핑
#
슈퍼/서브타입 논리모델을 물리모델로 구현하는 방법- 각각 테이블로 변환 -> 조인 전략
- ITEM 테이블이 있고, ALBUM/MOVIE 테이블의 각 pk가 ITEM_ID의를 fk 로 가짐
- ITEM 테이블엔 DTYPE 필드가 있어 각 종류를 넣을 수 있음
- 가장 정규화된 방식
- 통합 테이블로 변환 -> 단일 테이블 젼략
- ITEM 테이블로 모든 타입을 해결
- 대신 각 타입마다 쓰는 필드를 다 가져 sparse 해질 수 있음
- 성능에는 이점이 있음
- 서브타입 테이블로 변환 -> 구현 클래스마다 테이블 전략
- ITEM 테이블은 없고, ALBUM/MOVIE 테이블 만 있음
- 음 객체 입장에선 다 똑같음
#
주요 어노테이션@Inheritance(strategy = InheritanceType.JOINED)
: 조인 전략@Inheritance(strategy = InheritanceType.SINGLE_TALBE)
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
+ 슈퍼 타입은 abstract 클래스 조인 전략- Item 슈퍼타입으로 조회할 경우 하위 타입을 다 조회하는 쿼리가 나가게 됨 (비효율적)
@DiscriminatorColumn
: DTYPE 필드 추가@DiscriminatorValue("M")
: 서브 타입 클래스에서 DTYPE 이름 지정- 단일 테이블 전략에선 꼭 뜰어가야 함
#
장단점- 조인 전략 (정석)
- 장점
- 테이블 정규화됨
- 외래키 참조 무결성 제약조건 활용 가능
- 저장 공관 효율화
- 단점
- 조인 쿼리가 나가게 됨
- 조회 쿼리 복잡
- insert 2번
- 장점
- 싱글 테이블 전략 - 확장할 경우가 많이 없을 경우
- 장점
- 조인이 필요없어 일반적으로 빠름
- 조회 쿼리가 단순
- 단점
- 자식 엔티티가 매핑한 컬럼은 모두 null 허용 (sparase 하다)
- 데이터가 너무커져서 특정상황에서 조회성능이 오히려 느릴 수 있음
- 장점
- 구현 클래스마다 테이블 전략 (추천 X)
- 장점
- not null 제약조건 사용 어려움
- 단점
- 쿼리가 UNION 해야되서 매우 복잡함
- 장점
@MappedSuperclass
- 매핑 정보 상속#
- 객체입장에서 공통 매핑정보가 필요할 때 사용 (id, name, createdDate, updatedDate)
- BaseEntity 클래스를 설계하고 해당 클래스에
@MappedSuperclass
를 달게 됨, 그리고 해당 클래스를 상속 - 상속관계 X, 엔티티 X, 테이블과 매핑 X