-
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
feat: 태그 검색 구현 #71
feat: 태그 검색 구현 #71
Conversation
- 상품의 태그 Top3 중 있으면 검색해서 조회
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.
우가 고생하셨어요~
쿼리문에 궁금한 점이 있어서 코멘트 남깁니다~
1. 상품의 태그 Top3 중 있으면 검색해서 조회
상품의 태그 TOP 3
이라는 뜻은 상품에서 가장 많이 언급된 태그 3개를 말하는거죠??
제가 이해하는게 맞다면 아래 테스트 코드는 통과하지 말아야 하는데 통과하고 있어요
product1에 달린 태그
단짠단짠: 3회
맛있어요: 3회
갓성비: 2회
간식: 1회
@Test
void 간식_태그는_4위이므로_검색되지_말아야한다() {
// given
final var category = 카테고리_간편식사_생성();
단일_카테고리_저장(category);
final var 태그_맛있어요 = 태그_맛있어요_TASTE_생성();
final var 태그_단짠단짠 = 태그_맛있어요_TASTE_생성();
final var 태그_갓성비 = 태그_맛있어요_TASTE_생성();
final var 태그_간식 = 태그_간식_ETC_생성();
final var 태그1 = 단일_태그_저장(태그_맛있어요);
final var 태그2 = 단일_태그_저장(태그_단짠단짠);
final var 태그3 = 단일_태그_저장(태그_갓성비);
final var 태그4 = 단일_태그_저장(태그_간식);
final var product1 = 상품_애플망고_가격3000원_평점5점_생성(category);
final var product2 = 상품_망고빙수_가격5000원_평점4점_생성(category);
final var product3 = 상품_망고빙수_가격5000원_평점4점_생성(category);
final var product4 = 상품_망고빙수_가격5000원_평점4점_생성(category);
복수_상품_저장(product1, product2, product3, product4);
final var member1 = 멤버_멤버1_생성();
final var member2 = 멤버_멤버2_생성();
복수_멤버_저장(member1, member2);
final var review1_1 = 리뷰_이미지test1_평점1점_재구매X_생성(member1, product1, 0L);
final var review1_2 = 리뷰_이미지test5_평점5점_재구매O_생성(member2, product1, 0L);
final var review2_1 = 리뷰_이미지test3_평점3점_재구매O_생성(member1, product2, 0L);
복수_리뷰_저장(review1_1, review1_2, review2_1);
복수_리뷰_태그_저장(
리뷰태그_생성(review1_1, 태그_맛있어요),
리뷰태그_생성(review1_1, 태그_맛있어요),
리뷰태그_생성(review1_1, 태그_단짠단짠),
리뷰태그_생성(review1_1, 태그_단짠단짠),
리뷰태그_생성(review1_1, 태그_갓성비),
리뷰태그_생성(review1_1, 태그_갓성비),
리뷰태그_생성(review1_1, 태그_간식),
리뷰태그_생성(review1_1, 태그_맛있어요),
리뷰태그_생성(review1_2, 태그_단짠단짠),
리뷰태그_생성(review2_1, 태그_맛있어요)
);
final var expected = List.of(product1);
// when
final var actual = productRepository.searchProductsByTopTagsFirst(태그4, PageRequest.of(0, 10));
// then
assertThat(actual).usingRecursiveComparison()
.isEqualTo(expected);
}
2. 쿼리문에서 궁금한 점
searchProductsByTopTagsFirst
쿼리문입니다
" WHERE rt2.tag.id = :tagId AND rt2.tag.id IN ( " +
" SELECT rt3.tag.id FROM Review r3 " +
" JOIN r3.reviewTags rt3 " +
" WHERE r3.product.id = p2.id " +
" GROUP BY rt3.tag.id " +
" ORDER BY COUNT(rt3.tag.id) DESC " +
" ) " +
- 위 서브쿼리문은 상품에 검색한 태그가 있어야 한다는거죠?? 이게 맞으면 상품에 적용된 상위 3개 태그를 확인하는게 맞는 것 같은데
LIMIT 3
이 언급되는 부분이 없어서요. 거기다가LIMIT 3
이 없으면ORDER BY COUNT(rt3.tag.id) DESC
는 필요 없는 쿼리문으로 보여요
" WHERE rt2.tag.id = :tagId AND rt2.tag.id IN ( .... )" +
" GROUP BY p2.id " +
" HAVING COUNT(DISTINCT rt2.tag.id) <= 3 " +
- 위 쿼리문에서
HAVING COUNT(DISTINCT rt2.tag.id) <= 3
은특정 태그는 3개 이하여야 한다
라는 쿼리문인데, 의미 없는 쿼리문으로 보여서요.
왜냐하면WHERE rt2.tag.id = :tagId
로 인해서 tagId인 태그만 감지되는 상황이라(상품1, 리뷰1, 태그1), (상품1, 리뷰2, 태그1), (상품1, 리뷰3, 태그1), ...
로 태그1을 포함하는 데이터들만 나오게 되는데요. 이때DISTINCT rt2.tag.id
는rt2.tag.id 적용 -> (태그1), (태그1), (태그1), ... -> DISTINCT 적용 -> (태그1)
로 데이터 1개만 나오기 때문에HAVING COUNT(DISTINCT rt2.tag.id) <= 3
은 곧1 <= 3
이라서 무조건 참인 쿼리문이라서요.
제가 이해한게 맞다면 쿼리문 자체를 다시 수정해야 할 것 같습니다
src/test/java/com/funeat/product/persistence/ProductRepositoryTest.java
Outdated
Show resolved
Hide resolved
src/test/java/com/funeat/product/persistence/ProductRepositoryTest.java
Outdated
Show resolved
Hide resolved
src/test/java/com/funeat/product/persistence/ProductRepositoryTest.java
Outdated
Show resolved
Hide resolved
src/test/java/com/funeat/acceptance/product/ProductAcceptanceTest.java
Outdated
Show resolved
Hide resolved
src/test/java/com/funeat/product/persistence/ProductRepositoryTest.java
Outdated
Show resolved
Hide resolved
src/main/java/com/funeat/product/persistence/ProductRepository.java
Outdated
Show resolved
Hide resolved
src/test/java/com/funeat/product/persistence/ProductRepositoryTest.java
Outdated
Show resolved
Hide resolved
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.
우가 고생하셨어요
쿼리문에 """
로 하니까 확실히 보기 편하네요 👍👍
간단한 부분 수정하고 머지하면 될 것 같아서 미리 Approve 하겠습니다 ~
src/main/java/com/funeat/product/persistence/ProductRepositoryImpl.java
Outdated
Show resolved
Hide resolved
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.
LGTM 👍👍
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.
👍👍
Issue
✨ 구현한 기능