-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[BE] refactor: 특정 상품에 대한 리뷰 목록 조회 N+1 문제 완전히 해결 #838
base: develop
Are you sure you want to change the base?
Conversation
멋져요 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
코멘트 한번 확인부탁드려요!
바쁜 시기에도 문제해결 존경합니다 ㅎㅎ
final List<SortingReviewDto> sortingReviewDtos = new ArrayList<>(); | ||
for (final SortingReviewDtoWithoutTag sortingReviewDtoWithoutTag : sortingReviewDtoWithoutTags) { | ||
final List<Tag> tags = reviewTags.stream() | ||
.filter(reviewTag -> Objects.equals(sortingReviewDtoWithoutTag.getId(), reviewTag.getReview().getId())) | ||
.map(ReviewTag::getTag) | ||
.collect(Collectors.toList()); | ||
final SortingReviewDto sortingReviewDto = SortingReviewDto.toDto(sortingReviewDtoWithoutTag, tags); | ||
sortingReviewDtos.add(sortingReviewDto); | ||
} | ||
return sortingReviewDtos; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
다른 효율적인 방법은 없을까요?
조회된 reviewTag 를 sortingReviewDtoWithoutTags 만큼 계속 돌 거 같아서요!! ㅎㅎ
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
이게 ReviewTag
를 통해 Review
와 Tag
를 서로 찾아 조립해주는 역할을 하는거라 저는 여기까지가 한계... ㅠㅠ
제가 보기엔 쿼리문을 덜 날리는 대신 메모리에서 더 처리하기
vs 쿼리문을 더 날려서 메모리에서 덜 처리하기
라 저는 전자를 택했어요
전자) O(Review 수 * ReviewTag 수)로 메모리에서 처리하는 대신 쿼리문 14개에서 3개로 줄이기 (= 현재 PR 코드)
후자) O(Review 수)로 메모리는 덜 쓰고, 각 리뷰가 원하는 태그들을 쿼리문으로 날려서 디비에서 가져오기 (= 현재 프로덕션 코드)
Issue
✨ 구현한 기능
#607 에서 해결하지 못한 태그 N+1 문제를 해결했습니다.
최종적으로 날아가는 쿼리: 92개 → 14개 → 3개
이전 PR에서는
Review
에서 출발해서List<Tag>
를 한 번에 가져오는 방법이 아무리봐도 없어서 이 부분은 해결하지 못한채 남겼는데요.생각해보니 굳이 한 개의 쿼리로 모든걸 다 얻으려고 생각하지말고,
ReviewTag
를 통해Tag
들을 가져오는 쿼리 1개를 날려서Review
랑List<Tag>
를 조립해주면 될 것 같더라구요그랬더니 해결했습니다.
📢 논의하고 싶은 내용
🎸 기타
끝
⏰ 일정