상속 관계 매핑

tyghu77·2023년 8월 11일
0

상속 관계 매핑

객체에는 상속관계가 있다.
관계형DB에는 상속관계가 없다.
상소관계 매핑은 객체의 상속 구조와 DB의 슈퍼타입 서브타입 관계를 매핑하는 것이다.

DB에서의 상속 관계

  1. 조인 전략
  2. 단일 테이블 전략
    각각 테이블로 변환
    모든 컬럼을 한 테이블에 모아두기 (통합 테이블로 변환)
  3. 구현 클래스마다 테이블 전략
    테이블을 3개 만들고 부모의 속성을 컬럼으로 모두 들고 있도록 설계함(서브타입 테이블로 변환)

JPA에서 상속관계
JPA에서는 기본값으로 단일 테이블 전략을 가져간다.
부모 엔티티에서 @Inheritance(strategy = InheritanceType.XXX)를 써주면 각 전략에 맞게 매핑할 수 있다.

  1. JOINED
    조인 전략을 사용한다.
    @DiscriminatorColumn을 써주면 dtype이 생긴다. 그리고 엔티티 이름이 들어가게 된다. 그 이름을 바꾸고 싶다면 @DiscriminatorValue("xxx")로 바꿔주면 된다.

    장점
    데이터가 정규화가 되어있다. > 설계가 깔끔하다.
    외래 키 참조 무결성 제약 조건을 사용 가능하다.
    저장 공간의 효율이 좋다.
    단점
    조회 시에 조인이 많이 사용된다.
    조회 쿼리가 복잡하다.
    데이터 저장 시 INSERT 쿼리가 2번 호출된다.

  2. SINGLE_TABLE
    단일 테이블 전략을 사용한다. 한 테이블에 모든걸 때려박는 전략이다.
    성능이 잘나온다. (INSERT도 한번만, 조인도 필요없음)
    부모엔티티에 @DiscriminatorColumn이 없어도 dtype이 테이블에 생긴다.

    장점
    조인이 필요 없으므로 조회 성능이 빠르다.
    단점
    자식 엔티티가 매핑한 컬럼은 모두 null을 허용해야 한다.

  1. TABLE_PER_CLASS
    부모엔티티를 없애고 그 속성을 자식으로 내린 것이다.
    이 전략은 부모 엔티티로 찾게 될 경우에 모든 테이블을 다 찾게 된다. (쿼리가 매우 복잡하다)
    비효율적으로 동작하게 된다.

    쓰지말자

결론
조인 전략을 기본으로 들고가되, 조인 전략의 장단점과 단일
테이블의 장단점을 가지고 trade-off를 하는 것이 좋다.

profile
배운것을 기록하자

0개의 댓글