아! 이제 정확히 이해했습니다. 이 문제는 JPA JOIN FETCH의 카테시안 곱(Cartesian Product) 문제입니다.
문제 원인: 카테시안 곱
데이터 구조:
JOIN FETCH 쿼리 실행 결과:
결과 테이블:
AirPurchaseAirPassengerSpecialRequest
| 2011 | 3015 (김아빠) | 6 (우선 탑승) |
| 2011 | 3015 (김아빠) | 3 (추가 수하물) |
| 2011 | 3016 (김엄마) | 1 (휠체어 지원) |
| 2011 | 3016 (김엄마) | 8 (할랄 식사) |
문제: 같은 승객이 특별요청 개수만큼 중복으로 나타남!
이 문제의 정확한 명칭
1. 카테시안 곱 (Cartesian Product)
- 두 테이블을 조인할 때 발생하는 모든 조합
- A × B = A의 각 행이 B의 모든 행과 조합됨
2. JPA JOIN FETCH의 한계
- @OneToMany와 @ManyToMany를 동시에 FETCH할 때 발생
- JPA가 중복을 자동으로 제거하지 못함
3. N+1 문제의 변형
- 정확히는 "N+1 문제"가 아니라 "JOIN FETCH 중복 문제"
해결 방법들
방법 1: DISTINCT 사용 (부분적 해결)
한계: JPA에서 DISTINCT가 완전히 작동하지 않을 수 있음
방법 2: Set 사용 (현재 적용)
효과: 중복 제거, 하지만 근본적 해결은 아님
방법 3: 쿼리 분리 (권장)
방법 4: @BatchSize 사용
결론
이 문제는 "JPA JOIN FETCH의 카테시안 곱 문제" 또는 "JOIN FETCH 중복 문제"라고 부릅니다.
- N+1 문제: 쿼리 개수가 많아지는 문제
- 카테시안 곱 문제: 조인 결과가 중복으로 나타나는 문제
현재 Set 사용으로 중복은 해결했지만, 근본적으로는 쿼리 분리가 가장 깔끔한 해결책입니다
'Project > Team Project(딱좋은여행)' 카테고리의 다른 글
| N+1 문제 및 LAZY문제 (0) | 2025.09.16 |
|---|---|
| 서버 db에 값 미리 넣는 방법 (0) | 2025.04.29 |
| 트러블슈팅 - admin 빌드 오류 (0) | 2025.04.07 |
| 트러블슈팅 - queryDsl 오류 해결방법 (0) | 2025.04.04 |
| 항공 상품 필터 및 페이징 처리 (0) | 2025.03.22 |