Skip to content
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

Open
wants to merge 2 commits into
base: develop
Choose a base branch
from

Conversation

70825
Copy link
Member

@70825 70825 commented Oct 27, 2023

Issue

✨ 구현한 기능

#607 에서 해결하지 못한 태그 N+1 문제를 해결했습니다.

최종적으로 날아가는 쿼리: 92개 → 14개 → 3개

이전 PR에서는 Review에서 출발해서 List<Tag>를 한 번에 가져오는 방법이 아무리봐도 없어서 이 부분은 해결하지 못한채 남겼는데요.

생각해보니 굳이 한 개의 쿼리로 모든걸 다 얻으려고 생각하지말고, ReviewTag를 통해 Tag들을 가져오는 쿼리 1개를 날려서 ReviewList<Tag>를 조립해주면 될 것 같더라구요

그랬더니 해결했습니다.

📢 논의하고 싶은 내용

  • x

🎸 기타

⏰ 일정

  • 추정 시간 : 2
  • 걸린 시간 : 2

@github-actions
Copy link

Test Results

278 tests  +276   278 ✔️ +276   22s ⏱️ +22s
143 suites +142       0 💤 ±    0 
143 files   +142       0 ±    0 

Results for commit 9e5494a. ± Comparison against base commit a0793f3.

@xodms0309
Copy link
Collaborator

멋져요

Copy link
Collaborator

@wugawuga wugawuga left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

코멘트 한번 확인부탁드려요!
바쁜 시기에도 문제해결 존경합니다 ㅎㅎ

Comment on lines +194 to +203
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;
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

다른 효율적인 방법은 없을까요?
조회된 reviewTag 를 sortingReviewDtoWithoutTags 만큼 계속 돌 거 같아서요!! ㅎㅎ

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이게 ReviewTag를 통해 ReviewTag를 서로 찾아 조립해주는 역할을 하는거라 저는 여기까지가 한계... ㅠㅠ
제가 보기엔 쿼리문을 덜 날리는 대신 메모리에서 더 처리하기 vs 쿼리문을 더 날려서 메모리에서 덜 처리하기라 저는 전자를 택했어요

전자) O(Review 수 * ReviewTag 수)로 메모리에서 처리하는 대신 쿼리문 14개에서 3개로 줄이기 (= 현재 PR 코드)
후자) O(Review 수)로 메모리는 덜 쓰고, 각 리뷰가 원하는 태그들을 쿼리문으로 날려서 디비에서 가져오기 (= 현재 프로덕션 코드)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

[BE] 상품에 대한 리뷰 목록 조회 N+1 문제 완전히 해결
3 participants