[Spring] 상속관계 매핑

이연우·2025년 8월 19일

TIL

목록 보기
86/100

📂 상속관계 매핑이란?

  • 객체 세계에서는 상속이 자연스럽지만, 관계형 DB에는 상속 개념이 없음
  • 그래서 JPA는 이를 매핑하기 위한 3가지 전략을 제공

💡 핵심 : 공통 속성은 부모(Entity)에서 관리하고, 저장 방식은 전략에 따라 달라짐

🏢 JPA 상속 매핑 전략 3가지

1️⃣ 조인 전략 (JOINED)

🖼️ 구조

  • 부모, 자식 각각 테이블을 만들어 JOIN으로 연결
  • 부모 테이블에 공통 컬럼, 자식 테이블에 개별 컬럼
  • DTYPE 컬럼으로 타입 구분

✅ 장점

  • 테이블 정규화 (중복 X)
  • FK 참조 무결성 보장
  • 저장 공간 효율적

❌ 단점

  • 조회 시 JOIN 많음 → 성능 저하
  • INSERT 시 부모·자식 테이블 모두 저장 → SQL 2번 발생
  • SQL 복잡

2️⃣ 단일 테이블 전략 (SINGLE_TABLE, 기본값)

🖼️ 구조

  • 부모·자식 모두 하나의 테이블에 저장
  • DTYPE 컬럼으로 구분
  • 자식 전용 컬럼은 다른 행에서 NULL 허용

✅ 장점

  • JOIN이 필요 없음 → 조회 성능 빠름
  • SQL 단순

❌ 단점

  • 자식 엔티티 전용 컬럼이 많아지면 NULL 많아짐
  • 테이블이 비대해질 수 있음
  • 상황 따라 조회 성능 느려질 수 있음

3️⃣ 구현 클래스마다 테이블 전략 (TABLE_PER_CLASS)

🖼️ 구조

  • 자식 엔티티마다 독립적인 테이블 생성
  • 부모 테이블 없음, 각자 모든 컬럼 보유

✅ 장점

  • 자식 클래스별로 명확히 구분
  • NOT NULL 제약 조건 사용 가능

❌ 단점

  • 부모 타입(Product)으로 조회 시 → 모든 자식 테이블을 UNION 조회 → 성능 저하
  • ID 충돌 방지를 위해 GenerationType.IDENTITY 못 쓰고 AUTO만 가능
  • 유지 보수 불편 → 권장하지 않음

💡 JPA의 테이블 전략

  • JPA는 모든 전략으로 테이블을 구현할 수 있도록 지원함

🏷️ 관련 어노테이션

  • @Inheritance(strategy = …) → 상속 매핑 전략 지정
    • JOINED : 조인 전략
    • SINGLE_TABLE : 단일 테이블 전략 (Default)
    • TABLE_PER_CLASS : 구현 클래스 전략
  • @DiscriminatorColumn(name = "dtype")
    • 구분 컬럼 (DTYPE 기본값)
  • @DiscriminatorValue("B")
    • 구분 컬럼에 들어갈 값 지정

🧐 선택 기준

  • ⚙️ 비즈니스 복잡, 확장성 필요 → JOINED
  • ⚡ 단순하고 확장 없음 → SINGLE_TABLE
  • 🚫 TABLE_PER_CLASS는 실무에서 거의 쓰지 않음

💡 단순히 공통 컬럼만 필요하다면 → @MappedSuperclass 권장
(ex. createdAt, updatedAt 같은 Audit 필드 관리)


🧠 요약 정리

전략구조장점단점실무 활용
JOINED부모·자식 각각 테이블, JOIN정규화, 무결성,
저장공간 효율
JOIN 많아 성능 저하,
INSERT 2번
복잡한 도메인 모델
SINGLE_TABLE한 테이블에 전부 저장 + DTYPESQL 단순,
조회 빠름
NULL 많음, 테이블 비대단순 구조에 적합
TABLE_PER_CLASS자식마다 독립 테이블구분 명확,
NOT NULL 가능
조회 성능 저하, PK 문제🚫 비추천
MappedSuperclass상속만 제공, 테이블 없음공통 컬럼 재사용엔티티 X (조회 불가)공통 필드 관리

0개의 댓글