인프런 커뮤니티 질문&답변

springYam님의 프로필 이미지

작성한 질문수

실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화

간단한 주문 조회 V4: JPA에서 DTO로 바로 조회

간단한 주문 조회 V4 : JPA에서 DTO로 바로 조회에 대한 질문

24.10.17 22:26 작성

·

26

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

1

김영한님의 프로필 이미지
김영한
지식공유자

2024. 10. 20. 15:21

안녕하세요. springYam님

fetch join은 select절에 entity만을 명시해야 한다라는 의미는

select o.id, m.name과 같이 필드를 직접 적으로 적는 것이 안된다는 의미입니다.

적어주신 예제와 같이 o 엔티티를 직접 넘기는 경우에는 사용이 가능할 수도 있습니다.

다만 이 경우에 o 엔티티를 직접 넘기는 것 보다는 o.id, m.name과 같이 필드를 직접 적어서 매핑하는 것이 조회하는 컬럼도 더 적기 때문에 성능에서 더 효과적입니다.

감사합니다.

0

인프런 AI 인턴님의 프로필 이미지

2024. 10. 17. 22:31

안녕하세요, 인프런 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로 처리할 때는 엔티티 매니저가 이를 자동으로 처리할 수 없어 제한된 경우로 동작하게 됩니다.

다른 참고 자료

  1. fetch join과 일반 join의 사용 차이점과 결정적인 단점 - 일반 join이 어떻게 작용하는지를 보실 수 있습니다.

  2. @QueryProjection과 Querydsl 사용 사례 - 앙상블을 사용하여 Dto로 변환하는 경우에 대한 설명입니다.

적절한 방식으로 JPA와 DTO 매핑을 사용하는 것이 성능 최적화에 중요합니다. 추가적으로 궁금한 점에 대해서도 언제든지 질문해 주세요. 답변을 통해 필요한 정보를 충분히 얻으셨으면 좋겠습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.