Back-end/JPA
[JPA] N+1 문제가 발생하는 이유와 해결 방법
호비_hobi
2021. 11. 22. 15:38
N+1 쿼리는 JPA의 프록시로 인한 지연 로딩 때문에 발생합니다.
정확한 의미는 1개의 쿼리를 실행했을 때, 내부에 존재하는 컬렉션들을 조회해오면서 생기는 문제입니다.
- 즉시 로딩으로 데이터를 가져오는 경우
- 지연 로딩으로 데이터를 가져온 이후에 가져온 데이터에서 하위 엔티티를 다시 조회하는 경우
기본적으로 되도록이면 @OneToMany의 매핑을 하지 않을 수 있다면 하지 않는 것이 최고의 예방책입니다.
해결 방법
- Fetch Join
JPQL의 join Fetch를 사용합니다. (inner join)
쿼리 한 번으로 해결할 수 있습니다. - FetchType = LAZY -> EAGER
ManyToOne, OneToOne의 FetchType = LAZY -> EAGER 변경 - @EntityGraph
@EntityGraph의 attributePaths에 쿼리 수행 시 바로 가져올 필드명을 지정하면 한 쿼리에 대해서만
Lazy가 아닌 Eager 조회로 가져오게 됩니다. (Outer join)