# 강의/[인프런] 자바 ORM 표준 JPA 프로그래밍

고급 매핑(상속, Mapped Superclass)

고급 매핑

목차

  1. 상속 관계 매핑
  2. @MappedSuperClass

 

상속 관계 매핑

관계형 데이터베이스에 상속 관계를 표현하는 방법은 없으나 슈퍼타입 서브타입 관계라는 모델링 기법이 객체 상속과 유사합니다.

  1. 각각 테이블로 변환 → 조인 전략
    • 하위 테이블들이 상위 테이블의 키를 가짐으로 조인해서 하위 테이블의 값을 가져옴
  2. 통합 테이블로 변환 → 단일 테이블 전략
    • 자식 클래스의 자료를 모두 하나의 테이블에서 갖도록 하고 어떤 타입인지 구분
  3. 서브타입 테이블로 변환 → 구현 클래스마다 테이블 전략
    • 공통되는 부분을 모두 각각 갖도록 함

 

 

상속 관계 매핑 시 사용하는 주요 어노테이션

  • @Inheritance(strategy = InheritanceType.XXX)
    • JOINED : 조인 전략
    • SINGLE_TABLE : 단일 테이블 전략
    • TABLE_PER_CLASS : 구현 클래스마다 테이블 전략
  • @DiscriminatorColumn(name=“DTYPE”)
    • 자식 클래스의 타입을 표시하는 컬럼 명을 지정할 수 있음
  • @DiscriminatorValue(“XXX”)

각 전략별 장단점

  1. 조인 전략
    1. 테이블이 정규화 되어 있어 저장 공간이 효율적임
    2. 외래 키 하나만으로 관리할 수 있어 관리가 편함
    3. 조회 시 조인을 많이 사용하고 성능이 저하됨.
    4. 테이블이 많아지고 조회 쿼리가 복잡함
    5. 기본적으로 조인 전략을 가장 많이 씀
  2. 단일 테이블 전략
    1. 조인이 필요 없어 일반적으로 조회 성능이 빠름
    2. 조회 쿼리가 단순함
    3. 자식 엔티티가 매핑한 컬럼은 모두 Null 허용해야 함
    4. 테이블 공간이 낭비될 수 있고, 데이터 양에 따라 조회 성능이 느려질 수 있음
  3. 구현 클래스마다 테이블 전략
    1. 서브 타입을 명확하게 구분해서 처리할 때 효과적
    2. DB 설계자와 ORM 전문가 모두 추천하지 않는 전략
    3. 테이블이 각각 관계가 없는 상태, 개별적으로 관리해야 함
    4. 여러 자식 테이블을 통합해서 조회하기 어려움
    5. 새로운 컬럼이 추가될 때마다 개별적으로 모두 수정해야 함

 

@MappedSuperclass

  1. 엔티티에 공통 매핑 정보가 필요할 때 사용ex2) 주로 생성자, 생성일, 최종 수정자, 최종 수정일과 같은 공통 정보를 갖게 할 때 사용
  2. ex) 모든 테이블이 id와 name을 가져야 한다.
  3. 속성만 제공하는 클래스로, 엔티티가 될 수 없음(테이블로 매핑이 되지 않음)
  4. 추상 클래스로 만들 것을 권장
728x90