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

dionisos198님의 프로필 이미지
dionisos198

작성한 질문수

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

주문 조회 V5: JPA에서 DTO 직접 조회 - 컬렉션 조회 최적화

제가 강의 내용을 제대로 이해하지 못한 것 같습니다.

작성

·

356

·

수정됨

0

[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예[질문 내용]

@Query("select r from Review r join fetch r.user u join fetch r.reviewReviewTags rt join fetch rt.reviewTag where r.program.id=:programId order by r.likeCounts desc")
    List<Review> findTop4ByProgramOrderByLikeCountsDescWithFetch(@Param("programId") Long programId,
        Pageable pageable);


안녕하세요!

영한님의 강의에서 이해했던 내용과 결괏값이 달라서 질문 올립니다.(물론 제가 이해를 잘 못했을 것 같긴합니다!)

현재 User, Review, Program 을 1대 다 다대1로 나누었고 중간테이블은 Review 입니다.

또한 Review , RevieReviewTag, ReviewTag 또한 1대다 다대1. 중간테이블은 ReviewReviewTag 입니다.

현재 강의 내용에서 제가 이해한 것은

@OneToMany 에서 성능 최적화 할 때

1)페이징 처리시 : Batch 를 활용

2) 페이징 처리 안할 시: distinct+ fetch JOIN 사용입니다.

위 경우에서 join fetch r.reviewReviewTags 에 주목해 주세요!

이는 review 와 reviewreviewTag 즉 1대다입니다.

이를 fetch Join 으로 한번 발라보았습니다.

 

저는 위 과정에서 일단 핵심적으로 distinct 를 안붙였기 때문에 같은 리뷰에 대한 리뷰 태그가 여러 개 생겨서 중복된 결과가 나올줄 알았습니다.

 

실제로 위 과정에서 나온 쿼리를 복사해서 집어 넣어보니

 

이렇게 추가된 같은 review에 대해서 reviewTag 개수(review에 대한 1대다,2개로 고정해서 저장하였음. 따라서 두번씩 중복) 만큼 중복해서 나왔습니다.

 

그래서 위 과정을 DTO로 만들어서 반환하면 2개씩 중복된 결과가 나올 것이라 예상했습니다.

 

근데 JSON 데이터를 확인한 결과

 {
        "reviewId": 21,
        "like": 0,
        "contents": "너무 좋았습니다0",
        "userPosterPath": null,
        "userNickName": null,
        "localDateTime": "2024-02-04T03:40:18.924606",
        "ratings": "2.5",
        "reviewTagNames": [
          "극장에서 또 보고 싶어요",
          "돈이 아까워요"
        ]
      },
      {
        "reviewId": 22,
        "like": 0,
        "contents": "너무 좋았습니다1",
        "userPosterPath": null,
        "userNickName": null,
        "localDateTime": "2024-02-04T03:40:18.934169",
        "ratings": "1.5",
        "reviewTagNames": [
          "극장에서 또 보고 싶어요",
          "돈이 아까워요"
        ]
      },
      {
        "reviewId": 23,
        "like": 0,
        "contents": "너무 좋았습니다2",
        "userPosterPath": null,
        "userNickName": null,
        "localDateTime": "2024-02-04T03:40:18.939567",
        "ratings": "2.5",
        "reviewTagNames": [
          "극장에서 또 보고 싶어요",
          "돈이 아까워요"
        ]
      },
      {
        "reviewId": 24,
        "like": 0,
        "contents": "너무 좋았습니다3",
        "userPosterPath": null,
        "userNickName": null,
        "localDateTime": "2024-02-04T03:40:18.948736",
        "ratings": "0.5",
        "reviewTagNames": [
          "극장에서 또 보고 싶어요",
          "돈이 아까워요"
        ]
      }
    ],

 

얼레레 근데 왠걸

정상적으로 나오는 것입니다.

저는 위에 쿼리를 DTO로 만들어서 반환한 것 밖에 없는데 (pageable 안에는 PageRequest.of(0, 4))

 

제가 이해한 강의 내용 대로라면 일단 핵심적으로 distinct 를 안붙였기 때문에 1대다의 다의 개수만큼 중복된(위에서는 2개) 결과가 나와야 할 것 같았는데

어디서 틀린 것일까요 ㅠ

 

 

스프링 부트 버젼은 2.7.X 이며

 하이버 네이트 버젼도 6이 안되는 것을 참고해주세요 ㅜ

답변 1

0

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

안녕하세요. dionisos198님

도움을 드리고 싶지만 질문 내용만으로는 답변을 드리기 어렵습니다.

실제 동작하는 전체 프로젝트를 압축해서 구글 드라이브로 공유해서 링크를 남겨주세요.

구글 드라이브 업로드 방법은 다음을 참고해주세요.

https://bit.ly/3fX6ygx

 

주의: 업로드시 링크에 있는 권한 문제 꼭 확인해주세요

 

추가로 다음 내용도 코멘트 부탁드립니다.

1. 문제 영역을 실행할 수 있는 방법

2. 문제가 어떻게 나타나는지에 대한 상세한 설명

 

링크: 공식 서포터즈

링크: 자주하는 질문

감사합니다.

dionisos198님의 프로필 이미지
dionisos198

작성한 질문수

질문하기