[JPA] 고급 매핑

김영한 님의 ‘자바 ORM 표준 JPA 프로그래밍 - 기본편’ 강의 中

상속 관계 매핑

관계형 DB는 상속 관계 매핑이 없다.
슈퍼타입 서브타입 관계라는 모델링 기법이 객체의 상속과 유사하다.
상속관계 매핑 : 슈퍼타입 서브타입 관계와 객체의 상속을 매핑함

  1. 조인 전략
  2. 단일 테이블 전략
  3. 구현 클래스마다 테이블 전략


=> 조인 전략과 단일 테이블 전략 사이 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(속성만 상속) 경우만 가능하다.