본문 바로가기
JPA

[JPA] N+1 문제 및 해결방안

by Dev_Green 2022. 10. 11.

N+1 문제란?

어떤 엔티티를 조회(1)할 때 그 엔티티에 연관된 또다른 엔티티의 갯수(N) 만큼 추가적인 조회(쿼리)가 발생하는 현상

* 1+N 이라고 칭하는 것이 보다 더 직관적이라고 여겨짐

즉, 하위 엔티티들을 첫 쿼리 실행 시 한번에 가져오지 않고 하위 엔티티별 개별적으로 쿼리가 실행되는 것

이 문제는 사용자가 늘어나고 트래픽이 증가했을 때 과장된 쿼리를 수행함으로써 DB 운영에 악영향을 끼칠 수 있다. 

 

예시) 

엔티티 MemberTeam이 ManyToOne 관계이고

객체 team1에 member1, member2, member3가 속해있는 상태다.

이때 team1을 조회하면 member1, member2, member3에 대한 조회도 자동적으로 이루어진다.

 

지연 로딩(LAZY)이든 즉시 로딩(EAGER)이든 N+1 문제는 발생한다

1. Fetch 모드를 EAGER(즉시 로딩)으로 한 경우

team1을 조회했을 때 바로 N+1 문제 발생하며 member1, member2, member3에 대한 쿼리들이 수행된다

 

2. Fetch 모드를 LAZY(지연 로딩)으로 한 경우

team1을 조회했을 때 team1에 대한 쿼리만이 수행된다

하지만 team1을 통해 member1을 탐색하려고 하면 member1에 대한 쿼리가 수행된다

 

즉, N+1 문제가 발생되는 시점만 다를 뿐 즉시 로딩이든 지연 로딩이든 문제는 발생한다

 

해결 방안

1. Join Fetch

조회 시 함께 가져오고 싶은 엔티티 필드를 지정(JOIN FETCH t.members)한다

@Query("SELECT t FROM Team t JOIN FETCH t.members")
List<Team> findAllJoinFetch();

'JPA' 카테고리의 다른 글

[JPA] JPA의 Entity에 기본 생성자가 필수인 이유  (0) 2023.12.17
JPQL(객체지향 쿼리 언어)  (0) 2022.10.04