본문 바로가기
JPA

N + 1 Query, 쿼리 호출 증가 JPA Batch Fetch Size로 방지하자

by Gil Granger 2020. 9. 23.

granger.tistory.com/48

 

Spring data jpa Lazy N+1 query / querydsl join 적용하기

일반적으로 불필요하게 리소스를 낭비를 하지 않기 위해 N : 1 or 1: N 관계에 LAZY로 설정합니다. 이에 대한 예시로 Member Entitiy 와 Group Entity로 나누었고, 서로 양방으로 참조하고 있다고 가정하겠습

granger.tistory.com

앞서 글을 통해 N+1 query가 발생되는 경우를 알아보았다.

 

JPA를 쓰다보면 의도치 않게 지연로딩에 의하여 더 많은 쿼리가 발생되어 조회가 된다.

 

이를 최적화 하기 위해 hibernate.default_batch_fetch_size, @BatchSize를 적용한다.

 

ex) Spring Boot, application.yml 파일에 hibernate.default_batch_fetch_size 설정

 

spring.jpa.properties.hibernate.default_batch_fetch_size

ex) BatchSize 설정

 

@OneToMany(fetch = FetchType.EAGER)
@Fetch(FetchMode.SELECT)
@BatchSize(size = 3) // Batch fetch size

 

 

 

이 설정을 사용하면 컬렉션이나, 프록시 객체 같은것을 한꺼번에 size 설정한 만큼 in 쿼리로 조회한다.

 

경험상 ToOne 관계는 최대한 FetchJoin 으로 활용하고 그외 OneToMany 같은 컬렉션 조회들은 batch_fetfh_size 를 통해서 성능적인 장점을 가져가는것이 좋다.

 

 

 

 

 

하이버네이트에서 Batch Fetching 에 대한 자세한 사항은 아래에서 자세하게 설명해주고 있다.

prasanthmathialagan.wordpress.com/2017/04/20/beware-of-hibernate-batch-fetching/

 

 

 

 

 

 

 

 


참고

 

vladmihalcea.com/hibernate-facts-multi-level-fetching

 

thorben-janssen.com/tips-to-boost-your-hibernate-performance/

'JPA' 카테고리의 다른 글

Spring Data JPA 에서 getOne 과 findById 차이점  (0) 2019.10.25
Spring data jpa Lazy N+1 query / querydsl join 적용하기  (0) 2019.10.12
JPA Lazy Loading  (0) 2019.08.06

댓글