Archive/예전 TIL

JPA: N+1 문제란?

khu2172 2025. 5. 16. 01:50

'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 설정 시 성능 저하 가능성이 있다는 점에 유의해야 한다.