본문 바로가기

개발/JPA

[JPA 기본] 7. 고급 매핑

1. 상속관계 매핑

- 객체의 상속 구조DB의 슈퍼타입, 서브타입 관계를 매핑

 

1.1 테이블 구성 전략 (이론)

  • 조인 전략
    • ITEM의 하위에 ALBUM, MOVIE, BOOK 테이블 둠. ITEM 테이블의 DTYPE에 따라 조인할 테이블 결정
  • 단일 테이블 전략
    • ITEM  테이블에 하위 테이블의 속성 값(ARTIST, AUTHOR등)을 모두 넣음. 
    • 보통 성능 때문에 사용
  • 클래스별 테이블 전략
    • 공통요소(NAME, PRICE)를 각 테이블이 지님.
      • 예. ITEM 테이블 없이 3개의 테이블 가져감 (ALBUM, MOVIE, BOOK)

 

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 속성만 바꿔주면 된다.