Open Gunju-Ko opened 2 years ago
@ManyToOne
과 @BatchSize
@ManyToOne
과 @BatchSize
애노테이션을 아래와 같이 사용하면 하이버네이트는 지원하지 않는다. @ManyToOne
@BatchSize(size = 5)
private User owner;
@BatchSize
는 @OneToMany
, @ManyToMany
, 엔티티 클래스에만 적용이 가능하다. @Entity
@BatchSize(size = 5)
public class User {
...
}
@BatchSize
로 제어가 불가능하다.
N+1 문제
즉시 로딩과 N+1
특정 회원 하나를
em.find()
메소드로 조회하면 즉시 로딩으로 설정한 주문 정보도 함께 조회한다. 이 때 실행된 SQL을 보면 조인을 사용해서 한 번의 SQL로 회원과 주문 정보를 함께 조회한다. 하지만 JPQL을 사용할 때 문제가 발생한다.JPQL을 실행하면 즉시 로딩과 지연 로딩에 대해서 전혀 신경 쓰지 않고 JPQL만 사용해서 SQL을 생성한다. 이 때 N+1 문제가 발생한다.
회원 조회 SQL로 N명의 회원 엔티티를 조회하면, 각각의 회원 엔티티와 연관된 주문 콜렉션을 즉시 조회하기 위해 추가로 N번의 SQL을 실행한다. 이처럼 처음 실행한 SQL의 결과 수 만큼 추가로 SQL을 실행하는 것을 N+1 문제라 한다.
지연 로딩과 N+1
N+1 문제 해결
페치 조인 사용
하이버네이트
@BatchSize
@BatchSize
애노테이션을 사용하면 연관된 엔티티를 조회할 때 지정한 size 만큼 SQL의 IN 절을 사용해서 조회한다. 만약에 조회한 회원이 10명인데 size=5로 지정하면 2번의 SQL만 추가로 실행한다.하이버네이트
@Fetch(FetchMode.SUBSELECT)
@Fetch(FetchMode.SUBSELECT)
를 사용하면 연관된 엔티티를 조회할 때 서브 쿼리를 사용해서 N+1 문제를 해결한다.출처
참고하면 좋은글