EntityGraph
와 FetchType.EAGER
에 대해 발생되는 쿼리를 비교하던 도중, 이상한 현상이 일어났다.
서로 같은 개수의 SELECT 쿼리를 발생시킬 줄 알았지만, 상황마다 달랐다.
그래서 다시 알아본 결과, 필자는 LAZY
와 EAGER
에 대해 잘못 이해하고 있었다.
그것에 대해 다시 알아보는 시간을 가져보겠다.
FetchType.LAZY
- 엔티티를 조회할 시, 연관 관계가 적용된 엔티티는 프록시로 가져오는 옵션
- 실제로 엔티티가 사용됐을 때, 조회 쿼리를 실행시킨다.
FetchType.EAGER
- 엔티티를 조회할 시, 연관 관계가 적용된 엔티티도 동시에 들고오는 옵션
- 단, 2개 이상의 연관 엔티티가 존재할 시, 예외가 발생한다.
- EAGER는 되도록 join을 사용해서 한번에 가져오려고 노력한다.
EAGER를 사용하면 무조건 join을 통해 단 하나의 쿼리만 발생시키는가?
- 꼭 그렇지는 않다.
- 부모 엔티티를 조회한 뒤, 즉시 자식 엔티티를 조회하는 방식으로 작동될 수도 있다.
- 즉, 조회 쿼리가 두 번 나갈 수도 있다.
참조
https://mighty96.github.io/til/fetch_fetchjoin/