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 |
댓글