본문 바로가기

Back-end/JPA

[JPA] N+1 문제가 발생하는 이유와 해결 방법

N+1 쿼리 JPA의 프록시로 인한 지연 로딩 때문에 발생합니다.

정확한 의미는 1개의 쿼리를 실행했을 때, 내부에 존재하는 컬렉션들을 조회해오면서 생기는 문제입니다.

 

  1. 즉시 로딩으로 데이터를 가져오는 경우
  2. 지연 로딩으로 데이터를 가져온 이후가져온 데이터에서 하위 엔티티를 다시 조회하는 경우

 

기본적으로 되도록이면 @OneToMany의 매핑을 하지 않을 수 있다면 하지 않는 것이 최고의 예방책입니다.

 

 

해결 방법

  1. Fetch Join
    JPQL의 join Fetch를 사용합니다. (inner join)
    쿼리 한 번으로 해결할 수 있습니다.

  2. FetchType = LAZY -> EAGER
    ManyToOne, OneToOne의 FetchType = LAZY -> EAGER 변경

  3. @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