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)
'Back-end > JPA' 카테고리의 다른 글
[JPA] 더티 체킹(Dirty Checking) 이란? (0) | 2022.03.08 |
---|---|
[JPA] Fetch Type란? (0) | 2021.11.22 |
[JPA] JPA Propagation 전파 단계 (0) | 2021.11.22 |
[JPA] JPA 영속성 컨텍스트의 이점 5가지 (0) | 2021.11.22 |
[JPA] JPA를 사용하는 이유 (0) | 2021.11.22 |