참고로 DTO직접 조회를 더 도와주는 QueryDSL의 기능도 있다. 인터페이스만 이용해서 진행하는데, 이는 일반적으로 DTO Projection이라고 하는 듯 함.

내가 여기서 말한 DTO 직접조회는 JPQL constructor expression 이라고 한다.

페치조인이 항상 정답이진 않다.

  1. 페치조인은 연관되는 모든 엔티티의 모든 컬럼을 가져와야 한다.
  2. 모든 컬럼이란건, 결과에 필요하지 않은 다른 엔티티도 엔티티 구조상 연관되어있다면 그 녀석의 값들도 모두 가져와야 한다는 의미임.
  3. 모든 엔티티를 가져오려다 보니 쿼리가 복잡해지기도 한다. JQPL로는 그렇게 복잡해보이지 않을 수 있지만 실제 생성되는 쿼리는 꽤나 복잡할 수도 있음.

그럼 이 둘의 선택 기준은 굳이 정하자면?

Vlad Mihalcea가 (누군지는 잘…) 강조하는 원칙은, 조회와 동일한 트랜잭션에서 엔티티를 수정할 계획이 있을때는 엔티티 전체를 가져오는게 의미가 있지만, 단순 조회만 할거라면 차라리 dto로 직접 조회하는게 더 저렴할 수 있다는 것임.

페치조인이 가장 간단한 해결책 같아보여도, 다음의 경우에는 dto로 직접 조회하는걸 고민해보자.

  1. 자주 호출되는 쿼리이다.
  2. 페치조인으로 가져오는 컬럼중에 text, blob등 무거운 컬럼이 섞여있다.