JPA의 N + 1 문제
●JPA의 N + 1 문제
●findAll 메서드의 글로벌 패치 전략 별 N + 1 문제 상황
spring data jpa에서 제공하는 repository의 findAll 메서드
글로벌 패치 전략을 즉시로딩으로 설정하고 findAll()을 실행하면 N + 1 문제가 발생하며, 이는 findAll()은 select u from User u라는 JPQL 구문을 생성해서 실행하기 때문이며, JPQL은 글로벌 패치 전략을 고려하지 않고 쿼리를 실행하며, 모든 User를 조회하는 쿼리 실행 후, 즉시로딩 설정을 보고 연관관계에 있는 모든 엔티티를 조회하는 쿼리를 실행
글로벌 패치 전략을 지연 로딩으로 설정하고 findAll()을 실행하면 N + 1 문제가 발생하지 않으며, 이는 연관관계에 있는 엔티티를 실제 객체 대신에 프록시 객체로 생성하여 주입하기 때문이며, 하지만 프록시 객체를 사용할 경우에 실제 데이터가 필요하여 조회하는 쿼리가 발생하고 N + 1 문제가 발생할 수 있음
●N + 1 문제는 어떻게 해결할 수 있을까?
select distinct u
from User u
left join fetch u.posts
@EntityGraph(attributePaths = {"posts"}, type = EntityGraphType.FETCH)
List<User> findAll();