JPA & Querydsl
QueryDsl을 사용하면서, fetchjoin()을 사용해야 할 때는 언제인가?
창따오
2025. 2. 25. 14:07
728x90
Projections.constructor(MemberDto.class, ...)를 사용하여 DTO로 필요한 필드만 조회할 때에는, 이런 경우에는 fetchJoin을 사용할 필요가 없습니다.
그 이유는 다음과 같습니다
- DTO로 필요한 필드만 조회하기 때문입니다.
fetchJoin은 일반적으로 엔터티를 조회할 때 지연 로딩을 방지하기 위해 사용됩니다.
하지만 현재 코드에서는 MemberDto에 매핑할 필드만 선택적으로 조회하고 있기 때문에,
엔터티 그래프를 탐색할 필요가 없습니다. - 엔터티를 조회하는 것이 아닙니다.
fetchJoin은 엔터티를 조회할 때만 의미가 있는 기능입니다.
그런데 지금 작성하신 쿼리는 MemberDto를 조회하는 것이므로,
영속성 컨텍스트와 관계없이 필요한 데이터만 가져오면 충분합니다. - 성능 최적화에도 불필요합니다.
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의 문제를 해결합니다.