본문 바로가기
JPA & Querydsl

QueryDsl을 사용하면서, fetchjoin()을 사용해야 할 때는 언제인가?

by 창따오 2025. 2. 25.
728x90

Projections.constructor(MemberDto.class, ...)를 사용하여 DTO로 필요한 필드만 조회할 때에는, 이런 경우에는 fetchJoin을 사용할 필요가 없습니다.

그 이유는 다음과 같습니다

  1. DTO로 필요한 필드만 조회하기 때문입니다.
    fetchJoin은 일반적으로 엔터티를 조회할 때 지연 로딩을 방지하기 위해 사용됩니다.
    하지만 현재 코드에서는 MemberDto에 매핑할 필드만 선택적으로 조회하고 있기 때문에,
    엔터티 그래프를 탐색할 필요가 없습니다.
  2. 엔터티를 조회하는 것이 아닙니다.
    fetchJoin은 엔터티를 조회할 때만 의미가 있는 기능입니다.
    그런데 지금 작성하신 쿼리는 MemberDto를 조회하는 것이므로,
    영속성 컨텍스트와 관계없이 필요한 데이터만 가져오면 충분합니다.
  3. 성능 최적화에도 불필요합니다.
    fetchJoin은 여러 엔터티를 한 번에 가져와 N+1 문제를 해결할 때 주로 사용됩니다.
    그러나 현재는 DTO 변환을 위해 필요한 필드만 가져오고 있어서,
    fetchJoin 없이도 효율적으로 데이터를 조회할 수 있습니다.

언제 fetchjoin을 사용해야 할까?

queryFactory.selectFrom(member)
    .join(member.team, team).fetchJoin()
    .where(searchPredicate(cond))
    .fetch();

 

결론 :  Member 엔터티 자체를 조회하면서 Team도 함께 로딩해야 한다면,
다음과 같이 fetchJoin()을 사용해야 합니다. Entity 자체를 조회할 때, fetchjoin()을 사용하여, N+1의 문제를 해결합니다.