5. 상속 매핑

신명철·2022년 2월 12일
0

JPA

목록 보기
5/14

상속관계 매핑

설계를 하다보면 상속관계가 필요한 경우가 생긴다. 상위 클래스 '책' 과 '만화책', '소설책' 같은 상속관계는 RDB로 어떻게 표현해야 할까?

RDB 에는 상속관계가 존재하지 않는다. 대신, 슈퍼타입과 서브타입 관계라는 모델링 기법이 객체의 상속과 유사하기 떄문에 이를 이용한다.

조인 전략

@Entity
@Inheritance(strategy=InheritanceType.JOINED)
public class Item{
...
}

장점

  • 테이블 정규화
  • 저장공간 효율화
  • 외래 키 참조 무결성 사용가능

단점

  • 조회 시 조인을 많이 사용
    -> 성능 저하
  • 조회 쿼리가 복잡
  • INSERT 시 SQL 2번 사용

단일 테이블 전략

장점

  • 조인이 필요 없음
    -> 빠르고 쿼리 단순

단점

  • 매핑한 컬럼 모두 null 허용해줘야 함
    • 자식 테이블의 필드 값이 한 테이블안에 들어가 있어서 필연적으로 null이 생길 수 밖에
  • 테이블이 커져서 오히려 느려질 수 있음

구현 클래스마다 테이블 전략

장점

  • 서브 타입을 명확하게 처리할 수 있음
  • not null 제약조건 가능

단점

  • 성능이 느림
  • 자식 테이블을 통합해서 쿼리하기 어려움

주요 어노테이션

상속관계를 표현하는 방법에 사용되는 어노테이션이다.

@Inheritance(strategy=InheritanceType.XXX)

  • JOINED : 조인 전략
  • SINGLE_TABLE : 단일 테이블 전략
  • TABLE_PER_CLASS : 구현 클래스마다 테이블 전략

@DiscriminatorColumn(name="DTYPE"), @DiscriminatorValue("XXX")

DTYPE 은 자식 테이블을 구분하기 위해서 사용한다. 부모 테이블에 @DiscriminatorColumn, 자식 테이블에 @DiscriminatorValue 를 달아주면 DB 에서 필드가 추가되고 자식 테이블을 쉽게 구분할 수 있다.

@MappedSuperClass

  • 공통된 매핑 정보가 필요할 때 사용함
    • 반복되는 같은 속성의 필드를 한 곳에 모아두는 개념
  • 엔티티가 아니기 때문에 조회, 검색이 불가함
  • 직접 생성해서 사용할 일이 없기 때문에 추상 클래스를 권장

출처

profile
내 머릿속 지우개

0개의 댓글