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로 중복 방지)