작성
·
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이 안되는 것을 참고해주세요 ㅜ