DB는 상속관계라는 개념이 없다. 그래서 상속 관계 매핑은 자바의 상속 구조를 DB 테이블로 어떻게 풀어낼것인지 정하는 것이다.
1. JOINED 전략 (정규화형)
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn
테이블 구조
- 부모 (Item) 테이블 1개
- 자식 (Album, Book, Movie) 테이블 각각 1개
- PK를 공유하면서 자식 테이블이 부모 PK를 FK로 가짐

장점
- 테이블 정규화를 통해 중복과 NULL 컬럼을 최소화 할 수 있다.
- 자식 엔티티별 컬럼이 명확하게 분리되어 제약 조건을 적용하기 쉽다.
단점
- 조회 시 조인이 많아져 성능이 낮을 수 있음
- INSERT도 부모 + 자식 2번씩 생김
2. SINGLE_TABLE 전략 (통합형)
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn
테이블 구조
- 테이블 딱 1개 (ITEM)
- 자식 컬럼까지 전부 ITEM 테이블에 들어감
- 어떤 타입인지 구분할 DTYPE 컬럼이 필요
장점
- 조회가 가장 빠르고 단순함 (조인이 없어 성능 유리)
- 운영/쿼리도 쉬움
단점
- NULL 허용 (자식 컬럼 대부분이 null이 됨)
- 자식 컬럼이 많아지면 테이블이 과하게 커짐
- NOT NULL 제약 걸기가 어려움 (타입별로 다르기때문)
3. TABLE_PER_CLASS (비추)
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
부모 타입(Item)으로 조회하면 UNION 쿼리가 나가기 때문에 성능/운영 부분에서 최악이다.
공통 조회가 너무 안좋아서 거의 안씀.
@MappedSuperclass
공통 속성을 엔티티들에 물려주기 위한 속성 상속용 클래스이다.
많은 엔티티에 공통적으로 들어갈 속성들 (id, createDate, lastModifiedDate, createdBy, updatedBy 등)을 중복코드를 없애기 위해
BaseEntity를 두어 상속받아 사용한다.
쉽게 말해 컬럼을 오버라이딩 하는 느낌 (재정의는 못함)으로 쓴다.
@MappedSuperclass
public abstract class BaseEntity {
@Id @GeneratedValue
private Long id;
private LocalDateTime createdDate;
private LocalDateTime lastModifiedDate;
}
@Entity
public class Member extends BaseEntity {
private String name;
}

'JPA' 카테고리의 다른 글
| JPA의 값 타입 (0) | 2025.12.27 |
|---|---|
| 프록시와 연관관계 관리 (0) | 2025.12.26 |
| 엔티티 매핑, 연관관계 (0) | 2025.12.12 |
| 영속성 관리 - 내부 동작 방식 (0) | 2025.12.05 |
| 데이터 접근 기술 - JPA (0) | 2025.10.24 |