-
Notifications
You must be signed in to change notification settings - Fork 1
refactor: 레거시 기능(책 추천, 미팅 캘린더) 삭제 #133
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
Conversation
📝 WalkthroughWalkthroughThis PR removes the book recommendation feature entirely (entity, repository, services, controller, DTOs, and converter methods) and removes the meeting calendar retrieval functionality. A database migration drops the book_recommend table, completing the feature deprecation. Changes
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~25 minutes Possibly related PRs
Suggested labels
Suggested reviewers
Poem
Pre-merge checks and finishing touches❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing touches
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 |
Summary of ChangesHello @zjhj0814, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed! 이 PR은 레거시 기능을 제거하여 애플리케이션을 간소화하고 유지보수성을 향상시키는 데 중점을 둡니다. 특히, 책 추천 기능과 미팅 캘린더 조회 기능이 완전히 삭제되었으며, 이에 따라 관련 코드와 데이터베이스 스키마가 정리되었습니다. 이는 불필요한 복잡성을 줄이고 향후 개발을 위한 더 깨끗한 기반을 마련합니다. Highlights
🧠 New Feature in Public Preview: You can now enable Memory to help Gemini Code Assist learn from your team's feedback. This makes future code reviews more consistent and personalized to your project's style. Click here to enable Memory in your admin console. Using Gemini Code AssistThe full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips. Invoking Gemini You can request assistance from Gemini at any point by creating a comment using either
Customization To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a Limitations & Feedback Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here. You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension. Footnotes
|
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.
Code Review
이 Pull Request는 더 이상 사용되지 않는 책 추천 기능과 미팅 캘린더 조회 기능을 제거하는 리팩토링을 수행합니다. 전반적으로 관련된 코드(엔티티, 리포지토리, 서비스, 컨트롤러, DTO)와 데이터베이스 마이그레이션 스크립트까지 깔끔하게 삭제되어 코드베이스가 정리된 점이 좋습니다.
다만, 일부 파일에서 와일드카드(*) 임포트를 사용하는 것으로 변경되었는데, 이는 코드의 가독성과 유지보수성을 저해할 수 있습니다. 명시적으로 클래스를 임포트하는 방식을 유지하는 것이 좋습니다. 자세한 내용은 각 파일에 대한 리뷰 코멘트를 참고해주세요.
| import jakarta.persistence.*; | ||
| import lombok.*; |
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.
와일드카드(*)를 사용한 임포트는 코드의 가독성을 해치고, 잠재적인 이름 충돌을 야기할 수 있습니다. 필요한 클래스들을 명시적으로 임포트하는 것이 좋습니다. 예를 들어, Google Java Style Guide에서는 정적 임포트를 제외한 와일드카드 임포트를 허용하지 않습니다.
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.EnumType;
import jakarta.persistence.Enumerated;
import jakarta.persistence.FetchType;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;| import checkmo.clubMeeting.internal.entity.Team; | ||
| import checkmo.clubMeeting.internal.entity.TeamTopic; | ||
| import checkmo.clubMeeting.internal.entity.Topic; | ||
| import checkmo.clubMeeting.internal.entity.*; |
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.
와일드카드(*)를 사용한 임포트는 코드의 가독성을 해치고, 잠재적인 이름 충돌을 야기할 수 있습니다. 필요한 클래스들을 명시적으로 임포트하는 것이 좋습니다.
| import checkmo.clubMeeting.internal.entity.*; | |
| import checkmo.clubMeeting.internal.entity.BookReview; | |
| import checkmo.clubMeeting.internal.entity.ClubMemberTeam; | |
| import checkmo.clubMeeting.internal.entity.Meeting; | |
| import checkmo.clubMeeting.internal.entity.Team; | |
| import checkmo.clubMeeting.internal.entity.TeamTopic; | |
| import checkmo.clubMeeting.internal.entity.Topic; |
| import lombok.RequiredArgsConstructor; | ||
| import org.springframework.stereotype.Service; | ||
|
|
||
| import java.util.*; |
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.
| import org.springframework.web.bind.annotation.RequestMapping; | ||
| import org.springframework.web.bind.annotation.RequestParam; | ||
| import org.springframework.web.bind.annotation.RestController; | ||
| import org.springframework.web.bind.annotation.*; |
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.
와일드카드(*)를 사용한 임포트는 코드의 가독성을 해치고, 잠재적인 이름 충돌을 야기할 수 있습니다. 필요한 어노테이션들을 명시적으로 임포트하는 것이 좋습니다.
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PatchMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;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.
Actionable comments posted: 0
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (2)
src/main/java/checkmo/clubMeeting/web/controller/ClubMeetingController.java (2)
25-25: Remove outdated calendar API reference from Tag description.The Tag description mentions "캘린더 API" (Calendar API), but the
getClubCalendarendpoint was removed in this PR. This creates inconsistency between documentation and available functionality.🔎 Proposed fix
-@Tag(name = "독서모임-모임(미팅)", description = "독서 모임 미팅, 팀 발제, 토론조 관리, 캘린더 API") +@Tag(name = "독서모임-모임(미팅)", description = "독서 모임 미팅, 팀 발제, 토론조 관리")
25-25: Remove orphaned CalendarMeeting DTO class and dead calendar-related comments.The
getClubCalendarendpoint has been successfully removed with no orphaned method or path references. However, theCalendarMeetinginner class insrc/main/java/checkmo/clubMeeting/web/dto/meeting/MeetingResponseDTO.java(line 57) and the dead comment at line 50 mentioning calendar queries remain unused and should be removed for code cleanliness.
🧹 Nitpick comments (3)
src/main/java/checkmo/clubManagement/web/dto/ClubRequestDTO.java (1)
18-38: Consider using Boolean type or adding validation for filter flags.The Javadoc indicates
name,region, andparticipantsare binary flags (0 or 1), butIntegerallows any value. Consider either:
- Using
Booleantype with null defaulting tofalse, or- Adding validation to constrain values to 0/1
This is a minor improvement for type safety and API clarity.
🔎 Alternative using Boolean type
- public record ClubSearchFilter(String keyword, Integer name, Integer region, Integer participants) { + public record ClubSearchFilter(String keyword, Boolean name, Boolean region, Boolean participants) { public ClubSearchFilter { if (keyword == null) { keyword = ""; } if (name == null) { - name = 0; + name = false; } if (region == null) { - region = 0; + region = false; } if (participants == null) { - participants = 0; + participants = false; } } }src/main/java/checkmo/clubMeeting/web/controller/ClubMeetingController.java (1)
20-20: Consider explicit imports over wildcard.Wildcard imports can obscure which specific annotations are used and may introduce naming conflicts. Explicit imports improve code clarity and maintainability.
🔎 Suggested explicit imports
-import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PatchMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController;src/main/java/checkmo/clubMeeting/internal/service/ClubMeetingQueryFacade.java (1)
9-9: Consider using explicit imports instead of wildcards.Wildcard imports (e.g.,
import checkmo.clubMeeting.internal.entity.*andimport java.util.*) can reduce code clarity and may introduce naming conflicts. Explicit imports make dependencies more transparent and easier to track.🔎 Rationale
While wildcard imports are syntactically valid, they make it harder to:
- Understand which specific classes are used in the file
- Detect potential naming conflicts across packages
- Navigate dependencies during code reviews
Most Java style guides recommend explicit imports for better maintainability.
Also applies to: 27-29
📜 Review details
Configuration used: defaults
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (16)
src/main/java/checkmo/clubManagement/internal/converter/ClubManagementConverter.javasrc/main/java/checkmo/clubManagement/internal/entity/BookRecommend.javasrc/main/java/checkmo/clubManagement/internal/entity/ClubMember.javasrc/main/java/checkmo/clubManagement/internal/excepetion/ClubManagementErrorStatus.javasrc/main/java/checkmo/clubManagement/internal/repository/BookRecommendRepository.javasrc/main/java/checkmo/clubManagement/internal/repository/BookRecommendRepositoryCustom.javasrc/main/java/checkmo/clubManagement/internal/repository/BookRecommendRepositoryCustomImpl.javasrc/main/java/checkmo/clubManagement/internal/service/ClubManagementQueryFacade.javasrc/main/java/checkmo/clubManagement/internal/service/command/ClubBookRecommendCommandService.javasrc/main/java/checkmo/clubManagement/internal/service/query/ClubBookRecommendQueryService.javasrc/main/java/checkmo/clubManagement/web/controller/ClubRecommendationController.javasrc/main/java/checkmo/clubManagement/web/dto/ClubRequestDTO.javasrc/main/java/checkmo/clubManagement/web/dto/ClubResponseDTO.javasrc/main/java/checkmo/clubMeeting/internal/service/ClubMeetingQueryFacade.javasrc/main/java/checkmo/clubMeeting/web/controller/ClubMeetingController.javasrc/main/resources/db/migration/V20251129__drop_book_recommend.sql
💤 Files with no reviewable changes (8)
- src/main/java/checkmo/clubManagement/internal/repository/BookRecommendRepositoryCustomImpl.java
- src/main/java/checkmo/clubManagement/web/controller/ClubRecommendationController.java
- src/main/java/checkmo/clubManagement/internal/entity/BookRecommend.java
- src/main/java/checkmo/clubManagement/internal/excepetion/ClubManagementErrorStatus.java
- src/main/java/checkmo/clubManagement/internal/service/command/ClubBookRecommendCommandService.java
- src/main/java/checkmo/clubManagement/internal/service/query/ClubBookRecommendQueryService.java
- src/main/java/checkmo/clubManagement/internal/repository/BookRecommendRepository.java
- src/main/java/checkmo/clubManagement/internal/repository/BookRecommendRepositoryCustom.java
🧰 Additional context used
🧠 Learnings (14)
📓 Common learnings
Learnt from: MODUGGAGI
Repo: checkmo2025/BE PR: 67
File: src/main/java/checkmo/domain/book/facade/BookQueryFacadeImpl.java:51-68
Timestamp: 2025-08-08T12:22:25.630Z
Learning: Project checkmo2025/BE: In BookStoryQueryServiceImpl, list endpoints batch-fetch related data (books/authors/likes), while getBookStory (single-detail) intentionally uses per-item facades; batching is not required for this single-item path. Additionally, refactoring ClubQueryFacadeImpl and ClubBookRecommendQueryServiceImpl is out of scope for PR #67.
📚 Learning: 2025-08-13T01:15:49.577Z
Learnt from: zjhj0814
Repo: checkmo2025/BE PR: 89
File: src/main/java/checkmo/domain/club/facade/ClubQueryFacadeImpl.java:560-582
Timestamp: 2025-08-13T01:15:49.577Z
Learning: In the checkmo2025/BE project's ClubQueryFacadeImpl.findTeamMembersByMeeting method, the memberBasicInfoMap.values() usage is intentional - the map is only used to extract MemberBasicInfoDTO objects and order preservation is not required for the functionality.
Applied to files:
src/main/java/checkmo/clubMeeting/internal/service/ClubMeetingQueryFacade.javasrc/main/java/checkmo/clubManagement/internal/converter/ClubManagementConverter.java
📚 Learning: 2025-08-12T05:43:21.413Z
Learnt from: zjhj0814
Repo: checkmo2025/BE PR: 82
File: src/main/java/checkmo/domain/member/service/query/MemberQueryServiceImpl.java:98-106
Timestamp: 2025-08-12T05:43:21.413Z
Learning: In the checkmo project, the MemberQueryFacadeImpl properly handles null/empty input validation by returning Map.of() before delegating to service methods, so service layer implementations don't need redundant null/empty guards when called through the facade.
Applied to files:
src/main/java/checkmo/clubMeeting/internal/service/ClubMeetingQueryFacade.javasrc/main/java/checkmo/clubManagement/internal/service/ClubManagementQueryFacade.java
📚 Learning: 2025-08-08T12:22:25.630Z
Learnt from: MODUGGAGI
Repo: checkmo2025/BE PR: 67
File: src/main/java/checkmo/domain/book/facade/BookQueryFacadeImpl.java:51-68
Timestamp: 2025-08-08T12:22:25.630Z
Learning: Project checkmo2025/BE: In BookStoryQueryServiceImpl, list endpoints batch-fetch related data (books/authors/likes), while getBookStory (single-detail) intentionally uses per-item facades; batching is not required for this single-item path. Additionally, refactoring ClubQueryFacadeImpl and ClubBookRecommendQueryServiceImpl is out of scope for PR #67.
Applied to files:
src/main/java/checkmo/clubMeeting/internal/service/ClubMeetingQueryFacade.javasrc/main/java/checkmo/clubManagement/internal/service/ClubManagementQueryFacade.javasrc/main/java/checkmo/clubManagement/web/dto/ClubRequestDTO.javasrc/main/java/checkmo/clubManagement/internal/converter/ClubManagementConverter.javasrc/main/java/checkmo/clubManagement/internal/entity/ClubMember.javasrc/main/java/checkmo/clubManagement/web/dto/ClubResponseDTO.java
📚 Learning: 2025-08-08T12:12:55.380Z
Learnt from: MODUGGAGI
Repo: checkmo2025/BE PR: 67
File: src/main/java/checkmo/domain/member/facade/MemberQueryFacade.java:135-143
Timestamp: 2025-08-08T12:12:55.380Z
Learning: Project preference (checkmo2025/BE): Keep JavaDoc/comments lightweight and avoid over-specifying edge-case behaviors unless critical. Example: src/main/java/checkmo/domain/member/facade/MemberQueryFacade.java -> getMemberWithFollowStatusMapForShare(List<String> targetMemberIds, String currentMemberId) should not document exhaustive cases (duplicates, non-existent IDs, ordering) in Javadoc; keep it concise.
Applied to files:
src/main/java/checkmo/clubMeeting/internal/service/ClubMeetingQueryFacade.javasrc/main/java/checkmo/clubManagement/internal/service/ClubManagementQueryFacade.javasrc/main/java/checkmo/clubManagement/internal/entity/ClubMember.java
📚 Learning: 2025-08-12T05:58:09.322Z
Learnt from: zjhj0814
Repo: checkmo2025/BE PR: 82
File: src/main/java/checkmo/domain/club/service/command/ClubMeetingCommandServiceImpl.java:206-216
Timestamp: 2025-08-12T05:58:09.322Z
Learning: In the checkmo2025/BE project, the MeetingRequestDTO.TeamMemberDTO.nicknameList field has NotNull validation annotation that prevents null values at the request validation layer, so null checks are not needed in the service layer code.
Applied to files:
src/main/java/checkmo/clubMeeting/internal/service/ClubMeetingQueryFacade.javasrc/main/java/checkmo/clubManagement/web/dto/ClubRequestDTO.java
📚 Learning: 2025-08-10T08:17:41.816Z
Learnt from: zjhj0814
Repo: checkmo2025/BE PR: 69
File: src/main/java/checkmo/domain/club/service/command/ClubMeetingCommandServiceImpl.java:112-146
Timestamp: 2025-08-10T08:17:41.816Z
Learning: In the checkmo2025/BE project, the `selectOrCancelTopic` method in `ClubMeetingCommandServiceImpl` intentionally allows any club member to select or cancel topics for any team without verifying team membership, as this is aligned with the functional requirements. Team membership verification is not required by design.
Applied to files:
src/main/java/checkmo/clubMeeting/internal/service/ClubMeetingQueryFacade.java
📚 Learning: 2025-08-12T05:58:00.131Z
Learnt from: zjhj0814
Repo: checkmo2025/BE PR: 82
File: src/main/java/checkmo/domain/club/service/command/ClubMeetingCommandServiceImpl.java:257-259
Timestamp: 2025-08-12T05:58:00.131Z
Learning: In the checkmo2025/BE project, the `getNicknameToClubMember` method in `ClubMemberQueryService` already validates that all provided nicknames exist and throws `GeneralException` with `ErrorStatus.CLUB_MEMBER_NOT_FOUND` if any nickname cannot be resolved to a ClubMember in the specified club. Additional null-checking validation after calling this method is unnecessary.
Applied to files:
src/main/java/checkmo/clubMeeting/internal/service/ClubMeetingQueryFacade.javasrc/main/java/checkmo/clubManagement/internal/service/ClubManagementQueryFacade.javasrc/main/java/checkmo/clubManagement/internal/entity/ClubMember.java
📚 Learning: 2025-08-08T12:11:48.584Z
Learnt from: MODUGGAGI
Repo: checkmo2025/BE PR: 67
File: src/main/java/checkmo/domain/member/converter/MemberConverter.java:130-136
Timestamp: 2025-08-08T12:11:48.584Z
Learning: In checkmo project, MemberConverter.toWithFollowStatusDTO(Object[] row, boolean) is only called after upstream validation guarantees the row is non-null with at least 3 columns in the order [memberId, nickname, profileImageUrl]. By schema, nickname (and memberId) are NOT NULL; profileImageUrl may be null. Therefore additional null/length checks in this converter are unnecessary.
Applied to files:
src/main/java/checkmo/clubManagement/internal/converter/ClubManagementConverter.java
📚 Learning: 2025-07-31T08:27:26.185Z
Learnt from: zjhj0814
Repo: checkmo2025/BE PR: 39
File: src/main/java/checkmo/domain/club/entity/meeting/Topic.java:29-29
Timestamp: 2025-07-31T08:27:26.185Z
Learning: In the Topic entity, Setter annotations on relationship fields (meeting and clubMember) are acceptable when parent entities (Meeting and ClubMember) implement convenience methods like addTopic() that properly manage both sides of the bidirectional relationship.
Applied to files:
src/main/java/checkmo/clubManagement/internal/entity/ClubMember.java
📚 Learning: 2025-07-29T15:33:03.538Z
Learnt from: chaechaen
Repo: checkmo2025/BE PR: 35
File: src/main/java/checkmo/domain/member/service/security/auth/ProfileCompletionAuthorizationFilter.java:50-55
Timestamp: 2025-07-29T15:33:03.538Z
Learning: In the checkmo project, PrincipalDetails class is designed to always contain a non-null Member instance. The constructor requires a Member parameter and the field is final, so getMember() cannot return null. Null safety checks are not needed when accessing Member methods through PrincipalDetails.
Applied to files:
src/main/java/checkmo/clubManagement/internal/entity/ClubMember.java
📚 Learning: 2025-08-12T05:29:24.924Z
Learnt from: zjhj0814
Repo: checkmo2025/BE PR: 82
File: src/main/java/checkmo/domain/club/entity/meeting/Team.java:58-60
Timestamp: 2025-08-12T05:29:24.924Z
Learning: In the checkmo2025/BE project, when using orphanRemoval=true on JPA relationships, it's acceptable to only manage the owning side of the bidirectional relationship (like in Team.clearMemberTeams()) if the inverse side collection is LAZY-loaded and not accessed within the same transaction. This avoids performance overhead while relying on JPA's orphan removal for cleanup.
Applied to files:
src/main/java/checkmo/clubManagement/internal/entity/ClubMember.java
📚 Learning: 2025-08-10T09:18:24.237Z
Learnt from: zjhj0814
Repo: checkmo2025/BE PR: 69
File: src/main/java/checkmo/domain/club/entity/meeting/BookReview.java:13-13
Timestamp: 2025-08-10T09:18:24.237Z
Learning: In the checkmo2025/BE project, the `BookReview` entity's `EqualsAndHashCode(of = "id")` annotation is intentionally used because equals() is only called for List.remove() operations with already-persisted entities (영속화 상태의 객체), not with transient entities. The id-based equality comparison is safe in this specific use case.
Applied to files:
src/main/java/checkmo/clubManagement/internal/entity/ClubMember.java
📚 Learning: 2025-08-08T12:19:43.388Z
Learnt from: MODUGGAGI
Repo: checkmo2025/BE PR: 67
File: src/main/java/checkmo/domain/member/web/dto/MemberResponseDTO.java:5-5
Timestamp: 2025-08-08T12:19:43.388Z
Learning: Project decision (checkmo2025/BE): In MemberSharedDTO.WithFollowStatusDTO, JSON 응답 필드는 'isFollowing'가 아니라 'following'으로 통일한다. JsonProperty로 'isFollowing'를 유지하려는 시도는 Jackson이 필드와 게터를 동시에 직렬화하여 중복 필드를 야기하므로 사용하지 않는다.
Applied to files:
src/main/java/checkmo/clubManagement/web/dto/ClubResponseDTO.java
🧬 Code graph analysis (1)
src/main/java/checkmo/clubManagement/internal/service/ClubManagementQueryFacade.java (1)
src/main/java/checkmo/clubManagement/ClubManagementExternalDTO.java (1)
ClubManagementExternalDTO(12-41)
🔇 Additional comments (6)
src/main/java/checkmo/clubManagement/web/dto/ClubResponseDTO.java (1)
11-12: LGTM!Import reorganization and removal of
BookRecommendListandBookRecommendDetailnested classes aligns with the feature removal objective. The remaining DTOs are properly structured.src/main/java/checkmo/clubManagement/internal/service/ClubManagementQueryFacade.java (1)
21-24: LGTM!Clean removal of book recommendation dependencies (
BookAPI,BookExternalDTO,ClubBookRecommendQueryService) and related query methods. The remaining club and member query functionality is well-structured.src/main/java/checkmo/clubManagement/internal/converter/ClubManagementConverter.java (1)
8-16: LGTM!Import reorganization and removal of
toBookRecommendandtoBookRecommendDetailDTOmethods aligns with the feature removal. Static imports forBasicInfoandMembershipInfoimprove readability.src/main/java/checkmo/clubManagement/internal/entity/ClubMember.java (1)
4-5: LGTM!Clean removal of the
bookRecommendsone-to-many relationship field. The entity structure is now simplified, and the wildcard imports consolidate the JPA and Lombok annotations appropriately.src/main/resources/db/migration/V20251129__drop_book_recommend.sql (1)
1-1: No issues found — the migration is safe to execute.The
book_recommendtable has one foreign key constraint (FK_book_recommend_club_memberreferencingclub_member), but this is an outgoing constraint that will be dropped with the table. No other tables have incoming foreign key references tobook_recommend, andDROP TABLE IF EXISTSwill execute successfully.src/main/java/checkmo/clubMeeting/internal/service/ClubMeetingQueryFacade.java (1)
1-611:retrieveCalendarMeetingmethod removal is complete—no callers remain.All references have been successfully removed. No controllers, tests, or other service layers call this method. Note: The
CalendarMeetingDTO class still exists inMeetingResponseDTO.java(line 57) and can be removed as well since it's no longer used.
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.
Pull request overview
This PR removes legacy features that are no longer needed, specifically the book recommendation feature and the meeting calendar view endpoint. The changes include dropping the book_recommend database table via migration, deleting all related controller endpoints, service methods, repositories, entities, DTOs, and error codes.
Key changes:
- Removed complete book recommendation feature including controller, services, repositories, and entity
- Deleted meeting calendar endpoint (
/api/clubs/{clubId}/calendar) - Cleaned up related DTOs, error status codes, and entity relationships
Reviewed changes
Copilot reviewed 16 out of 16 changed files in this pull request and generated 4 comments.
Show a summary per file
| File | Description |
|---|---|
| src/main/resources/db/migration/V20251129__drop_book_recommend.sql | Adds migration to drop the book_recommend table |
| src/main/java/checkmo/clubMeeting/web/controller/ClubMeetingController.java | Removes calendar endpoint and cleans up imports with wildcard usage |
| src/main/java/checkmo/clubMeeting/internal/service/ClubMeetingQueryFacade.java | Deletes retrieveCalendarMeeting method and reorganizes imports |
| src/main/java/checkmo/clubManagement/web/dto/ClubResponseDTO.java | Removes BookRecommendList and BookRecommendDetail DTOs |
| src/main/java/checkmo/clubManagement/web/dto/ClubRequestDTO.java | Removes CreateBookRecommend and UpdateBookRecommend DTOs |
| src/main/java/checkmo/clubManagement/web/controller/ClubRecommendationController.java | Deletes entire controller for book recommendations |
| src/main/java/checkmo/clubManagement/internal/service/query/ClubBookRecommendQueryService.java | Deletes query service for book recommendations |
| src/main/java/checkmo/clubManagement/internal/service/command/ClubBookRecommendCommandService.java | Deletes command service for book recommendations |
| src/main/java/checkmo/clubManagement/internal/service/ClubManagementQueryFacade.java | Removes book recommendation retrieval methods and related dependencies |
| src/main/java/checkmo/clubManagement/internal/repository/BookRecommendRepositoryCustomImpl.java | Deletes custom repository implementation |
| src/main/java/checkmo/clubManagement/internal/repository/BookRecommendRepositoryCustom.java | Deletes custom repository interface |
| src/main/java/checkmo/clubManagement/internal/repository/BookRecommendRepository.java | Deletes JPA repository |
| src/main/java/checkmo/clubManagement/internal/excepetion/ClubManagementErrorStatus.java | Removes book recommendation error codes |
| src/main/java/checkmo/clubManagement/internal/entity/ClubMember.java | Removes BookRecommend relationship from ClubMember entity |
| src/main/java/checkmo/clubManagement/internal/entity/BookRecommend.java | Deletes BookRecommend entity |
| src/main/java/checkmo/clubManagement/internal/converter/ClubManagementConverter.java | Removes book recommendation converter methods |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| import org.springframework.web.bind.annotation.RequestMapping; | ||
| import org.springframework.web.bind.annotation.RequestParam; | ||
| import org.springframework.web.bind.annotation.RestController; | ||
| import org.springframework.web.bind.annotation.*; |
Copilot
AI
Dec 30, 2025
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.
Using wildcard imports import org.springframework.web.bind.annotation.*; instead of explicit imports makes it harder to understand which annotations are actually used in the class and can lead to naming conflicts. Consider keeping the explicit imports as they were before, which is generally considered a best practice in Java.
| import org.springframework.web.bind.annotation.*; | |
| import org.springframework.web.bind.annotation.DeleteMapping; | |
| import org.springframework.web.bind.annotation.GetMapping; | |
| import org.springframework.web.bind.annotation.ModelAttribute; | |
| import org.springframework.web.bind.annotation.PatchMapping; | |
| import org.springframework.web.bind.annotation.PathVariable; | |
| import org.springframework.web.bind.annotation.PostMapping; | |
| import org.springframework.web.bind.annotation.PutMapping; | |
| import org.springframework.web.bind.annotation.RequestBody; | |
| import org.springframework.web.bind.annotation.RequestHeader; | |
| import org.springframework.web.bind.annotation.RequestMapping; | |
| import org.springframework.web.bind.annotation.RequestParam; | |
| import org.springframework.web.bind.annotation.RestController; |
| import lombok.AccessLevel; | ||
| import lombok.NoArgsConstructor; | ||
|
|
||
| import java.util.List; | ||
| import java.util.Map; | ||
| import java.util.stream.Collectors; | ||
| import lombok.AccessLevel; | ||
| import lombok.NoArgsConstructor; | ||
|
|
||
| import static checkmo.clubManagement.ClubManagementExternalDTO.BasicInfo; | ||
| import static checkmo.clubManagement.ClubManagementExternalDTO.MembershipInfo; |
Copilot
AI
Dec 30, 2025
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.
Using wildcard imports import checkmo.clubManagement.internal.entity.*; and import java.util.*; instead of explicit imports makes it harder to understand which classes are actually used and can lead to naming conflicts. Consider keeping explicit imports for better code clarity and maintainability.
| import lombok.NoArgsConstructor; | ||
| import lombok.Setter; | ||
| import jakarta.persistence.*; | ||
| import lombok.*; |
Copilot
AI
Dec 30, 2025
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.
Using wildcard imports import lombok.*; instead of explicit imports makes it harder to understand which Lombok annotations are actually used and can lead to naming conflicts. Consider keeping explicit imports for better code clarity and maintainability.
| import lombok.*; | |
| import lombok.AccessLevel; | |
| import lombok.AllArgsConstructor; | |
| import lombok.Builder; | |
| import lombok.Getter; | |
| import lombok.NoArgsConstructor; | |
| import lombok.Setter; |
🚀 변경사항
🔗 관련 이슈
✅ 체크리스트
📝 특이사항
Summary by CodeRabbit
✏️ Tip: You can customize this high-level summary in your review settings.