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

kate님의 프로필 이미지
kate

작성한 질문수

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

간단한 주문 조회 V3: 엔티티를 DTO로 변환 - 페치 조인 최적화

Order의 전체조회를 할때 조회타입 생략이 가능한가요?

작성

·

187

0

실수로 생략하고 실행했는데 조회는 정상적으로 작동합니다.

타입을 지정해야하는 상황과 지정하지 않아도 되는 상황을 예시로 명확히 설명해주실 수 있을까용?

답변 1

0

안녕하세요. kate님, 공식 서포터즈 y2gcoder입니다.

제가 kate님의 질문을 잘 이해했는지 모르겠습니다.

제가 이해한 바에 따르면 OrderRepository에서

public List<Order> findAllWithMemberDelivery() {
    return em.createQuery(
        "select o from Order o" +
            " join fetch o.member m" +
            " join fetch o.delivery d", Order.class)
        .getResultList();
}

강의 자료에는 위와 같이 되어있는 것을

public List<Order> findAllWithMemberDelivery() {
    return em.createQuery(
        "select o from Order o" +
            " join fetch o.member m" +
            " join fetch o.delivery d")
        .getResultList();
}

이런 식으로 구현하셨고 그대로 실행해봤을 때 정상적으로 작동하셨다는 것으로 이해했습니다.

그래서 이 결과를 보고

타입을 지정해야하는 상황과 지정하지 않아도 되는 상황을 예시로 명확히 설명해주실 수 있을까용?

위와 같은 의문이 들어 질문을 주셨다고 이해했습니다.

먼저 EntityManager의 createQuery() 메서드는 엔티티 클래스와 같은 반환타입을 지정해주면 반환 타입이 TypeQuery 인터페이스이고, 지정해주지 않으면 Query 인터페이스를 반환합니다. 거기서 .getResultList()를 붙이면 최종 반환타입은 각각 List<Entity> / List<Object>가 되는 것으로 알고 있습니다. 그래서 혹시 밑에 반환 타입을 지정하지 않고 만든 코드에서 캐스팅하라는 IDE의 경고가 뜨지는 않았는지 개인적으로는 궁금합니다.

kate님의 질문으로 돌아가서 TypeQuery는 반환 타입이 명확할 때, Query는 반환 타입이 명확하지 않을 때 사용하기에 적절합니다. 개인적으로는 명확한 것을 좋아해서 TypeQuery를 사용하는 편이고, 그래서 반환 타입을 가급적 넣어주려고 노력합니다. Query 타입으로 반환이 필요할 때는 아마 JPQL을 통해 조회를 하되 엔티티 자체를 조회하기보단 엔티티의 일부 속성 값들(2개 이상)을 조회하는 JPQL을 사용할 때 사용할 것 같습니다.

감사합니다.

kate님의 프로필 이미지
kate

작성한 질문수

질문하기