[JPA] 고급 매핑 - 상속 관계 매핑

2025. 7. 1. 15:39·DB Access/JPA
고급 매핑 - 상속 관계 매핑

고급 매핑 - 상속 관계 매핑

#JPA/기본



/상속관계 매핑: DB에는 상속관계가 없다.

  • 객체의 상속 구조와 DB의 슈퍼타입 서브타입 관계를 매핑
  1. 각각 테이블로 변환 → 조인 전략
  2. 통합 테이블로 변환 → 단일 테이블 전략
  3. 서브타입 테이블로 변환 → 구현 클래스마다 테이블 전략
  • 객체 입장에서는 셋 다 똑같음. 다 매핑이 가능함.
  • /주요 어노테이션
    • @Inheritance(strategy=InheritanceType.XXX)
    • @DiscriminatorColumn(name="DTYPE")
    • @DiscriminatorValue("XXX")

/조인 전략

  • @DiscriminatorColumn 추가 시 DTYPE 칼럼 생김.
    • DTYPE을 안넣어도 되는데, 넣어주는게 좋다.
  • @DiscriminatorValue("A")로 하위 테이블 이름 지정 가능
  • /조인 전략 - 장점
    • 테이블 정규화
    • FK 무결성 제약조건 하위 타입까지 볼 필요 없는 경우 상위 타입만 조회하면 됨.
    • 저장 공간 효율적
  • /조인 전략 - 단점
    • 조인으로 인한 성능저하. 데이터가 너무 많으면 오히려 성능이 좋을지도?
    • 조회 쿼리가 복잡
    • 데이터 저장 시 INSERT 두 번 나감.

/단일 테이블 전략

  • 하위 테이블 생성 X. 상위 테이블에 칼럼 다 포함됨.
  • @DiscriminatorColumn이 없어도 자동으로 DTYPE이 생성된다.
  • /단일 테이블 전략 - 장점
    • 조인이 필요 없으므로 일반적으로 조회 성능이 빠름. 쿼리도 단순함.
  • /단일 테이블 전략 - 단점
    • 자식 엔티티가 매핑한 컬럼은 모두 null 허용 무결성 애매해짐.
    • 단일 테이블에 모든 것을 저장하므로 테이블이 커질 수 있다. 상황에 따라서 조회 성능이 오히려 느려질 수 있다. (이런 경우는 거의 없긴 하다.)

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

  • 상위 테이블 없애고 하위 테이블로 전부 내려버린 전략
  • 쓰지 말자.
    • 상위 객체 조회시 하위 테이블을 전부 조회해서 UNION 해서 비효율적.
  • 장점
    • 서브 타입 명확하게 구분.
    • not null 제약 조건 사용 가능
  • 단점
    • 여러 자식 테이블을 함께 조회할 때 성능이 느림
    • 자식 테이블 통합해서 쿼리가 어려움.

/@MappedSuperclass

  • 공통 매핑 정보가 필요할 때 사용
    • 생성일, 마지막 수정일, 생성한 사람, 수정한 사람
  • BaseEntity 테이블이 생성되는게 아니라, Member 테이블에 BaseEntity 필드에 해당하는 컬럼이 생성된다.
    • BaseEntity는 추상 클래스로 선언하자. 엔티티가 아니므로 생성할 일이 없다.
    • 조회, 검색 불가(em.find(BaseEntity) 불가)
  • 부모 클래스를 상속받는 자식 클래스에 매핑 정보만 제공
  • @Entity 클래스는, 엔티티나 @MappedSuperclass로 지정한 클래스만 상속 가능

/실무에서 상속관계를 사용할까?

  • 파티셔닝등을 고려하면 테이블을 단순하게 유지하는게 좋음. 상속관계 많아지면 많이 복잡해짐.
  • 일단 객체지향적으로 쓰다가 트레이드 오프 경계 지점에서 구조를 수정하자.

Ref) 김영한 자바 ORM 표준 JPA 프로그래밍 - 기본편

'DB Access > JPA' 카테고리의 다른 글

[JPA] 값 타입  (0) 2025.07.01
[JPA] 프록시와 연관관계 관리  (0) 2025.07.01
[JPA] 다양한 연관관계 매핑  (0) 2025.07.01
[JPA] 연관관계 매핑 기초  (0) 2025.07.01
[JPA] 엔티티 매핑  (0) 2024.11.08
'DB Access/JPA' 카테고리의 다른 글
  • [JPA] 값 타입
  • [JPA] 프록시와 연관관계 관리
  • [JPA] 다양한 연관관계 매핑
  • [JPA] 연관관계 매핑 기초
lumana
lumana
배움을 나누는 공간 https://github.com/bebeis
  • lumana
    Brute force Study
    lumana
  • 전체
    오늘
    어제
    • 분류 전체보기 (463)
      • 개발 일지 (0)
        • Performance (0)
        • TroubleShooting (0)
        • Refactoring (0)
        • Code Style, Convetion (0)
        • Architecture (0)
      • Software Engineering (36)
        • Test (8)
        • 이론 (18)
        • Clean Code (10)
      • Java (72)
        • Basic (5)
        • Core (21)
        • Collection (7)
        • 멀티스레드&동시성 (13)
        • IO, Network (8)
        • Reflection, Annotation (3)
        • Modern Java(8~) (13)
        • JVM (2)
      • Spring (53)
        • Framework (12)
        • MVC (23)
        • Transaction (3)
        • AOP (11)
        • Boot (0)
        • AI (0)
      • DB Access (16)
        • Jdbc (1)
        • JdbcTemplate (0)
        • JPA (14)
        • Spring Data JPA (0)
        • QueryDSL (0)
      • Computer Science (130)
        • Data Structure (27)
        • OS (14)
        • Database (10)
        • Network (21)
        • 컴퓨터구조 (6)
        • 시스템 프로그래밍 (23)
        • Algorithm (29)
      • HTTP (8)
      • Infra (1)
        • Docker (1)
      • 프로그래밍언어론 (15)
      • Programming Language(Sub) (77)
        • Kotlin (1)
        • Python (25)
        • C++ (51)
        • JavaScript (0)
      • FE (11)
        • HTML (1)
        • CSS (9)
        • React (0)
        • Application (1)
      • Unix_Linux (0)
        • Common (0)
      • PS (13)
        • BOJ (7)
        • Tip (3)
        • 프로그래머스 (0)
        • CodeForce (0)
      • Book Review (4)
      • Math (3)
        • Linear Algebra (3)
      • AI (7)
        • DL (0)
        • ML (0)
        • DA (0)
        • Concepts (7)
      • 프리코스 (4)
      • Project Review (6)
      • LegacyPosts (11)
      • 모니터 (0)
      • Diary (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
lumana
[JPA] 고급 매핑 - 상속 관계 매핑
상단으로

티스토리툴바