SPRING

[SPRING] 조인(JOINED) 전략

도원좀비 2025. 4. 19. 00:52

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