-
N+1 쿼리 문제란?Java/Spring-JPA 2020. 7. 27. 11:47
N+1 쿼리 문제란?
1:N 관계인 두 엔티티가 있을 때, 1에 해당하는 엔티티를
N+1 in Lazy Loading
N+1 in Eager Loading
FetchType을 변경하는 것은 단지 N+1 발생 시점을 연관관계 데이터를 사용하는 시점으로 미룰지, 아니면 초기 데이터 로드 시점에 가져오느냐에 차이만 있는 것
N+1이 발생하는 이유?
JPQL 입장에서는 즉시 로딩, 지연 로딩과 같은 글로벌 패치 전략을 무시하고 JPQL만 사용해서 SQL을 생성합니다.
N+1 해결책 1 :: Fetch Join
가장 많이 사용하는 방법
페치 조인을 사용하게 되면 연관된 엔티티는 프록시가 아닌 실제 엔티티를 조회하게 되므로 연관관계 객체까지 한 번의 쿼리로 가져올 수 있습니다.
N+1 해결책 2 :: @BatchSize
BatchSize는 연관관계의 데이터 사이즈를 정확하게 알 수 있다면 최적화할 수 있는 size를 구할 수 있겠지만 사실상 연관 관계 데이터의 최적화 데이터 사이즈를 알기는 쉽지 않다.
N+1 해결책 3 :: @Fetch(FetchMode.SUBSELECT)
N+1 해결책 4 :: @EntityGraph
N+1 해결책 5 :: QueryBuilder
'Java > Spring-JPA' 카테고리의 다른 글
final Class는 왜 JPA Entity가 될 수 없을까? (0) 2021.01.31 JPA(Java Persistence Api) - 입문 (0) 2019.04.06 댓글