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] feat: 상품에 대한 리뷰 목록 조회 동적 쿼리 구현 및 API 성능 개선 #607

Merged
merged 36 commits into from
Oct 16, 2023

Conversation

70825
Copy link
Member

@70825 70825 commented Sep 12, 2023

Issue


✨ 구현한 기능

  • DTO Projection 사용했습니다.
  • N+1 최대한 해결
  • 동적 쿼리 설정 (Criteria API + Specification 사용)
  • 포스트맨으로 확인해보면 요청을 보내고 응답을 받기까지 31924ms 걸리던게 120ms로 개선했습니다
    • 전체 리뷰 3200만개
    • 해당 상품에 대한 리뷰 1200만개 기준

N+1 문제

  • 기존: 최대 92개

    • [1개] 상품 고유 번호(productId) 검증
    • [10개] 페이지 1개당 리뷰 10개
    • [10개] 리뷰 작성한 멤버 가져오기
    • [1개] 총 리뷰 개수 확인
    • [10개 = 10 * 3] 각 리뷰당 리뷰-태그 정보를 가지고 옴 (리뷰 1개당 최대 3개 태그)
    • [10개 = 10 * 3] 바로 위에서 구한 태그 정보를 가지고 옴
    • [10개] 로그인한 유저가 좋아요를 눌렀는지에 대한 정보 가져오기
  • 개선: 최대 14개

    • [1개] 상품 고유 번호(productId) 검증
    • [1개] DTO Projection으로 리뷰 + 멤버 + 좋아요 정보를 가지고옴
    • [11개] 각 리뷰에 있는 태그 정보를 가지고 옴 (리뷰 1개당 최대 3개 태그, 11개인 이유는 리뷰를 11개 가져와서 다음 페이지가 존재하는지 확인함)

태그 정보를 한 번에 가져오는건 해결할 수 있을지 모르겠네요
로그한 유저가 좋아요를 누른건 boolean으로 가져오는데, 리뷰 태그를 가져오는건 List라서 전혀 감이 안잡혀요


인덱스 설정

[리뷰 좋아요 기준 정렬 - (product_id, favorite_count desc, id)]

  • favorite_count는 나중에 스케줄러 적용할 예정이라 데이터 INSERT, UPDATE 주기가 느려서 적용할 수 있을 것 같아요
  • 인덱스에 desc 붙이는건 MySQL 8.0부터 생긴 기능인데, order by에 맞게 desc 적용하니까 성능이 좋아지더라구요

[추가 예정 - 리뷰 작성 시간 기준 정렬 -(product_id, created_at desc, id)]

  • 여기도 위와 같음

[추가 예정 - 리뷰 평점 기준 정렬 - (product_id, rating, id)]

  • 이거는 평점 낮은 순, 평점 높은 순으로 보고 있어서 (product_id, rating, id)만 걸어줄지, 아니면 product_id, rating desc, id)도 걸어줄지 고민이 됩니다.

테스트 방법 예시

  • localhost:8080/api/login/login/1로 로그인 쿠키를 획득 (노션에 코드 있음)
  • localhost:8080/api/products/1/reviews?sort=favoriteCount,desc&page=412346는 기존 페이징 방식
  • localhost:8080/api/future/products/1/reviews?sort=favoriteCount,desc&lastReviewId=4123460는 바뀐 페이징 방식

📢 논의하고 싶은 내용

  • 무한 스크롤 사용하니까 불필요한 데이터는 싹 다 날리고, 최소한의 데이터만 보내주고 있어요.
    그래서 프론트와 이야기한 후에 코드를 수정해야합니다
  • 그래서 테스트 코드도 아직 작성하지 않았습니다

🎸 기타

테코톡으로 공부하는 분은 아래 순서로 간단하게 정리하면서 들으면 이해하기 좋을 것 같고, 추가적으로 공부할 내용으로 커버링 인덱스 적용할만한 상황이라면 적용하면 좋을 것 같습니다.

⏰ 일정

  • 추정 시간 : 12
  • 걸린 시간 : 24

@70825 70825 self-assigned this Sep 12, 2023
@70825 70825 changed the title [BE] feat: 특정 상품에 대한 리뷰 조회 API 최적화 [BE] feat: 상품에 대한 리뷰 목록 조회 API 성능 개선 Sep 12, 2023
@github-actions
Copy link

github-actions bot commented Sep 12, 2023

Unit Test Results

223 tests   223 ✔️  15s ⏱️
112 suites      0 💤
112 files        0

Results for commit dec3256.

♻️ This comment has been updated with latest results.

70825

This comment was marked as resolved.

@70825

This comment was marked as resolved.

@70825 70825 force-pushed the feat/issue-596 branch 2 times, most recently from dec3256 to 4332023 Compare September 20, 2023 04:26
@github-actions
Copy link

github-actions bot commented Sep 20, 2023

Test Results

263 tests   263 ✔️  18s ⏱️
132 suites      0 💤
132 files        0

Results for commit 89e3bfe.

♻️ This comment has been updated with latest results.

@70825 70825 marked this pull request as ready for review September 21, 2023 01:51
@70825
Copy link
Member Author

70825 commented Oct 10, 2023

회의 결과

JPA + Specification으로 동적 쿼리를 만들어 수정하기로 결정

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.

동적쿼리 구현 너무 멋집니다!!
코멘트 확인해주세요!!

Copy link
Collaborator

@Go-Jaecheol Go-Jaecheol left a comment

Choose a reason for hiding this comment

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

고생하셨슴다~!!👍

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.

dto 클래스에서 Boolean -> 기본형으로 바꾸면 될 것 같습니다!

제 pr 에 달렸던 코멘트인데 dto 클래스에 isXXXX 메시지 보단 getter 로 구현하고요!

@70825 70825 changed the title [BE] feat: 상품에 대한 리뷰 목록 조회 API 성능 개선 [BE] feat: 상품에 대한 리뷰 목록 조회 동적 쿼리 구현 및 API 성능 개선 Oct 16, 2023
Copy link
Collaborator

@hanueleee hanueleee left a comment

Choose a reason for hiding this comment

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

기나긴 목록 조회 개선 여정..
고생하셨습니다~~

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] 상품에 대한 리뷰 목록 조회 API 성능 개선
4 participants