• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

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

24.02.04 04:26 작성 24.02.04 05:35 수정 조회수 197

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. 문제가 어떻게 나타나는지에 대한 상세한 설명

 

링크: 공식 서포터즈

링크: 자주하는 질문

감사합니다.