JPA에서 N+1 해결책인 Fetch Join을 사용할 시 만나는 문제 상황이다.

2개 이상의 자식 테이블(OneToMany) Fetch Join을 하기 되면 MultipleBagFetchException 예외가 발생한다.

기본적으로 JPA Fetch Join의 조건은 아래와 같다.

Batch Size 옵션

해결 방법으로는, 하이버네이트의 default_batch_fetch_size옵션이 있다.

해당 옵션은 MultipleBagFetchException 예외는 없앨 수 있지만, N+1 문제를 완전히 해결할 수는 없고, 최대한 회피할 수 있는 방법이다.

N+1 문제가 발생하는 이유는, 부모 엔티티의 Key 하나씩 자식 엔티티에 조회하는 데 사용하기 때문이다.

이를 부모 엔티티의 Key를 하나의 In절로 묶어서 자식 테이블 조회에 where 절로 사용하면 어느정도 해소가 가능할 것이다.

이러한 개념을 사용한 것이 default_batch_fetch_size옵션이다. 옵션에 지정한 개수만큼 In절에 부모 엔티티의 Key를 사용하게 되는 것이다.

spring:
	jpa:
		properties:
			hibernate:
				default_batch_fetch_size: 50

부모 엔티티에 자식 엔티티 하나가 존재하고, 부모 엔티티 100개를 조회 한다면