[JPA]고급매핑
[JPA] 고급 매핑
김영한 님의 ‘자바 ORM 표준 JPA 프로그래밍 - 기본편’ 강의 中
상속 관계 매핑
관계형 DB는 상속 관계 매핑이 없다.
슈퍼타입 서브타입 관계라는 모델링 기법이 객체의 상속과 유사하다.
상속관계 매핑 : 슈퍼타입 서브타입 관계와 객체의 상속을 매핑함
- 조인 전략
- 단일 테이블 전략
- 구현 클래스마다 테이블 전략
=> 조인 전략과 단일 테이블 전략 사이 Trade-Off 를 따져서 엔티티를 설계
- @Inheritance(strategy=InheritanceType.XXX)
- @DiscriminatorColumn : 부모 테이블에 DTYPE 컬럼 만들어줌 (괄호에 name 선언해주면 컬럼명 수정 가능)
- @DiscriminatorValue : 자식 테이블에 대한 DTYPE 값을 설정(기본값은 자식 클래스명)
1. 조인 전략(정석)
객체 상속 관계처럼 테이블을 매핑하는 전략
장점
- 테이블 정규화
- 외래 키 참조 무결성 제약조건 활용가능(ITEM - ITEM_ID(PK), ALBUM - ITEM_ID(FK) …)
- 저장공간 효율화
단점
- 조회 시 조인을 많이 사용해서 성능 저하(크진 않다)
- 조회 쿼리 복잡
-
데이터 저장 시 INSERT SQL 2번 호출
- @Inheritance(strategy=InheritanceType.JOINED) : 조인 전략으로 설정
2. 단일 테이블 전략
싱글 테이블에 자식 테이블들의 컬럼을 모두 포함시키는 전략
단일 테이블 전략은 @DiscriminatorColumn 설정 없이도 자동으로 DTYPE 컬럼 들어감
장점
- 조인이 필요 없어서 조회 성능이 좋음
- 조회 쿼리 단순
단점
- 자식 엔티티가 매핑한 컬럼은 모두 null 허용
-
테이블이 커질 수 있는 상황에 따라 조회 성능이 느려질 수 있음
- @Inheritance(strategy=InheritanceType.SINGLED_TABLE) : 싱글테이블 전략으로 설정
3. 구현 클래스마다 테이블 전략(비추천)
부모 테이블을 없애고 부모 테이블의 컬럼들을 모든 자식 테이블에 포함시키는 전략
부모 타입으로 조회 시 모든 테이블을 뒤져야 한다는 단점이 있다(Union all로 모든 테이블을 탐색)
- @Inheritance(strategy=InheritanceType.TABLE_PER_CLASS) : 구현 클래스마다 테이블 전략으로 설정
- 부모 클래스를 abstract(추상 클래스)로 바꿈
@MappedSuperclass
=> 공통 매핑 정보(속성)가 필요할 때 사용
여러 엔티티에 똑같은 필드(컬럼)를 넣어야할 때 따로 BaseEntity(@MappedSuperclass)를 하나 만들고,
필요한 엔티티들에 상속을 시킴
- 상속관계 매핑이 아니다.
- 엔티티가 아니다 -> 테이블과 매핑도 안된다.
- 조회, 검색 불가(em.find(BaseEntity) 불가)
- 직접 생성해서 사용할 일이 없으므로 추상 클래스를 권장한다.
* JPA에서 extends를 쓸 수 있는 경우는 @Entity(상속 관계 매핑), @MappedSuperclass(속성만 상속) 경우만 가능하다.