본문 바로가기

카테고리 없음

N+1문제

1번 조회해야할 것을 N개 종류의 데이터 각각을 추가로 조회하게 되서 총 N+1번 DB조회를 하게 되는 문제

 - 주로 @ManyToOne 연관관계를 가진 엔티티에서 주로발생하며, 1:N 또는 N:1에서 발생

 - 즉시로딩의 경우 N+1바로발생

 - 지연로딩의경우 하위 인티티를 다시 조회하는 경우 발생

 

해결방법

 1. FetchJoin

 - DB에서 데이터 가져올시 엔티티나 컬렉션을 같이 조회하는 방법

@Query("select u from User u join fetch u.order")
List<User> findAll();

 - 중복 문제가 발생할 수있다.

 - 중복데이터를 제거하기위해 DISTINCT를 사용

@Query("select distinct u from User u join fetch u.order")
List<User> findAll();

 - JPA에서 제공하는 Pageable이 사용불가하지만 batch size로 해결가능

 - 1:N광계가 2개인 엔티티를 패치조인 사용 불가

 

 2. EntityGraph 어노테이션

 - EntityGraph상에 있는 Entity들의 연관관계에서 필요한 엔티티 컬렉션을 함께 조회 할때 사용

 - outer join 발ㅅ사용

 - 즉시로딩조회로 가져오게 됨

@EntityGraph(attributePaths = {"order"})
List<User> findAllEntityGraph();

 - fetch join같이 매번 쿼리를 작성하고 확인하지 않아도 된다

 - 중복데이터 발생할수있어서 (Set, distinct로 중복 방지)