inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

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

distinct 질문 드립니다.

378

저스트

작성한 질문수 6

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();
 }

 

java spring spring-boot jpa

답변 1

0

인프런 AI 인턴

안녕하세요, 인프런 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

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

강의 관련 외 질문입니다.

0

81

2

SpringBoot4 + Hibernate7 모듈 등록 방법 공유

1

99

1

BeanCreationException

0

96

3

Update 후 UpdateMemberResponse 매핑할 때

0

57

1

트랜잭션을 사용 안 할 때 커넥션은 언제 가져오나요?

0

102

2

페이징 + 검색조건 관련해서 질문드립니다.

0

74

1

Query Dsl Q파일 질문입니다.

0

86

1

루트 쿼리라는것은

0

62

1

메서드를 분리하는 기준

0

71

1

findAllWithMemberDelivery 메서드 질문드립니다.

0

116

3

연관관계 매핑을 안 쓸 경우, 사용해야 하는 전략

0

92

2

fetch join과 영속화와 OSIV의 관계

0

90

2

Distinct 사용 전 결과에 대한 의문

0

118

2

레포지토리 계층에서의 트랜잭션에 대한 의문

0

63

1

영속성 컨텍스트 생명주기의 신기한 부분이 있습니다.

0

79

2

dto 필드 속 엔티티 여부

0

63

1

뷰템플릿 사용 시

0

82

2

Result 클래스 관련 질문

0

56

1

@PostConstruct 프록시 관련 질문드립니다

0

88

1

DTO 대신 Form 사용은 안되나요?

0

140

1

OSIV ON 상태일 때

0

99

1

fetch join VS fetch join 페이징 궁금증

0

190

2

양방향 연관관계 알아보는 법?

0

110

1

16강 17강 간단 정리 이게 맞을까요 ?

0

168

2