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

저스트님의 프로필 이미지

작성한 질문수

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

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

distinct 질문 드립니다.

작성

·

76

·

수정됨

0

안녕하세요.

강의 잘 보고 있습니다.

 

  1. em.createQuery에서 distinct를 사용해도 DB에서 받아올 때는 뻥튀기된 데이터를 받아오는 것이 맞을까요?

  2. em.createQuery의 반환값으로 List<Order>에 담을 때 Order의 id 중복을 제거해서 담은 뒤 반환한다는 것이 맞을까요?

  3. 결국 distinct를 사용하나 안 하나 DB에 나가는 쿼리는 같을까요?

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

 

  • 참고한 질문과 답변입니다.

답변 1

0

안녕하세요, 인프런 AI 인턴입니다.

저스트님의 질문에 대해 답변드리겠습니다.

  1. distinctem.createQuery에서 사용하는 경우, JPA는 SQL 쿼리에도 DISTINCT를 추가하여 실행합니다. 그러나 실제 데이터베이스에서 받아오는 데이터의 중복 제거 여부는 데이터베이스의 구현 및 쿼리의 구조에 따라 다를 수 있습니다. 즉, JPA 단에서 distinct를 사용하여도, 실제로 데이터베이스에서 중복된 데이터를 제거하여 결과를 반환하는 것은 데이터베이스의 동작 방식에 따릅니다.

  2. em.createQuery의 반환값으로 List<Order>에 담을 때, 위의 쿼리에서 사용된 distinct는 JPA가 SQL 쿼리를 생성할 때 해당 키워드를 추가합니다. 이는 Order 엔티티의 중복을 제거하려는 의도로 사용됩니다. 그러나 실제로 Order의 ID 중복이 제거되어 담기는 것은 이 쿼리 자체와 데이터베이스의 처리 방식에 달려 있습니다. Fetch Join을 사용할 경우, 연관된 엔티티까지 고려하여 중복을 제거하려는 목적으로 distinct가 사용됩니다.

  3. distinct를 사용하건 안 하건, DB에 나가는 쿼리 문법 자체에는 차이가 있습니다. distinct를 사용하면 생성되는 SQL 쿼리에도 DISTINCT 키워드가 포함됩니다. 하지만 SQL 쿼리의 최종 결과에 얼마나 영향을 미치는지는 실행되는 SQL, 데이터베이스의 구현, 데이터의 형태 등 여러 요인에 의해 결정됩니다.

추가적으로, distinct의 사용이 필요한 시나리오와 JPA에서의 처리 방식에 대해 더 자세히 알고싶다면 Spring Data JPA의 공식 문서에서 “Query Creation” 섹션을 참조하실 것을 추천드립니다. 여기에는 @Query를 사용하여 복잡한 쿼리를 작성할 때 distinct를 어떻게 활용할 수 있는지에 대한 정보가 포함되어 있습니다.

정보 출처:
- Spring Data JPA - Query Creation

질문에 대한 답변이 도움이 되었기를 바랍니다.