- 페치 조인 대상에는 별칭을 줄 수 없다.
- 하이버네이트는 가능하지만 가급적 X
- 별칭 줘서 where에 걸러서 가져올 수 없다.
- 그럴려면 페치 조인이 아니라 따라 조회해야 한다.
- 모든 데이터를 가져와야 한다.
- 객체 그래프는 기본 적으로 데이터를 전부 조회해야 한다.
- 필요한 경우 팀에서 멤버를 조회하면서 거르면 안되고 처음부터 멤버만 따로 걸러서 조회해야 한다.
- 둘 이상의 컬렉션은 페치 조인 할 수 없다.
- 일대다도 데이터가 뻥튀기 되는데 일대다대다가 되면 위험해 진다.
- 컬렉션을 페치 조인하면 페이징 API를 사용할 수 없다.
- 일대다, 다대일은 가능하다.
- 하이버네이트는 경고 로그를 남기고 메모리에서 페이징 (매우위험)
- 페이징 쿼리없이 데이터를 전부 가져와서 메모리에서 페이징 한다!
- 페이징을 죽어도 가야되면 fetch 빼고 lazy 로딩해라 1 + N으로
- 몇가지 방법이 있는데 BatchSize 어노테이션을 사용한다. 멤버를 한번에 미리 몇 개 가져올 수 있다.
- 글로벌 세팅을 할 수도 있다.
hibernate.jpa.fetch_size = 100
이런 식
- JPA 책 성능최적화 쪽에 있다.
- DTO를 써서 쿼리 직접 짜는 방법도 있다. new 연산자로 select
정리
- 실무에서 글로벌 로딩 전략은 모두 지연 로딩
- 최적화가 필요한 곳은 페치 조인
- 모든 것을 페치조인으로 해결할 수는 없다.
- 객체 그래프를 유지할 때 사용하면 효과적
- 여러 테이블을 조회해서 엔티티 모양이 아닌 전혀 다른 결과를 내야 하면, 페치 조인 보다는 일반 조인을 사용하고 필요한 데이터들만 조회해서 DTO로 반환하는 것이 효과적