Skip to content

Conversation

@zjhj0814
Copy link
Collaborator

@zjhj0814 zjhj0814 commented Dec 30, 2025

🚀 변경사항

  • 책 추천 테이블 drop
  • 책 추천 기능 삭제
  • 미팅 캘린더 형태 조회 삭제

🔗 관련 이슈

✅ 체크리스트

  • 로컬에서 테스트 완료
  • 코드 리뷰 준비 완료

📝 특이사항

Summary by CodeRabbit

  • Breaking Changes
    • Book recommendation functionality (including creation, updates, and deletion) removed from clubs
    • Calendar view endpoint for club meeting schedules removed

✏️ Tip: You can customize this high-level summary in your review settings.

@zjhj0814 zjhj0814 self-assigned this Dec 30, 2025
@zjhj0814 zjhj0814 added the 🔥 remove Remove code or file label Dec 30, 2025
@coderabbitai
Copy link

coderabbitai bot commented Dec 30, 2025

📝 Walkthrough

Walkthrough

This 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

Cohort / File(s) Summary
Book Recommendation Entity & Repository
src/main/java/checkmo/clubManagement/internal/entity/BookRecommend.java, src/main/java/checkmo/clubManagement/internal/repository/BookRecommendRepository.java, src/main/java/checkmo/clubManagement/internal/repository/BookRecommendRepositoryCustom.java, src/main/java/checkmo/clubManagement/internal/repository/BookRecommendRepositoryCustomImpl.java
Removed BookRecommend entity class, JPA repository interface, custom repository interface, and custom repository implementation with paginated cursor-based query logic.
Book Recommendation Services
src/main/java/checkmo/clubManagement/internal/service/query/ClubBookRecommendQueryService.java, src/main/java/checkmo/clubManagement/internal/service/command/ClubBookRecommendCommandService.java
Removed query service (with retrieve/list methods) and command service (with create/update/delete methods) for book recommendation domain logic.
Book Recommendation Facade & Converter
src/main/java/checkmo/clubManagement/internal/service/ClubManagementQueryFacade.java, src/main/java/checkmo/clubManagement/internal/converter/ClubManagementConverter.java
Removed two public facade methods (retrieveBookRecommedList, retrieveBookRecommendDetail) and two converter methods (toBookRecommend, toBookRecommendDetailDTO); dropped related BookAPI dependency.
Book Recommendation Controller & DTOs
src/main/java/checkmo/clubManagement/web/controller/ClubRecommendationController.java, src/main/java/checkmo/clubManagement/web/dto/ClubRequestDTO.java, src/main/java/checkmo/clubManagement/web/dto/ClubResponseDTO.java
Removed entire REST controller for /api/clubs/{clubId}/recommendations endpoints; removed CreateBookRecommend and UpdateBookRecommend request DTOs; removed BookRecommendList and BookRecommendDetail response DTOs.
Related Entity Changes
src/main/java/checkmo/clubManagement/internal/entity/ClubMember.java
Removed one-to-many relationship field bookRecommends; added missing @Entity, @AllArgsConstructor, and @NoArgsConstructor(access = PROTECTED) annotations; consolidated jakarta.persistence and lombok imports to wildcards.
Error Handling
src/main/java/checkmo/clubManagement/internal/excepetion/ClubManagementErrorStatus.java
Removed two enum constants: CLUB_BOOK_RECOMMEND_NOT_FOUND and CLUB_BOOK_RECOMMEND_FORBIDDEN.
Meeting Calendar Feature
src/main/java/checkmo/clubMeeting/internal/service/ClubMeetingQueryFacade.java, src/main/java/checkmo/clubMeeting/web/controller/ClubMeetingController.java
Removed retrieveCalendarMeeting method from facade; removed getClubCalendar endpoint handler from controller; consolidated imports to wildcards.
Database Migration
src/main/resources/db/migration/V20251129__drop_book_recommend.sql
Added SQL migration to drop the book_recommend table.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

  • #115: Modifies the same BookRecommend repository, service, facade, and converter components affected by this removal
  • #26: Originally introduced the book recommendation entity, repository, and services that are now being removed
  • #29: Updated BookRecommend conversion logic that is now being eliminated

Suggested labels

♻️ refactor

Suggested reviewers

  • Yoon0221
  • chaechaen
  • MODUGGAGI

Poem

🐰 A rabbit hops through the code with glee,
Removing features that no longer be!
Book recommendations fade to the past,
Calendar queries removed at last,
Clean migrations make the future bright,
Our codebase leaps lighter, left and right! 🎉

Pre-merge checks and finishing touches

❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. You can run @coderabbitai generate docstrings to improve docstring coverage.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title accurately summarizes the main changes: removal of legacy book recommendation and meeting calendar features as indicated throughout the changeset.
Description check ✅ Passed The description follows the template with all required sections completed: changes summary, linked issue reference, and checklist marked as done.
Linked Issues check ✅ Passed The pull request fully addresses all coding requirements from issue #132: drops book_recommend table, removes all book recommendation code, and deletes meeting calendar query functionality.
Out of Scope Changes check ✅ Passed All changes directly correspond to the stated objectives of removing legacy features. Import reorganizations and minor code cleanups are naturally scoped within the feature removal.
✨ Finishing touches
  • 📝 Generate docstrings

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@gemini-code-assist
Copy link

Summary of Changes

Hello @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

  • 책 추천 기능 제거: 더 이상 사용되지 않는 책 추천 관련 모든 기능이 코드베이스에서 완전히 제거되었습니다. 여기에는 엔티티, 리포지토리, 서비스, 컨트롤러 및 관련 DTO가 포함됩니다.
  • 미팅 캘린더 조회 기능 제거: 미팅 캘린더 형태 조회 기능이 제거되어, 관련 서비스 메서드와 컨트롤러 엔드포인트가 삭제되었습니다.
  • 데이터베이스 스키마 변경: 책 추천 기능 제거에 따라 book_recommend 테이블을 삭제하는 마이그레이션 스크립트가 추가되었습니다.

🧠 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 Assist

The 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 /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

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 .gemini/ folder in the base of the repository. Detailed instructions can be found here.

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

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

@zjhj0814 zjhj0814 changed the title Refactor/132/remove legacy features refactor: 레거시 기능 삭제 Dec 30, 2025
@zjhj0814 zjhj0814 changed the title refactor: 레거시 기능 삭제 refactor: 레거시 기능(책 추천, 미팅 캘린더) 삭제 Dec 30, 2025
Copy link

@gemini-code-assist gemini-code-assist bot left a 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)와 데이터베이스 마이그레이션 스크립트까지 깔끔하게 삭제되어 코드베이스가 정리된 점이 좋습니다.

다만, 일부 파일에서 와일드카드(*) 임포트를 사용하는 것으로 변경되었는데, 이는 코드의 가독성과 유지보수성을 저해할 수 있습니다. 명시적으로 클래스를 임포트하는 방식을 유지하는 것이 좋습니다. 자세한 내용은 각 파일에 대한 리뷰 코멘트를 참고해주세요.

Comment on lines +4 to +5
import jakarta.persistence.*;
import lombok.*;

Choose a reason for hiding this comment

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

medium

와일드카드(*)를 사용한 임포트는 코드의 가독성을 해치고, 잠재적인 이름 충돌을 야기할 수 있습니다. 필요한 클래스들을 명시적으로 임포트하는 것이 좋습니다. 예를 들어, 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.*;

Choose a reason for hiding this comment

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

medium

와일드카드(*)를 사용한 임포트는 코드의 가독성을 해치고, 잠재적인 이름 충돌을 야기할 수 있습니다. 필요한 클래스들을 명시적으로 임포트하는 것이 좋습니다.

Suggested change
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.*;

Choose a reason for hiding this comment

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

medium

java.util에 대한 와일드카드 임포트도 명시적으로 변경하는 것을 권장합니다. 이렇게 하면 어떤 클래스가 사용되는지 명확하게 알 수 있어 코드 유지보수에 도움이 됩니다.

Suggested change
import java.util.*;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

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.*;

Choose a reason for hiding this comment

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

medium

와일드카드(*)를 사용한 임포트는 코드의 가독성을 해치고, 잠재적인 이름 충돌을 야기할 수 있습니다. 필요한 어노테이션들을 명시적으로 임포트하는 것이 좋습니다.

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;

Copy link

@coderabbitai coderabbitai bot left a 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 getClubCalendar endpoint 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 getClubCalendar endpoint has been successfully removed with no orphaned method or path references. However, the CalendarMeeting inner class in src/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, and participants are binary flags (0 or 1), but Integer allows any value. Consider either:

  1. Using Boolean type with null defaulting to false, or
  2. 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.* and import 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

📥 Commits

Reviewing files that changed from the base of the PR and between ef38688 and 4b576e7.

📒 Files selected for processing (16)
  • src/main/java/checkmo/clubManagement/internal/converter/ClubManagementConverter.java
  • src/main/java/checkmo/clubManagement/internal/entity/BookRecommend.java
  • src/main/java/checkmo/clubManagement/internal/entity/ClubMember.java
  • src/main/java/checkmo/clubManagement/internal/excepetion/ClubManagementErrorStatus.java
  • src/main/java/checkmo/clubManagement/internal/repository/BookRecommendRepository.java
  • src/main/java/checkmo/clubManagement/internal/repository/BookRecommendRepositoryCustom.java
  • src/main/java/checkmo/clubManagement/internal/repository/BookRecommendRepositoryCustomImpl.java
  • src/main/java/checkmo/clubManagement/internal/service/ClubManagementQueryFacade.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/web/controller/ClubRecommendationController.java
  • src/main/java/checkmo/clubManagement/web/dto/ClubRequestDTO.java
  • src/main/java/checkmo/clubManagement/web/dto/ClubResponseDTO.java
  • src/main/java/checkmo/clubMeeting/internal/service/ClubMeetingQueryFacade.java
  • src/main/java/checkmo/clubMeeting/web/controller/ClubMeetingController.java
  • src/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.java
  • src/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.java
  • src/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.java
  • src/main/java/checkmo/clubManagement/internal/service/ClubManagementQueryFacade.java
  • src/main/java/checkmo/clubManagement/web/dto/ClubRequestDTO.java
  • src/main/java/checkmo/clubManagement/internal/converter/ClubManagementConverter.java
  • src/main/java/checkmo/clubManagement/internal/entity/ClubMember.java
  • src/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.java
  • src/main/java/checkmo/clubManagement/internal/service/ClubManagementQueryFacade.java
  • src/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.java
  • src/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.java
  • src/main/java/checkmo/clubManagement/internal/service/ClubManagementQueryFacade.java
  • src/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 BookRecommendList and BookRecommendDetail nested 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 toBookRecommend and toBookRecommendDetailDTO methods aligns with the feature removal. Static imports for BasicInfo and MembershipInfo improve readability.

src/main/java/checkmo/clubManagement/internal/entity/ClubMember.java (1)

4-5: LGTM!

Clean removal of the bookRecommends one-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_recommend table has one foreign key constraint (FK_book_recommend_club_member referencing club_member), but this is an outgoing constraint that will be dropped with the table. No other tables have incoming foreign key references to book_recommend, and DROP TABLE IF EXISTS will execute successfully.

src/main/java/checkmo/clubMeeting/internal/service/ClubMeetingQueryFacade.java (1)

1-611: retrieveCalendarMeeting method removal is complete—no callers remain.

All references have been successfully removed. No controllers, tests, or other service layers call this method. Note: The CalendarMeeting DTO class still exists in MeetingResponseDTO.java (line 57) and can be removed as well since it's no longer used.

Copy link

Copilot AI left a 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.*;
Copy link

Copilot AI Dec 30, 2025

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.

Suggested change
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;

Copilot uses AI. Check for mistakes.
Comment on lines +8 to +16
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;
Copy link

Copilot AI Dec 30, 2025

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.

Copilot uses AI. Check for mistakes.
import lombok.NoArgsConstructor;
import lombok.Setter;
import jakarta.persistence.*;
import lombok.*;
Copy link

Copilot AI Dec 30, 2025

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.

Suggested change
import lombok.*;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

Copilot uses AI. Check for mistakes.
@zjhj0814 zjhj0814 merged commit 17ff547 into develop Jan 1, 2026
7 checks passed
@zjhj0814 zjhj0814 deleted the refactor/132/remove-legacy-features branch January 1, 2026 13:56
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

🔥 remove Remove code or file

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[REFACTOR] 책 추천, 미팅 캘린더 기능 삭제

2 participants