JPA

상속관계 매핑

쭈녁 2022. 12. 20. 21:46

상속 관계 매핑

  • 관계형 데이터베이스 (RDB)는 상속 관계가 존재하지 않는다.
  • 슈퍼타입 서브타입 관계라는 모델링 기법이 존재하는데 이는 객체의 상속과 유사하다.
  • 객체의 상속 구조와 DB의 슈퍼타임 서브타입의 관계를 매핑하는 것을 상속관계 매핑이라 한다.

상속관계 예시

상속관계 매핑 전략은 아래와 같다.

  • 각 테이블로 변환 -> 조인 전략
  • 통합테이블로 변환 -> 단일 테이블 전략
  • 서브타입 테이블로 변환 -> 구현 클래스별 테이블 전략

 

JPA는 부모 객체(슈퍼타입 DB)의 클래스에 에노테이션을 통한 구조 설정이 가능하다.

  • @Inheritance(strategy=InheritanceType.XXX) : 상속 관계 매핑 설정
    • JOINED: 조인 전략
    • SINGLE_TABLE: 단일 테이블 전략
    • TABLE_PER_CLASS: 구현 클래스마다 테이블 전략
  • @DiscriminatorColumn(name=“DTYPE”) : 자손 클래스 (서브타입)을 구별하는 컬럼을 추가하는 에노테이션(부모 클레스에 써야한다.)
  • @DiscriminatorValue(“XXX”) : DTYPE의 값을 지정하는 에노테이션 (자손 클래스에서 설정)

 

상속관계 매핑 예시

 

-엔티티

상속 관계에 있는 객체 모델

동일한 아래 객체가 있다고 가정하자 해당 객체가 각 전략에 따라 DB화 되었을 때 아래와 같이 저장된다. 

 

 

-조인전략

조인전략의 경우 슈퍼타입인 Item객체가 따로 저장되고 서브타입에 조인되며 각 서브타입별 컬럼이 따로 저장된다.

조인전략

 

장점

  • 각 서브타입별 테이블이 생성됨으로 테이블 정규화
  • 외래 키 참조하여 서브타입으로 조인됨으로 무결성 제약조건 활용 가능
  • 모든 컬럼에 null값이 존재 하지 않음으로 저장공간 효율화

 

단점

  • 조회시 조인해야하는 테이블이 늘어남으로 성능이 저하된다.
  • 조회 쿼리가 복잡해진다.
  • 데이터 저장시 Item 테이블과 서브타입 테이블에 모두 저장해야 함으로 INSERT 쿼리가 2번 호출된다.

 

단일테이블 전략

상속 관계에 있는 엔티티의 데이터가 하나의 Item이라는 DB안에 저장됨, 이때 서브타입 컬럼이 모두 Item테이블에 컬럼으로 포함됨

단일 테이블 전략

 

장점

  • 조인이 필요 없어 조회성능이 향상된다.
  • 조회 쿼리가 단순하다.

 

단점

  • 자식 엔티티(서브타입)의 컬럼의 null을 허용해야한다.
    단일 테이블에 모든 컬럽 값을 저장함으로 테이블이 커지게 된다.

 

구현 클래스별 테이블 전략

구현 클래스별 테이블 전략

해당 케이스는 DB와ORM 양쪽 모두 이점이 없어 사용하지 않는 것을 권한다.