'N+1 problem'이란, N개의 엔티티 쿼리 조회 시 연관되는 쿼리 1개가 추가적으로 조회되는 상황(1개 쿼리 조회 + 연관 쿼리 N개 조회)을 일컫는 말이다.
예를 들면, Inquiry 목록 조회 시 Inquiry와 연관된 InquiryFile 쿼리가 추가로 조회되는 것이다.
이렇게 불필요하게 쿼리가 추가적으로 조회되면 DB의 성능 저하로 이어지게 된다.
대표적인 해결 방법은 @EntityGraph(페이징 가능), JOIN FETCH(페이징 불가), @BatchSize가 있다.
만약, 연관 엔티티를 함께 로딩하며 페이징 지원을 원한다면 JOIN FETCH보단 @EntityGraph를 사용하면 된다.
또한, Hibernate의 @BatchSize를 활용해 Lazy 로딩 시 SELECT 쿼리의 배치 크기를 조절하여 N+1 문제를 완화할 수 있다.
다만, @BatchSize는 Hibernate 전용 기능이며 JPA 표준은 아님에 주의가 필요하다.
EntityGraph는 잘 설계된 경우 성능 향상을 기대할 수 있으나, 무분별한 fetch depth 설정 시 성능 저하 가능성이 있다는 점에 유의해야 한다.
'Archive > 예전 TIL' 카테고리의 다른 글
| [트러블슈팅] @Controller vs @RestController, 404 에러 & 정상 동작 차이 (0) | 2025.06.28 |
|---|---|
| [트러블슈팅] MyBatis Mapper가 Bean으로 등록되지 않는 런타임 에러 해결 (0) | 2025.06.28 |
| JPA 쿼리를 활용한 성능 개선 (0) | 2025.02.18 |
| ADMIN 권한 검증 시 에러 문제 (0) | 2025.02.11 |
| 토큰 매개 변수 이름과 HTTP 헤더 값 충돌 (0) | 2025.01.22 |