N + 1 문제란?


N + 1 문제는 즉시 로딩과 지연 로딩 전략 각각 상황에서 발생할 수 있다. 하위 엔티티들이 존재하는 경우 한 쿼리에서 모두 가져오는 것이 아닌, 필요한 곳에서 각각 쿼리가 발생하는 경우를 의미한다.

즉시 로딩에서 발생하는 이유는 JPQL 을 사용하는 경우 전체 조회를 했을 때, 영속성 컨텍스트가 아닌 DB 에서 직접 데이터를 조회한 다음 즉시 로딩 전략이 동작하기 때문이다.

지연 로딩에서 발생하는 이유는 지연 로딩 전략을 사용한 하위 엔티티를 로드할 때 JPA 에서 프록시 엔티티를 실체화할 때 해당 엔티티를 조회하기 위해 추가적인 쿼리가 실행되기 때문이다.

해결 방법


Fetch Join

JPQL 의 join fetch 를 사용하여 연관된 엔티티를 한 번에 모두 가져온다.

@EntityGraph

@BatchSize