1️⃣ 조인 전략이란?
PA에서 상속 구조를 테이블로 어떻게 매핑할지에 따라 3가지 전략이 존재
그중 `JOINED` 전략은 부모 테이블과 자식 테이블을 나누고 조인을 통해 상속 구조를 구현
2️⃣ 조인 전략 테이블 구조
조인 전략에서는 다음과 같이 테이블이 분리
- 부모 테이블: `Item`
- 자식 테이블: `Book`, `Movie`, `Album` 등
📌 자식 테이블은 부모 테이블의 `PK`를 `FK`로 참조하며, 실제 데이터 조회 시 조인이 필요

장점
• 테이블 정규화
• 외래 키 참조 무결성 제약조건 활용가능
• 저장공간 효율화
• 단점
• 조회시 조인을 많이 사용, 성능 저하
• 조회 쿼리가 복잡함
• 데이터 저장시 INSERT SQL 2번 호출
3️⃣ 단일 테이블 전략 (SINGLE_TABLE)

장점
- 조인이 필요 없으므로 일반적으로 조회 성능이 빠름
- 조회 쿼리가 단순함
단점
- 자식 엔티티가 매핑한 컬럼은 모두 null 허용
- 단일 테이블에 모든 것을 저장하므로 테이블이 커질 수 있다
- 상황에 따라서 조회 성능이 오히려 느려질 수 있다
4️⃣ 구현 클래스마다 테이블 전략

이 전략은 데이터베이스 설계자와 ORM 전문가 둘 다 추천X
장점
- 서브 타입을 명확하게 구분해서 처리할 때 효과적
- not null 제약조건 사용 가능
단점
- 여러 자식 테이블을 함께 조회할 때 성능이 느림(UNION SQL 필요)
- 자식 테이블을 통합해서 쿼리하기 어려움
5️⃣ 어노테이션 정리
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn(name = "DTYPE")
public abstract class Item {
@Id @GeneratedValue
private Long id;
private String name;
}
@Entity
@DiscriminatorValue("BOOK")
public class Book extends Item {
private String author;
}
- @Inheritance: 상속 전략 지정
- @DiscriminatorColumn: dtype 컬럼 생성 (구분자)
- @DiscriminatorValue: 자식 클래스에 저장될 dtype 값
✅ 장점
| 항목 | 설명 |
| 테이블 정규화 | 공통 필드는 부모 테이블로 분리되어 정규화 |
| 무결성 보장 | 자식 테이블이 부모의 ID를 외래키로 참조 |
| 저장공간 효율 | 자식마다 필요한 컬럼만 테이블에 존재 (null 거의 없음) |
❌ 단점
| 항목 | 설명 |
| 성능 저하 | 조회 시 조인이 많아 성능 저하 우려 |
| 쿼리 복잡 | JOIN이 많아져 SQL이 복잡해짐 |
| INSERT 2번 | 저장 시 부모와 자식 테이블에 각각 INSERT 발생 |
6️⃣ 저장/조회 흐름
[Book 엔티티 저장 시]
1. Item 테이블 INSERT
2. Book 테이블 INSERT
[조회 시]
SELECT * FROM Item
JOIN Book ON Item.id = Book.id
언제 사용하면 좋을까?
- 정규화가 중요한 도메인 설계에서
- 자식 클래스마다 명확한 컬럼 구분이 필요한 경우
- null 컬럼 최소화가 중요한 경우
7️⃣ 정리
- JOINED 전략은 정규화된 설계를 할 수 있다는 점에서 도메인 무결성에 강함
- 하지만 조회 성능이 중요한 서비스에서는 주의가 필요
- 전략 선택은 상황에 따라 달라질 수 있으며, 복잡도 vs 성능 사이의 균형이 중요
'SPRING' 카테고리의 다른 글
| [SPRING] SSE(Sever-sent-event) (1) | 2025.04.25 |
|---|---|
| [SPRING] JPA Proxy (3) | 2025.04.21 |
| [SPRING] 트랜잭션(Transaction) (2) | 2025.04.17 |
| [SPRING] 인터셉터 AOP (1) | 2025.04.15 |
| [SPRING] 뉴스피드 인덱스 실전 테스트 (0) | 2025.04.13 |