- 예시
( X To Many 관계인 경우 Many 부분에도 fetch 조인을 해줘서, Many엔티티의 데이터를 조인해줘야된다)
- 📍 X To Many를 패치 조인을 하면 페이징 처리가 안된다.
(페이징 처리 사용 X)- 컬렉션 패치 조인은 1개만 사용할수있다. X To Many -> Many는 사용 X
- 문제점 : 데이터쿼리가 Many 데이터 만큼 쿼리가 증가한다 (뻥튀기)
- 해결 :
select
쿼리문에distinct
사용
- ✔ distinct : DB에 distinct 키워드를 날려주고, 루트 (from)에 중복인 경우에 중복을 걸러서 컬렉션에 담아준다.
- X To Many 예시 (컬렉션을 조회시 페이징 처리)
( 패치조인이 된 To One 관계를 먼저 해주면서 페이징 처리를한다)
- 그런다음
hibernate.default_batch_fetch_size
(yml, properties) 하이버 네이트의 batch_fetch_size를 최적화 설정해줘야된다.
- 쿼리 호출 수가 1 + N 에서 1 + 1로 최적화가 된다.
- 컬렉션 패치 조인은 페이징이 불가능 하지만, 이 방법은 페이징처리가 가능하다.
To One 관계는 패치 조인해도 페이징에 영향을 주지 않는다, 따라서 To One 관계는 패치 조인으로 쿼리 수를 줄이고 해결하고, 나머지는
hibernate.default_batch_fetch_size
로 최적화 하자