작성
·
130
0
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? 예
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예
3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예
[질문 내용]
해당 강의에서 5:35초를 보시게 되면, 원래는 fetch join이 아닌 join이지만
public List<OrderSimpleQueryDto> findOrderDtos() {
return em.createQuery(
"select new jpabook.jpashop.repository.OrderSimpleQueryDto(o) " +
" from Order o" +
" join fetch o.member m" +
" join fetch o.delivery d", OrderSimpleQueryDto.class
).getResultList();
}
fetch join을 하게 되면 v3메서드와 동일한 결과가 나옴과 동시에 쿼리문도 동일하게 1개가 출력된 것을 확인하였습니다.
여기서 드는 의문점은
' fetch join은 select절에 entity가 아닌 DTO를 명시하게 되면 안된다' 즉, 'fetch join은 select절에 entity만을 명시해야 한다' 라고 질문 글을 찾아보며 알게되었습니다. 하지만 결과는 예상과 다르게 잘 작동하여 의문이 들게 되었습니다.
답변 2
0
안녕하세요, 인프런 AI 인턴입니다. springYam님께서 제기하신 질문에 대해 답변드리겠습니다.
Fetch Join과 DTO 조회
JPA에서 fetch join은 실제 엔티티를 select하는 경우에 사용됩니다. 이는 엔티티 그래프를 한 번의 쿼리로 가져와서 모든 연관된 엔티티를 한 번에 조회하려는 목적입니다. 따라서 일반적으로 fetch join은 DTO를 직접 조회하게 되었을 경우에는 적합하지 않습니다. DTO를 조회하기 위해서는 em.createQuery()의 select 절에서 엔티티 대신 DTO를 명시하고, 단순 join을 활용하는 것이 일반적입니다.
의문 해결: 왜 동작했는가?
springYam님이 작성하신 코드에서 결과가 제대로 나오는 것은, select 절 내부에 있는 엔티티 필드를 DTO로 매핑하여 수동적으로 처리했기 때문일 수 있습니다. fetch join은 데이터베이스 테이블을 기반으로 하여 조인을 수행하며, 이 과정에서 불필요한 데이터를 로딩하지 않고 필요한 데이터를 효율적으로 가져옵니다. 그러나 fetch join을 통해 가져온 데이터를 DTO로 처리할 때는 엔티티 매니저가 이를 자동으로 처리할 수 없어 제한된 경우로 동작하게 됩니다.
다른 참고 자료
fetch join과 일반 join의 사용 차이점과 결정적인 단점 - 일반 join이 어떻게 작용하는지를 보실 수 있습니다.
@QueryProjection과 Querydsl 사용 사례 - 앙상블을 사용하여 Dto로 변환하는 경우에 대한 설명입니다.
적절한 방식으로 JPA와 DTO 매핑을 사용하는 것이 성능 최적화에 중요합니다. 추가적으로 궁금한 점에 대해서도 언제든지 질문해 주세요. 답변을 통해 필요한 정보를 충분히 얻으셨으면 좋겠습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.