N+1 문제란?
어떤 엔티티를 조회(1)할 때 그 엔티티에 연관된 또다른 엔티티의 갯수(N) 만큼 추가적인 조회(쿼리)가 발생하는 현상
* 1+N 이라고 칭하는 것이 보다 더 직관적이라고 여겨짐
즉, 하위 엔티티들을 첫 쿼리 실행 시 한번에 가져오지 않고 하위 엔티티별 개별적으로 쿼리가 실행되는 것
이 문제는 사용자가 늘어나고 트래픽이 증가했을 때 과장된 쿼리를 수행함으로써 DB 운영에 악영향을 끼칠 수 있다.
예시)
엔티티 Member와 Team이 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 |