본문 바로가기

cs(with 매일메일)

[250918목] JPA의 N+1문제에 대해서 설명해주세요.

N+1문제란? 

: 연관 관계가 설정된 엔티티를 조회할 경우, 조회된 데이터 개수(N)개 만큼 연관관계의 조회 쿼리가 추가적으로 발생하는 현상

ex. 게시글 - 댓글 : 게시글 100개 조회시, 100개에 대한 댓글까지 추라 조회 쿼리가 날라감

 

 

 

글로벌 패치 전략별 N+1 문제 상황 설명

1. 즉시로딩 + findAll() : N+1 발생!

findAll()은 select u from User u 하는 JPQL구문을 생성하는게, JPQL은 글로벌 패치 전략을 고려하지 않고 쿼리를 실행한다. 즉, 모든 User를 조회하는 쿼리 실행 > 즉시로딩 설정을 보고 연관관계있는 모든 엔티티를 조회하는 쿼리 실행

 

2. 지연로딩 + findAll() : N+1 발생안하지만 추후에 발생 가능성 있음!

연관관계에 있는 엔티티를 실제 객체 대신에 프록시 객체를 생성하여 주입하기 때문. 하지만 프록시 객체를 사용할 경우, 실제 데이터가 필요하여 조회하는 쿼리가 발생하고 N+1문제가 발생할 수 있음.

 

 

 

N+1문제 해결 방법은? 

> 연관관계에 있는 엔티티를 즉시 로딩하자! 

1. fetch join 

2. @EntityGraph

 

=== 

글로벌 패치 전략이란? 엔티티끼리 연관관계가 있을때 데이터를 언제 불러올지 정하는 방법

 

✨기본 전략! 

  1. 기본은 지연로딩(LAZY) 사용
  2. 연관 엔티티를 반복문에서 사용할 예정이면 Fetch Join 사용
  3. 연관 엔티티를 안 쓸 거면 그냥 지연로딩으로 두기