JPA N+1문제

‍bng4535·2023년 4월 3일
0

N+1 문제란

  • 요청이 1개의 쿼리로 처리 되길 기대했는데 N개의 추가 쿼리가 발생하는 현상

지연(Lazy) 로딩

  • 엔티티를 조회할 때 사용할 때까지 데이터 로딩을 미루는 현상

JPQL(Java Persistence Query Language)

  • 엔티티를 대상으로 쿼리 작성

Fetch join

  • 연관된 엔티티나 컬렉션을 한 번에 조회하는 기능
  • 연관된 엔티티까지 영속성 컨텍스트에 전부 올림
	@Query("select c from 크루 c left join fetch c.목록")
    List<크루> findAllJPQLFetch(); 

즉시(Eager) 로딩

  • 즉시 로딩 또한 N+1문제가 발생한다.
  • 처음 쿼리 만들 때 크루에 연관관계에 있는 엔티티는 신경쓰지 않고, 조회 대상이 되는 Entity기준으로만 쿼리를 만들기 때문

Fetch join의 문제

  • OneToMany 관계에서 페이징 처리할 때 DB는 OFFSET과 LIMIT을 사용하므로 원하는 결과와 다르거나 데이터 누락이 발생

  • 따라서 데이터 전체를 메모리에 가져와서 페이지를 처리하는 방식이므로 메모리에 큰 부하

  • 이 문제 해결법

    • BatchSize
    • @ManyToOne일 때 페이징 처리를 해라
profile
공부 기록

0개의 댓글