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

박연주·2023년 5월 2일
0

JPA

목록 보기
7/8

N+1 쿼리 문제란?

  • 연관 관계가 설정된 엔티티를 조회할 경우에 조회된 데이터 갯수(n) 만큼 연관관계의 조회 쿼리가 추가로 발생하여 데이터를 읽어오는 현상

해결 방안

  1. Fetch Join
  • JPQL을 사용하여 DB에서 데이터를 가져올 때 처음부터 연관된 하위 데이터까지 같이 가져오게 하는 방법 → 불필요한 쿼리문이 추가되는 단점 존재
  1. @EntityGraph
  • @EntityGraph(attributePaths = “조회할 엔티티”) 쿼리 수행시 바로 가져올 필드명, 엔티티를 설정하면 eager 조회가능
  1. BatchSize
  • N+1 문제가 안일어나게 하는 방법보다는 발생하더라도 in 절에 묶어 한번만 더 조회하는 방식으로 성능 최적화 가능


총정리

  • 연관관계 조회시 Lazy 로딩을 사용하고 성능최적화가 필요한 부분에서는 Fetch 조인을 사용하자. 또한 Batch Size의 값을 1000 이하로 설정하자
- 컬렉션을 페치 조인하면 페이징이 불가능
- 해결방법
    1. ToOne 관계를 모두 페치 조인 (row수를 증각시키지 않으므로 페이징 쿼리에 영향 없음) - Member, Delivery
    2. 컬렉션은 지연로딩으로 조회 - OrderItem
    3. 지연 로딩 성능 최적화를 위해 Batch Size를 적용 (개별 최적화 @BatchSize)
    → 컬렉션이나 프록시 객체를 한꺼번에 설정한size만큼 in 쿼리로 조회
    
    





Reference

https://programmer93.tistory.com/83
by 향로 - https://jojoldu.tistory.com/165
좀 더 자세한 N+1 발생 이유 - https://dev-coco.tistory.com/165
join과 Fetch join 차이 - https://cobbybb.tistory.com/18

profile
하루에 한 개념씩

0개의 댓글