Feat: [FN-151] 카드셋 목록 조회시 좋아요순 정렬 기능#44
Conversation
|
Caution Review failedThe pull request is closed. Walkthrough카드셋 검색/정렬 로직을 리팩토링: 정렬 허용 필드를 enum으로 외부화하고 페이징 정렬 파싱을 PagingRequest로 이동. 기존 JPQL 기반 검색을 커스텀 리포지토리로 이전하고 QueryDSL 구현을 추가해 LIKE(좋아요) 정렬, ID 기본 정렬 및 publicVisible 필터를 적용함. Changes
Sequence Diagram(s)sequenceDiagram
autonumber
participant C as 클라이언트
participant S as CardSetService
participant R as CardSetRepository (Custom)
participant Q as JPAQueryFactory
participant DB as DB
C->>S: getCardSets(request)
S->>R: searchByNameContainingAndCategory(name, category, pageable)
Note over R: where: name?, category?, publicVisible=true
R->>R: pageable.sort 해석\n(LIKE -> likeCount 메타조인 필요)
alt LIKE 정렬 포함
R->>Q: select CardSet join CardSetMetadata with orders
else ID 정렬 또는 기본
R->>Q: select CardSet with id order (기본 id.desc 추가 가능)
end
Q->>DB: 실행 (offset/limit + order)
DB-->>Q: 결과 목록
R->>Q: count query (동일 필터)
Q->>DB: count(*)
DB-->>Q: 총개수
Q-->>R: content + total
R-->>S: Page<CardSet>
S-->>C: PagingResponse
Estimated code review effort🎯 4 (Complex) | ⏱️ ~60 minutes Possibly related PRs
Suggested reviewers
Poem
Pre-merge checks (1 passed, 1 warning, 1 inconclusive)❌ Failed checks (1 warning, 1 inconclusive)
✅ Passed checks (1 passed)
Poem
Pre-merge checks (1 passed, 1 warning, 1 inconclusive)❌ Failed checks (1 warning, 1 inconclusive)
✅ Passed checks (1 passed)
Poem
Pre-merge checks (1 passed, 1 warning, 1 inconclusive)❌ Failed checks (1 warning, 1 inconclusive)
✅ Passed checks (1 passed)
📜 Recent review detailsConfiguration used: CodeRabbit UI Review profile: CHILL Plan: Pro 📒 Files selected for processing (5)
Tip 👮 Agentic pre-merge checks are now available in preview!Pro plan users can now enable pre-merge checks in their settings to enforce checklists before merging PRs.
Please see the documentation for more information. Example: reviews:
pre_merge_checks:
custom_checks:
- name: "Undocumented Breaking Changes"
mode: "warning"
instructions: |
Pass/fail criteria: All breaking changes to public APIs, CLI flags, environment variables, configuration keys, database schemas, or HTTP/GraphQL endpoints must be documented in the "Breaking Change" section of the PR description and in CHANGELOG.md. Exclude purely internal or private changes (e.g., code not exported from package entry points or explicitly marked as internal).Please share your feedback with us on this Discord post. Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Actionable comments posted: 2
🧹 Nitpick comments (3)
src/main/java/project/flipnote/cardset/model/CardSetSortField.java (1)
10-14: EnumSet 사용을 고려해보세요
getFieldNames()메서드는 매번 호출될 때마다 새로운 Set을 생성합니다. 성능 최적화를 위해 결과를 캐싱하거나 EnumSet을 활용하는 것이 더 효율적일 수 있습니다.다음과 같이 개선할 수 있습니다:
+import java.util.EnumSet; import java.util.Arrays; import java.util.Set; import java.util.stream.Collectors; public enum CardSetSortField { ID, LIKE; + + private static final Set<String> FIELD_NAMES = EnumSet.allOf(CardSetSortField.class) + .stream() + .map(Enum::name) + .collect(Collectors.toUnmodifiableSet()); public static Set<String> getFieldNames() { - return Arrays.stream(values()) - .map(CardSetSortField::name) - .collect(Collectors.toSet()); + return FIELD_NAMES; } }src/main/java/project/flipnote/cardset/model/CardSetSearchRequest.java (1)
26-34: 좋은 검증 로직입니다허용된 정렬 필드를 검증하고 기본값을 제공하는 로직이 잘 구현되었습니다. 다만, 부모 클래스의
getSortBy()가 이미 대문자로 변환하므로 중복 변환이 일어날 수 있습니다.부모 클래스가 이미 대문자로 변환하는 경우를 고려하여:
@Override public String getSortBy() { String sortBy = super.getSortBy(); - if (sortBy != null && ALLOWED_SORT_FIELDS.contains(sortBy)) { + // super.getSortBy()는 이미 대문자로 변환됨 + if (sortBy != null && ALLOWED_SORT_FIELDS.contains(sortBy)) { return sortBy; } return "ID"; }src/main/java/project/flipnote/cardset/repository/CardSetRepositoryCustomImpl.java (1)
68-70: 메타데이터 누락 카드셋 포함 검증CardSetMetadata는 CardSetService에서 생성돼 신규 카드셋엔 항상 존재하지만, 과거 데이터에 메타데이터가 없으면 INNER JOIN(join()) 사용 시 해당 카드셋이 제외됩니다.
- 기존 카드셋에 metadata가 누락되지 않았는지(마이그레이션/초기화 여부) 확인하세요.
- 누락 가능성이 있다면 join()을 leftJoin(m).on(c.id.eq(m.id))으로 변경하거나, 메타데이터를 이관하는 스크립트를 추가 실행하세요.
File: src/main/java/project/flipnote/cardset/repository/CardSetRepositoryCustomImpl.java Lines 68–70
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (7)
src/main/java/project/flipnote/cardset/model/CardSetSearchRequest.java(1 hunks)src/main/java/project/flipnote/cardset/model/CardSetSortField.java(1 hunks)src/main/java/project/flipnote/cardset/repository/CardSetRepository.java(1 hunks)src/main/java/project/flipnote/cardset/repository/CardSetRepositoryCustom.java(1 hunks)src/main/java/project/flipnote/cardset/repository/CardSetRepositoryCustomImpl.java(1 hunks)src/main/java/project/flipnote/cardset/service/CardSetService.java(1 hunks)src/main/java/project/flipnote/common/model/request/PagingRequest.java(1 hunks)
🧰 Additional context used
🧬 Code graph analysis (6)
src/main/java/project/flipnote/cardset/repository/CardSetRepositoryCustom.java (1)
src/main/java/project/flipnote/cardset/entity/CardSet.java (1)
Getter(22-69)
src/main/java/project/flipnote/cardset/service/CardSetService.java (1)
src/main/java/project/flipnote/cardset/entity/CardSet.java (1)
Getter(22-69)
src/main/java/project/flipnote/cardset/repository/CardSetRepository.java (3)
src/main/java/project/flipnote/group/repository/GroupRepository.java (1)
Repository(14-27)src/main/java/project/flipnote/cardset/entity/CardSet.java (1)
Getter(22-69)src/main/java/project/flipnote/group/repository/GroupMemberRepository.java (1)
Repository(14-29)
src/main/java/project/flipnote/common/model/request/PagingRequest.java (3)
src/main/java/project/flipnote/bookmark/model/BookmarkSearchRequest.java (2)
Getter(10-18)Override(14-17)src/main/java/project/flipnote/common/model/request/CursorPagingRequest.java (2)
Getter(13-60)Schema(45-59)src/main/java/project/flipnote/group/model/GroupInvitationListRequest.java (2)
Override(10-13)GroupInvitationListRequest(8-14)
src/main/java/project/flipnote/cardset/repository/CardSetRepositoryCustomImpl.java (2)
src/main/java/project/flipnote/cardset/repository/CardSetMetadataRepository.java (2)
CardSetMetadataRepository(10-23)Modifying(12-14)src/main/java/project/flipnote/cardset/entity/CardSet.java (1)
Getter(22-69)
src/main/java/project/flipnote/cardset/model/CardSetSearchRequest.java (3)
src/main/java/project/flipnote/bookmark/model/BookmarkSearchRequest.java (2)
Getter(10-18)Override(14-17)src/main/java/project/flipnote/common/model/request/CursorPagingRequest.java (2)
Getter(13-60)Schema(45-59)src/main/java/project/flipnote/cardset/entity/CardSet.java (1)
Getter(22-69)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
- GitHub Check: build
🔇 Additional comments (4)
src/main/java/project/flipnote/cardset/service/CardSetService.java (1)
123-123: TODO 주석이 단순화되었습니다TODO 주석이 이전의 자세한 내용에서 "Projection 튜닝 필요"로 단순화되었습니다. 중요한 정보가 손실되지 않았는지 확인이 필요합니다.
src/main/java/project/flipnote/cardset/repository/CardSetRepositoryCustom.java (1)
11-15: 인터페이스 메서드 정의가 명확합니다카드셋 검색 메서드의 시그니처가 명확하게 정의되어 있습니다.
src/main/java/project/flipnote/cardset/repository/CardSetRepository.java (1)
11-11: Custom Repository 통합이 잘 되었습니다JPA Repository와 Custom Repository를 적절히 결합하여 확장성 있는 구조를 만들었습니다.
src/main/java/project/flipnote/cardset/repository/CardSetRepositoryCustomImpl.java (1)
78-86: count 쿼리와 select 쿼리의 조건이 일치합니다count 쿼리의 WHERE 조건이 select 쿼리와 동일하게 유지되고 있어 정확한 페이징이 가능합니다. 좋은 구현입니다.
📝 변경 내용
✅ 체크리스트
💬 기타 참고 사항
Summary by CodeRabbit
신규 기능
리팩터링