/store/detail
페이지 접근 시 상품 리스트가 중복되어 출력되는 UI 오류 발생LEFT JOIN FETCH
로 인한 카티전 곱SELECT s FROM Store s
LEFT JOIN FETCH s.products
LEFT JOIN FETCH s.images
WHERE s.uuid = :id
해당 Store에:
위 쿼리는 내부적으로 3 × 2 = 6
개의 행을 반환
결과적으로 같은 상품이 이미지 수만큼 반복되어 조회됨
상품 A, 상품 A, 상품 B, 상품 B, 상품 C, 상품 C
1. 상품 전용 쿼리
SELECT s FROM Store s
LEFT JOIN FETCH s.products
WHERE s.uuid = :id
2. 이미지 전용 쿼리
SELECT s FROM Store s
LEFT JOIN FETCH s.images
WHERE s.uuid = :id
항목 | 적용 전 | 적용 후 |
---|---|---|
조회된 결과 row 수 | 6 | 1 (각 컬렉션 별) |
상품 중복 | 있음 (N × M) | 없음 |
프론트 렌더링 | 상품이 2~3회 반복 | 상품 1회만 표시 |
구조 유지보수성 | JOIN 수 증가로 복잡 | 로직 분리로 명확 |
select store0_.id, product1_.id, image2_.id ...
-- 결과 row: 6
-- Query 1
select store0_.id, product1_.id ...
-- Query 2
select store0_.id, image2_.id ...
-- 결과 row: 각각 3, 2
항목 | 기대 | 실제 |
---|---|---|
중복 상품 제거 | O | O |
이미지 정상 출력 | O | O |
DB 부하 | 감소 (JOIN 복잡도 ↓) | O |
JPA 사용 시 다중 컬렉션 Fetch Join은 주의가 필요
쿼리 분리 전략은 유지보수 및 성능 관점에서 유리
향후 복잡한 관계는 @BatchSize
, @EntityGraph
등의 대안도 고려