페치조인과 페이징
- 컬렉션을 페치 조인하면 페이징이 불가능하다.
* 컬렉션을 페치 조인하면 일대다 조인이 발생하므로 데이터가 예측할 수 없이 증가한다.
- 일대다에서 일을 기준으로 페이징을 하는 것이 목적인데 데이터는 다를 기준으로 row가 생성된다.
- 이 경우 하이버네이트는 경고 로그를 남기고 모든 DB 데이터를 읽어서 메모리에서 페이징을 시도한다. 최악의 경우 장애로 이어질 수 있다.
한계 돌파
페이징 + 컬렉션 엔티티를 함께 조회하려면 어떻게 해야할까?
- ToOne(OneToOne, ManyToOne) 관계를 모두 페치조인한다.
ToOne관계는 row수를 증가시키지 않으므로 페이징 쿼리에 영향을 주지 않는다.
- 컬렉션은 지연로딩으로 조회한다.
- 지연 로딩 성능 최적화를 위해
hibernate.default_batch_fetch size
, @BatchSize
를 적용한다.
* hibernate.default_batch_fetch size
: 글로벌 설정
@BatchSize
: 개별 최적화
- 이 옵션을 사용하면 컬렉션이나 프록시 객체를 한꺼번에 설정한 size만큼 IN 쿼리로 조회한다.