개발/JPA
[JPA 기본] 7. 고급 매핑
Dahee Joy Cha
2022. 1. 22. 05:23
1. 상속관계 매핑
- 객체의 상속 구조와 DB의 슈퍼타입, 서브타입 관계를 매핑
1.1 테이블 구성 전략 (이론)
- 조인 전략
- ITEM의 하위에 ALBUM, MOVIE, BOOK 테이블 둠. ITEM 테이블의 DTYPE에 따라 조인할 테이블 결정
- 단일 테이블 전략
- ITEM 테이블에 하위 테이블의 속성 값(ARTIST, AUTHOR등)을 모두 넣음.
- 보통 성능 때문에 사용
- 클래스별 테이블 전략
- 공통요소(NAME, PRICE)를 각 테이블이 지님.
- 예. ITEM 테이블 없이 3개의 테이블 가져감 (ALBUM, MOVIE, BOOK)
- 공통요소(NAME, PRICE)를 각 테이블이 지님.
2. 슈퍼타입-서브타입을 JPA에서 매핑하는 방법
extends 키워드 사용
public class Album extends Item
3. 각 전략별 특징 상세 내용
조인 전략
정석이다.
- 장점: 테이블 정규화 / 외래키 참조 무결성 제약조건 활용 가능 / 저장 공간 효율
- 단점: 조인으로 인한 성능 저하 / 조회 쿼리 복잡도 / 저장할 경우 INSERT 쿼리 2번 필요
단일 테이블 전략
- 프로그램 실행시 ITEM에 모든 속성 값 다 들어감. (JPA 기본 DDL 설정: single 테이블)
- DTYPE: @DiscriminatorColumn 설정 없어도 자동으로 테이블에 생성됨. (cf. 조인전략은 DTYPE 별도 설정 필요)
** 테이블 구성 전략 (실행 결과)
- 확장성 없고 + 데이터 별로 안 쌓일 예정이라면 사용 OK.
- 장점: 조인 필요 x. 조회 성능 빠르다 / 조회 쿼리 단순
- 단점: 자식 엔티티의 컬럼은 모두 null 허용 / 테이블 커지므로 상황에 따라 조회 성능 느려질 수도 있음.
TABLE_PER_CLASS 전략
- 쓰면 안되는 전략!!!
- 장점: 서브타입 명확히 구분하여 사용시 좋다 / not null 제약 조건 사용 가능
- 단점:UNION 사용(예. ItemId로 조회시, ITEM 하위의 BOOK, ALBUM, MOVIE 다 조회) / 부모 객체에 변경이 필요할 경우 자식 모두 변경해야함.
2. Mapped Superclass - 매핑 정보 상속
- 테이블 상속 관계 아님! 물리적으로 분리된 클래스에서 공통으로 사용할 속성을 지정.
- 엔티티 (or 테이블)과 매핑 불가.
- 조회 불가 (예. em.find(BaseEntity); )
- 추상 클래스로 사용하자. (직접 생성할 경우 금지)
// 테이블별 공통으로 사용할 컬럼
@MappedSuperclass
public abstract class BaseEntity {
private String createdBy;
private LocalDateTime createdDate;
private String lastModifiedBy;
private LocalDateTime lastModifiedDate;
}
// 테이블에서 BaseEntity 연결하는 예시 (extends 키워드 사용)
public class Member extends BaseEntity{
3. 그외: JPA의 장점
-> 전략간 switching 과정에서 쿼리 수정 필요 x. @Inheritance 속성만 바꿔주면 된다.