📂 상속관계 매핑이란?
- 객체 세계에서는 상속이 자연스럽지만, 관계형 DB에는 상속 개념이 없음
- 그래서 JPA는 이를 매핑하기 위한 3가지 전략을 제공함
💡 핵심 : 공통 속성은 부모(Entity)에서 관리하고, 저장 방식은 전략에 따라 달라짐
🏢 JPA 상속 매핑 전략 3가지

1️⃣ 조인 전략 (JOINED)

🖼️ 구조
JOIN으로 연결DTYPE 컬럼으로 타입 구분✅ 장점
❌ 단점
JOIN 많음 → 성능 저하INSERT 시 부모·자식 테이블 모두 저장 → SQL 2번 발생2️⃣ 단일 테이블 전략 (SINGLE_TABLE, 기본값)

🖼️ 구조
DTYPE 컬럼으로 구분NULL 허용✅ 장점
JOIN이 필요 없음 → 조회 성능 빠름❌ 단점
NULL 많아짐3️⃣ 구현 클래스마다 테이블 전략 (TABLE_PER_CLASS)

🖼️ 구조
✅ 장점
NOT NULL 제약 조건 사용 가능❌ 단점
Product)으로 조회 시 → 모든 자식 테이블을 UNION 조회 → 성능 저하GenerationType.IDENTITY 못 쓰고 AUTO만 가능💡 JPA의 테이블 전략
- JPA는 모든 전략으로 테이블을 구현할 수 있도록 지원함
🏷️ 관련 어노테이션
@Inheritance(strategy = …) → 상속 매핑 전략 지정JOINED : 조인 전략SINGLE_TABLE : 단일 테이블 전략 (Default)TABLE_PER_CLASS : 구현 클래스 전략@DiscriminatorColumn(name = "dtype")DTYPE 기본값)@DiscriminatorValue("B")🧐 선택 기준
JOINEDSINGLE_TABLETABLE_PER_CLASS는 실무에서 거의 쓰지 않음💡 단순히 공통 컬럼만 필요하다면 → @MappedSuperclass 권장
(ex. createdAt, updatedAt 같은 Audit 필드 관리)
🧠 요약 정리
| 전략 | 구조 | 장점 | 단점 | 실무 활용 |
|---|---|---|---|---|
| JOINED | 부모·자식 각각 테이블, JOIN | 정규화, 무결성, 저장공간 효율 | JOIN 많아 성능 저하,INSERT 2번 | 복잡한 도메인 모델 |
| SINGLE_TABLE | 한 테이블에 전부 저장 + DTYPE | SQL 단순, 조회 빠름 | NULL 많음, 테이블 비대 | 단순 구조에 적합 |
| TABLE_PER_CLASS | 자식마다 독립 테이블 | 구분 명확,NOT NULL 가능 | 조회 성능 저하, PK 문제 | 🚫 비추천 |
| MappedSuperclass | 상속만 제공, 테이블 없음 | 공통 컬럼 재사용 | 엔티티 X (조회 불가) | 공통 필드 관리 |