Jpa에서 N + 1 문제를 해결하기 위해서 많이 사용되는 @BatchSize
를 전역적으로 적용시킬 수는 없을까?
이 어노테이션을 사용하면, N + 1 쿼리를 SELCT , IN 쿼리 두개로 대체 할 수 있다.
이 어노테이션에 명시된 숫자 만큼 IN 쿼리가 발생한다. 즉 100개가 설정되었는데, 200개의 레코드를 조회한다면 IN 쿼리가 두번 발생한다.
결과적으로 서버의 메모리 사용량은 같으나, 데이터 베이스의 부하를 제어할 수 있다.
기본적으로는 다음과 같이 필드에 적용할 수 있다.
@BatchSize(size = 100)
@OneToMany(mappedBy = "order", cascade = CascadeType.ALL)
private List<OrderItem> orderItems = new ArrayList<>();
하지만 전역적으로 적용할 수도 있는데
# application.yml
spring:
jpa:
hibernate:
default_batch_fetch_size: 100
이렇게 적용해도 된다.
보통 100 ~ 1000개 정도를 지정하라는 가이드가 있긴 하다.