JPA
N+1 문제
린예라
2024. 4. 2. 20:56
N + 1 문제란?
데이터 조회 쿼리(1번) + 조회하려는 데이터의 개수만큼 연관된 데이터를 조회하기 위한 추가 쿼리(N번)
ORM을 사용 할 때, 연관관계를 맺는 데이터(1:N 혹은 N:1)를 조회하면서 생길 수 있는 문제이다.
데이터 조회시 , 관련 데이터를 찾기 위해 여러번 조회해서 성능을 저하시키는 문제
발생원인
JPA에서 사용하는 언어인 JPQL언어는 연관관계 데이터를 무시하고 해당 데이터 기준으로 쿼리를 조회한다.
그렇기에 연관된 데이터가 필요하면 추가로 조회가 필요하게 되는 것이다.
해결방법
1.Fetch Join (쿼리 한번으로 관련 데이터를 처음부터 다 Join하여 가져오자)
JPQL에서 성능 최적화를 위해 제공하는 기능
Lazy Loading 사용
페이징 쿼리 사용 불가
Join문의 조건이 명확하지 않으면 중복된 데이터가 불러와짐(카테시안 곱) -> 중복제거를 위한 set, Distinct절 사용
2.BatchSize (연관된 데이터 조회시 지정된 사이즈만큼만 조회)
컬렉션 연관관계에서 Fetch Join의 문제점인 페이징을 사용할 수 없는 문제와, 한번에 하나만 Join가능한 문제를 해결함
3.FetchMode.SUBSELECT (쿼리를 2번에 나눠서 수행하자)
FetchType 을 EAGER로 설정해 두어야 함
4.Entity Graph (해당 데이터 불러올 때만 필요한 데이터 한번에 다 불러와)
지정한 필드명에 대해 Lazy Loading을 Eager Loading으로 부분적으로 전환하는 기능
outer join이 기본이기 때문에 중복문제가 있다.