JPA N+1 문제!

Y39·2023년 4월 1일
0

toBeProgrammer

목록 보기
72/88

N+1 문제란?

요청이 1개의 쿼리로 처리되길 원했는데 N개의 쿼리가 발생

OneToMany일때

지연(Lazy) 로딩이란?

  • 외래관계에 있는 객체를 proxy로 미리 채워놓고 나중에 가져오는 것.

Lazy와 N+1

  • 만약 외래관계의 size()를 호출한다면?
  • row마다 외래관계가 존재하는지 select문이 실행됨 =>N+1
  • 해결법
    • Fetch join
      : 연관 엔티티를 한번에 가져오는 것
    @Query("select c from 테이블 c left join fetch c.목록")
    List<엔티티> findAllFetch();

즉시(Eager)로딩일때

  • JPA는 조회 대상이 되는 Entity 위주의 쿼리문을 생성
  • 후에 연관 Entity가 있다는걸 알고 fetch 전략을 확인
  • 다시 연관 Entity를 가져오는 쿼리문을 실행 => N+1

fetch join은 만능인가?

  • 문제 상황: OneToMany 관계의 페이징
    • 페이징에서 가져오길 원하는 수는 고정됨
    • 하지만 fetch join은 limit 없이 모든 데이터를 가져옴
    • 메모리에서 모든 데이터를 페이징 만큼 가져옴
    • 메모리 부하가 걸릴 수 있음
      => 해결 방법: fetchSize를 설정
profile
System.out.print("Bold")

0개의 댓글