Conversation
- 테스트 코드도 함께 제거
…om/Moadong/moadong into feature/#470-always-recruit-MOA-18
[feature] 상시 모집 상태 추가 및 모집 정보 변경 시 반영되도록 변경
- recruitmentStatus -> clubRecruitmentStatus
[fix] 동아리 상태로 검색안되는 오류 수정
[refactor] club api 리팩토링
[fix] safari에서 쿠키저장안되는 문제 수정
|
Warning
|
✅ Deploy Preview for moadong ready!
To edit notification comments on pull requests, go to your Netlify project configuration. |
There was a problem hiding this comment.
Actionable comments posted: 14
🔭 Outside diff range comments (4)
backend/src/main/java/moadong/media/service/GoogleDriveClubImageService.java (1)
1-174: 주석 처리된 GoogleDrive 서비스 구현 삭제 필요Google Drive 기반 이미지 처리 로직 전체가 주석 처리된 채로 남아 있어 코드베이스 유지보수 부담을 증가시키고 혼선을 초래합니다. 이미 Cloudflare 및 GCS 구현이 존재하므로, Git 히스토리를 통해 보존하고 다음 항목을 정리하세요.
• 삭제 대상 파일
backend/src/main/java/moadong/media/service/GoogleDriveClubImageService.javabackend/src/main/java/moadong/media/util/GoogleDriveConfig.java(주석 처리된 메서드 포함)• 불필요해진 설정 프로퍼티 제거
google.drive.share-file-id등 관련 키 확인 후application.yml/.properties에서 삭제• Git 히스토리에서 필요 시 과거 구현 복구 가능하므로, 코드베이스에는 삭제만 적용
backend/src/main/java/moadong/media/service/GcsClubImageService.java (1)
1-161: 주석 처리된 서비스 파일 정리 필요클라우드 이미지 서비스 구현을 Google Cloud Storage(Cloudflare)로 완전히 이전한 상태라면, 기존에 주석 처리해 둔 두 서비스 파일은 유지보수 부담과 혼동의 원인이 됩니다. 아래 파일들을 삭제하거나 별도 보관 브랜치로 이전해주세요.
- backend/src/main/java/moadong/media/service/GcsClubImageService.java
- backend/src/main/java/moadong/media/service/GoogleDriveClubImageService.java
backend/src/test/java/moadong/media/service/CloudflareClubImageServiceLogoTest.java (1)
14-14: 사용하지 않는 Google Drive 임포트를 제거하세요.Google Drive에서 Cloudflare로 마이그레이션했으므로
com.google.api.services.drive.Drive임포트는 더 이상 필요하지 않습니다.-import com.google.api.services.drive.Drive;backend/src/test/java/moadong/unit/club/ClubProfileServiceTest.java (1)
32-56: 모집 정보 업데이트 테스트가 누락되었습니다.
ClubProfileService.updateClubRecruitmentInfo메서드가RecruitmentStateCalculator를 호출하도록 변경되었지만, 이에 대한 테스트가 없습니다. 모집 상태가 올바르게 계산되는지 확인하는 테스트를 추가해야 합니다.모집 정보 업데이트와 상태 계산을 검증하는 테스트 코드를 생성해드릴까요?
♻️ Duplicate comments (1)
backend/src/main/java/moadong/club/service/ClubApplyService.java (1)
206-208: 코드 중복 리팩토링 계획 확인이전 PR에서 언급된 대로
createQuestions와updateQuestions메서드 간의 중복이 여전히 존재합니다. 향후 리팩토링 계획이 있다는 것을 인지하고 있습니다.
🧹 Nitpick comments (14)
backend/Dockerfile (1)
1-2: ARM 지원을 위한 베이스 이미지 교체 👍
eclipse-temurin:17-jdk로 교체하여 ARM/AMD 다중 플랫폼 빌드 전략과 일관성을 맞춘 점 매우 좋습니다.
주석의 ‘빌드를위해’ 오타만 사소하게 눈에 띕니다. 필요하다면 다음처럼 띄어쓰기를 보강해 주세요.-#ARM 빌드를위해 ARM 지원되는 jdk 사용 +# ARM 빌드를 위해 ARM 지원되는 JDK 사용backend/src/main/java/moadong/club/payload/request/ClubRecruitmentInfoUpdateRequest.java (1)
5-5: 엔티티를 요청 페이로드에 직접 사용하는 것을 재고해보세요.
Faq엔티티를 요청 클래스에서 직접 사용하면 프레젠테이션 계층과 엔티티 계층 간의 결합도가 높아집니다. DTO 클래스 사용을 고려해보세요.별도의
FaqRequestDTO 클래스를 생성하여 사용하는 것이 더 좋은 아키텍처입니다:public record FaqRequest( @NotBlank @Size(max = 200) String question, @NotBlank @Size(max = 1000) String answer ) {}backend/src/main/java/moadong/club/repository/ClubApplicationRepository.java (1)
10-11: MongoDB 쿼리 메서드가 올바르게 구현되었습니다.
questionId로 지원서를 조회하고 DRAFT 상태를 제외하는 로직이 적절합니다. 쿼리 문법과 메서드명도 올바릅니다.메서드에 대한 문서화를 추가하는 것을 권장합니다:
+ /** + * 특정 질문 ID에 대한 모든 지원서를 조회합니다 (초안 상태 제외). + * @param questionId 조회할 질문 ID + * @return 해당 질문에 대한 지원서 목록 + */ @Query("{ 'questionId': ?0, 'status': { $exists: true, $ne: 'DRAFT' } }") List<ClubApplication> findAllByQuestionId(String questionId);backend/src/main/java/moadong/club/controller/ClubSearchController.java (1)
6-6: 사용되지 않는 import 정리 필요
ClubRecruitmentStatusimport가 추가되었지만 이 파일에서 사용되지 않고 있습니다.사용되지 않는 import를 제거해주세요:
-import moadong.club.enums.ClubRecruitmentStatus;backend/src/main/java/moadong/club/payload/dto/ClubDetailedResult.java (2)
4-4: 미사용 import 제거 필요
ArrayListimport가 코드에서 사용되지 않고 있습니다.-import java.util.ArrayList;
47-48: 중복된 null 체크 로직을 간소화할 수 있습니다
cover와faqs필드 설정에서 중복된 null 체크 패턴이 보입니다. 특히faqs필드의 경우 이미club.getClubRecruitmentInformation()가 null이 아님이 보장되므로 더 간단하게 작성할 수 있습니다..cover(clubRecruitmentInformation.getCover() == null ? "" - : clubRecruitmentInformation.getCover()) + : clubRecruitmentInformation.getCover()) -.faqs(club.getClubRecruitmentInformation().getFaqs() == null ? List.of() - : club.getClubRecruitmentInformation().getFaqs()) +.faqs(clubRecruitmentInformation.getFaqs() == null ? List.of() + : clubRecruitmentInformation.getFaqs())Also applies to: 72-73
backend/src/main/java/moadong/club/entity/Club.java (1)
85-86: enum.name() 사용 시 리팩토링 안전성 고려enum의
name()메서드를 사용하여 데이터베이스에 저장하는 방식은 enum 값의 이름이 변경될 때 데이터 무결성 문제를 야기할 수 있습니다.enum에 별도의 저장용 코드를 추가하는 것을 고려해보세요:
// ClubCategory enum에서 @Getter public enum ClubCategory { ACADEMIC("학술"), SPORTS("체육"); private final String code; ClubCategory(String code) { this.code = code; } } // Club 엔티티에서 this.category = request.category().getCode(); this.division = request.division().getCode();backend/src/main/java/moadong/club/payload/dto/ClubApplicantsResult.java (1)
32-35: 더 구체적인 예외 처리를 권장합니다.현재 모든 예외를
Exception으로 잡고 있는데, AES 암호화 관련 예외만 처리하도록 더 구체적인 예외 타입을 사용하는 것이 좋습니다.다음과 같이 수정하는 것을 고려해보세요:
- } catch (Exception e) { + } catch (GeneralSecurityException | IllegalArgumentException e) { log.error("AES_CIPHER_ERROR", e); throw new RestApiException(ErrorCode.AES_CIPHER_ERROR); }필요한 import 추가:
import java.security.GeneralSecurityException;backend/src/main/java/moadong/club/service/ClubApplyService.java (2)
79-82: 더 구체적인 예외 처리를 권장합니다.
ClubApplicantsResult와 동일하게 모든 예외를Exception으로 잡고 있습니다. AES 암호화 관련 예외만 처리하도록 개선이 필요합니다.다음과 같이 수정하는 것을 고려해보세요:
- } catch (Exception e) { + } catch (GeneralSecurityException | IllegalArgumentException e) { log.error("AES_CIPHER_ERROR", e); throw new RestApiException(ErrorCode.AES_CIPHER_ERROR); }
110-114: switch 문에 default case 추가를 권장합니다.현재 switch 문이 모든
ApplicationStatus값을 처리하지 않을 수 있습니다. 향후 새로운 상태가 추가될 경우를 대비해 default case를 추가하는 것이 좋습니다.다음과 같이 수정하는 것을 고려해보세요:
switch (app.getStatus()) { case SUBMITTED, SCREENING -> reviewRequired++; case SCREENING_PASSED, INTERVIEW_SCHEDULED, INTERVIEW_IN_PROGRESS -> scheduledInterview++; case INTERVIEW_PASSED, OFFERED, ACCEPTED -> accepted++; + default -> log.warn("Unknown application status: {}", app.getStatus()); }backend/src/test/java/moadong/media/service/CloudflareClubImageServiceLogoTest.java (1)
36-131: 커버 이미지 업로드/삭제 기능에 대한 테스트 추가를 고려하세요.AI 요약에 따르면
ClubImageService인터페이스가 커버 이미지 업로드/삭제를 지원하도록 확장되었습니다. 현재 테스트는 로고 작업만 다루고 있으므로, 새로운 커버 이미지 기능에 대한 테스트 메서드 추가를 권장합니다.커버 이미지 기능에 대한 테스트 코드를 생성하거나 이를 추적하기 위한 새 이슈를 열어드릴까요?
backend/src/main/java/moadong/club/util/RecruitmentStateCalculator.java (2)
11-11: 매직 넘버에 대한 문서화를 추가하세요.
ALWAYS_RECRUIT_YEAR = 2999는 상시 모집을 나타내는 특별한 값이지만, 왜 이 특정 연도를 사용하는지 명확하지 않습니다. JavaDoc 주석을 추가하여 이 값의 의미와 선택 이유를 문서화하는 것이 좋겠습니다.+ /** + * 상시 모집을 나타내는 특별한 연도 값. + * 종료일이 이 연도로 설정되면 클럽은 항상 모집 중인 것으로 간주됩니다. + */ public static final int ALWAYS_RECRUIT_YEAR = 2999;
32-36: 조건문을 단순화할 수 있습니다.현재 시간이 시작일 이후이고 종료일 이전이 아닌 경우는 종료일 이후일 수밖에 없으므로, 마지막 else-if를 else로 변경할 수 있습니다.
- } else if (now.isAfter(recruitmentStartDate) && now.isBefore(recruitmentEndDate)) { + } else if (now.isBefore(recruitmentEndDate)) { club.updateRecruitmentStatus(ClubRecruitmentStatus.OPEN); - } else if (now.isAfter(recruitmentEndDate)) { + } else { club.updateRecruitmentStatus(ClubRecruitmentStatus.CLOSED); }backend/src/test/java/moadong/unit/club/ClubProfileServiceTest.java (1)
58-90: 주석 처리된 테스트 코드를 정리하세요.주석 처리된 테스트 코드가 많은 공간을 차지하고 있습니다. TODO 코멘트에 따르면 시간 계산 방식 변경 후 활성화할 예정이라고 하는데, 이런 코드는 버전 관리 시스템에서 관리하는 것이 더 적절합니다.
이 코드를 제거하고 필요시 git 히스토리에서 복원하거나, 별도의 이슈로 관리하는 것을 권장합니다.
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (50)
.github/workflows/oracle_server_cd_develop.yml(1 hunks).github/workflows/server_cd_develop.yml(0 hunks).github/workflows/server_cd_release.yml(4 hunks)backend/Dockerfile(1 hunks)backend/build.gradle(1 hunks)backend/src/main/java/moadong/club/controller/ClubApplyController.java(3 hunks)backend/src/main/java/moadong/club/controller/ClubProfileController.java(4 hunks)backend/src/main/java/moadong/club/controller/ClubSearchController.java(2 hunks)backend/src/main/java/moadong/club/entity/Club.java(3 hunks)backend/src/main/java/moadong/club/entity/ClubQuestion.java(3 hunks)backend/src/main/java/moadong/club/entity/ClubRecruitmentInformation.java(4 hunks)backend/src/main/java/moadong/club/entity/Faq.java(1 hunks)backend/src/main/java/moadong/club/enums/ClubCategory.java(2 hunks)backend/src/main/java/moadong/club/enums/ClubDivision.java(1 hunks)backend/src/main/java/moadong/club/enums/ClubRecruitmentStatus.java(1 hunks)backend/src/main/java/moadong/club/payload/dto/ClubApplicantsResult.java(1 hunks)backend/src/main/java/moadong/club/payload/dto/ClubDetailedResult.java(4 hunks)backend/src/main/java/moadong/club/payload/request/ClubApplicationCreateRequest.java(1 hunks)backend/src/main/java/moadong/club/payload/request/ClubApplicationEditRequest.java(1 hunks)backend/src/main/java/moadong/club/payload/request/ClubApplyQuestion.java(2 hunks)backend/src/main/java/moadong/club/payload/request/ClubInfoRequest.java(1 hunks)backend/src/main/java/moadong/club/payload/request/ClubRecruitmentInfoUpdateRequest.java(1 hunks)backend/src/main/java/moadong/club/payload/response/ClubApplicationResponse.java(1 hunks)backend/src/main/java/moadong/club/payload/response/ClubApplyInfoResponse.java(1 hunks)backend/src/main/java/moadong/club/repository/ClubApplicationRepository.java(1 hunks)backend/src/main/java/moadong/club/repository/ClubSearchRepository.java(2 hunks)backend/src/main/java/moadong/club/service/ClubApplyService.java(7 hunks)backend/src/main/java/moadong/club/service/ClubProfileService.java(2 hunks)backend/src/main/java/moadong/club/service/RecruitmentStateChecker.java(2 hunks)backend/src/main/java/moadong/club/util/RecruitmentStateCalculator.java(1 hunks)backend/src/main/java/moadong/global/config/SecurityConfig.java(2 hunks)backend/src/main/java/moadong/global/exception/ErrorCode.java(1 hunks)backend/src/main/java/moadong/global/exception/GlobalExceptionHandler.java(2 hunks)backend/src/main/java/moadong/global/util/AESCipher.java(1 hunks)backend/src/main/java/moadong/global/util/JwtAuthenticationFilter.java(4 hunks)backend/src/main/java/moadong/media/controller/ClubImageController.java(1 hunks)backend/src/main/java/moadong/media/domain/FileType.java(1 hunks)backend/src/main/java/moadong/media/service/CloudflareImageService.java(1 hunks)backend/src/main/java/moadong/media/service/ClubImageService.java(1 hunks)backend/src/main/java/moadong/media/service/GcsClubImageService.java(1 hunks)backend/src/main/java/moadong/media/service/GoogleDriveClubImageService.java(1 hunks)backend/src/main/java/moadong/media/util/GoogleDriveConfig.java(1 hunks)backend/src/main/java/moadong/media/util/S3Config.java(1 hunks)backend/src/main/java/moadong/user/controller/UserController.java(0 hunks)backend/src/main/java/moadong/user/util/CookieMaker.java(1 hunks)backend/src/test/java/moadong/club/service/ClubSearchServiceTest.java(1 hunks)backend/src/test/java/moadong/fixture/ClubRequestFixture.java(2 hunks)backend/src/test/java/moadong/media/service/CloudflareClubImageServiceFeedTest.java(1 hunks)backend/src/test/java/moadong/media/service/CloudflareClubImageServiceLogoTest.java(1 hunks)backend/src/test/java/moadong/unit/club/ClubProfileServiceTest.java(2 hunks)
💤 Files with no reviewable changes (2)
- backend/src/main/java/moadong/user/controller/UserController.java
- .github/workflows/server_cd_develop.yml
🧰 Additional context used
🧠 Learnings (32)
📓 Common learnings
Learnt from: seongwon030
PR: Moadong/moadong#195
File: frontend/src/pages/AdminPage/AdminPage.tsx:7-7
Timestamp: 2025-03-19T05:18:07.818Z
Learning: AdminPage.tsx에서 현재 하드코딩된 클럽 ID('67d2e3b9b15c136c6acbf20b')는 로그인 기능 구현 후 동적으로 가져오는 방식으로 수정될 예정입니다.
backend/src/main/java/moadong/club/payload/request/ClubApplyQuestion.java (1)
Learnt from: lepitaaar
PR: #406
File: backend/src/main/java/moadong/club/service/ClubApplyService.java:34-38
Timestamp: 2025-05-19T05:45:52.957Z
Learning: The code duplication between createClubApplication and editClubApplication methods in ClubApplyService.java is acknowledged but will be addressed in a future refactoring, as per the developer's plan.
backend/src/main/java/moadong/club/controller/ClubApplyController.java (1)
Learnt from: lepitaaar
PR: #406
File: backend/src/main/java/moadong/club/service/ClubApplyService.java:34-38
Timestamp: 2025-05-19T05:45:52.957Z
Learning: The code duplication between createClubApplication and editClubApplication methods in ClubApplyService.java is acknowledged but will be addressed in a future refactoring, as per the developer's plan.
backend/src/main/java/moadong/club/enums/ClubRecruitmentStatus.java (1)
Learnt from: seongwon030
PR: #548
File: frontend/src/pages/ClubDetailPage/ClubDetailPage.tsx:17-57
Timestamp: 2025-07-19T05:05:10.196Z
Learning: ClubDetailPage.tsx에서 notJoinedClubNames 배열의 하드코딩은 의도적인 설계 결정입니다. 개발자가 명시적으로 하드코딩을 선택했으므로 이에 대한 리팩토링 제안을 하지 않아야 합니다.
backend/src/test/java/moadong/club/service/ClubSearchServiceTest.java (2)
Learnt from: Due-IT
PR: #329
File: backend/src/main/java/moadong/club/controller/ClubSearchController.java:0-0
Timestamp: 2025-05-01T08:32:09.398Z
Learning: ClubSearchController의 searchClubsByKeyword 메서드와 ClubSearchService의 searchClubsByKeyword 메서드 사이에 파라미터 순서 일치가 중요하다. 현재 컨트롤러의 매개변수 순서는 'keyword, recruitmentStatus, category, division'인 반면, 서비스 메서드의 순서는 'keyword, recruitmentStatus, division, category'이다. 컨트롤러에서 서비스 호출 시 'keyword, recruitmentStatus, division, category' 순서로 전달하면 category와 division 값이 바뀌어 검색 결과가 잘못될 수 있다.
Learnt from: lepitaaar
PR: #406
File: backend/src/main/java/moadong/club/service/ClubApplyService.java:34-38
Timestamp: 2025-05-19T05:45:52.957Z
Learning: The code duplication between createClubApplication and editClubApplication methods in ClubApplyService.java is acknowledged but will be addressed in a future refactoring, as per the developer's plan.
backend/src/main/java/moadong/club/payload/response/ClubApplicationResponse.java (2)
Learnt from: lepitaaar
PR: #406
File: backend/src/main/java/moadong/club/service/ClubApplyService.java:34-38
Timestamp: 2025-05-19T05:45:52.957Z
Learning: The code duplication between createClubApplication and editClubApplication methods in ClubApplyService.java is acknowledged but will be addressed in a future refactoring, as per the developer's plan.
Learnt from: Zepelown
PR: #406
File: backend/src/main/java/moadong/club/entity/ClubApplicationQuestion.java:32-33
Timestamp: 2025-05-15T12:03:57.356Z
Learning: 엔티티 클래스는 요청/응답 객체(DTO)에 의존해서는 안 됩니다. 계층 간 의존성 문제를 방지하기 위해 엔티티와 DTO는 분리되어야 합니다. 예를 들어, ClubApplicationQuestion 엔티티가 ClubApplicationRequest.Options와 같은 요청 객체를 직접 참조하는 대신, 엔티티 패키지 내에 QuestionOptions와 같은 별도의 클래스를 정의하고 사용해야 합니다. 이렇게 하면 요청 객체 변경이 데이터베이스 스키마나 엔티티 계층에 영향을 미치지 않습니다.
backend/src/main/java/moadong/club/repository/ClubApplicationRepository.java (1)
Learnt from: lepitaaar
PR: #406
File: backend/src/main/java/moadong/club/service/ClubApplyService.java:34-38
Timestamp: 2025-05-19T05:45:52.957Z
Learning: The code duplication between createClubApplication and editClubApplication methods in ClubApplyService.java is acknowledged but will be addressed in a future refactoring, as per the developer's plan.
backend/src/main/java/moadong/club/payload/request/ClubRecruitmentInfoUpdateRequest.java (1)
Learnt from: lepitaaar
PR: #406
File: backend/src/main/java/moadong/club/service/ClubApplyService.java:34-38
Timestamp: 2025-05-19T05:45:52.957Z
Learning: The code duplication between createClubApplication and editClubApplication methods in ClubApplyService.java is acknowledged but will be addressed in a future refactoring, as per the developer's plan.
backend/src/main/java/moadong/media/service/ClubImageService.java (1)
Learnt from: lepitaaar
PR: #406
File: backend/src/main/java/moadong/club/service/ClubApplyService.java:34-38
Timestamp: 2025-05-19T05:45:52.957Z
Learning: The code duplication between createClubApplication and editClubApplication methods in ClubApplyService.java is acknowledged but will be addressed in a future refactoring, as per the developer's plan.
backend/src/main/java/moadong/club/service/RecruitmentStateChecker.java (1)
Learnt from: lepitaaar
PR: #406
File: backend/src/main/java/moadong/club/service/ClubApplyService.java:34-38
Timestamp: 2025-05-19T05:45:52.957Z
Learning: The code duplication between createClubApplication and editClubApplication methods in ClubApplyService.java is acknowledged but will be addressed in a future refactoring, as per the developer's plan.
backend/src/main/java/moadong/club/enums/ClubDivision.java (1)
Learnt from: seongwon030
PR: #548
File: frontend/src/pages/ClubDetailPage/ClubDetailPage.tsx:17-57
Timestamp: 2025-07-19T05:05:10.196Z
Learning: ClubDetailPage.tsx에서 notJoinedClubNames 배열의 하드코딩은 의도적인 설계 결정입니다. 개발자가 명시적으로 하드코딩을 선택했으므로 이에 대한 리팩토링 제안을 하지 않아야 합니다.
backend/src/main/java/moadong/club/repository/ClubSearchRepository.java (2)
Learnt from: Due-IT
PR: #329
File: backend/src/main/java/moadong/club/controller/ClubSearchController.java:0-0
Timestamp: 2025-05-01T08:32:09.398Z
Learning: ClubSearchController의 searchClubsByKeyword 메서드와 ClubSearchService의 searchClubsByKeyword 메서드 사이에 파라미터 순서 일치가 중요하다. 현재 컨트롤러의 매개변수 순서는 'keyword, recruitmentStatus, category, division'인 반면, 서비스 메서드의 순서는 'keyword, recruitmentStatus, division, category'이다. 컨트롤러에서 서비스 호출 시 'keyword, recruitmentStatus, division, category' 순서로 전달하면 category와 division 값이 바뀌어 검색 결과가 잘못될 수 있다.
Learnt from: lepitaaar
PR: #406
File: backend/src/main/java/moadong/club/service/ClubApplyService.java:34-38
Timestamp: 2025-05-19T05:45:52.957Z
Learning: The code duplication between createClubApplication and editClubApplication methods in ClubApplyService.java is acknowledged but will be addressed in a future refactoring, as per the developer's plan.
backend/src/test/java/moadong/fixture/ClubRequestFixture.java (1)
Learnt from: lepitaaar
PR: #406
File: backend/src/main/java/moadong/club/service/ClubApplyService.java:34-38
Timestamp: 2025-05-19T05:45:52.957Z
Learning: The code duplication between createClubApplication and editClubApplication methods in ClubApplyService.java is acknowledged but will be addressed in a future refactoring, as per the developer's plan.
backend/src/main/java/moadong/club/payload/request/ClubApplicationEditRequest.java (1)
Learnt from: lepitaaar
PR: #406
File: backend/src/main/java/moadong/club/service/ClubApplyService.java:34-38
Timestamp: 2025-05-19T05:45:52.957Z
Learning: The code duplication between createClubApplication and editClubApplication methods in ClubApplyService.java is acknowledged but will be addressed in a future refactoring, as per the developer's plan.
backend/src/main/java/moadong/club/controller/ClubProfileController.java (3)
Learnt from: lepitaaar
PR: #406
File: backend/src/main/java/moadong/club/service/ClubApplyService.java:34-38
Timestamp: 2025-05-19T05:45:52.957Z
Learning: The code duplication between createClubApplication and editClubApplication methods in ClubApplyService.java is acknowledged but will be addressed in a future refactoring, as per the developer's plan.
Learnt from: seongwon030
PR: #195
File: frontend/src/pages/AdminPage/AdminPage.tsx:7-7
Timestamp: 2025-03-19T05:18:07.818Z
Learning: AdminPage.tsx에서 현재 하드코딩된 클럽 ID('67d2e3b9b15c136c6acbf20b')는 로그인 기능 구현 후 동적으로 가져오는 방식으로 수정될 예정입니다.
Learnt from: Due-IT
PR: #329
File: backend/src/main/java/moadong/club/controller/ClubSearchController.java:0-0
Timestamp: 2025-05-01T08:32:09.398Z
Learning: ClubSearchController의 searchClubsByKeyword 메서드와 ClubSearchService의 searchClubsByKeyword 메서드 사이에 파라미터 순서 일치가 중요하다. 현재 컨트롤러의 매개변수 순서는 'keyword, recruitmentStatus, category, division'인 반면, 서비스 메서드의 순서는 'keyword, recruitmentStatus, division, category'이다. 컨트롤러에서 서비스 호출 시 'keyword, recruitmentStatus, division, category' 순서로 전달하면 category와 division 값이 바뀌어 검색 결과가 잘못될 수 있다.
backend/src/main/java/moadong/club/payload/request/ClubApplicationCreateRequest.java (1)
Learnt from: lepitaaar
PR: #406
File: backend/src/main/java/moadong/club/service/ClubApplyService.java:34-38
Timestamp: 2025-05-19T05:45:52.957Z
Learning: The code duplication between createClubApplication and editClubApplication methods in ClubApplyService.java is acknowledged but will be addressed in a future refactoring, as per the developer's plan.
backend/src/main/java/moadong/media/service/GoogleDriveClubImageService.java (1)
Learnt from: lepitaaar
PR: #406
File: backend/src/main/java/moadong/club/service/ClubApplyService.java:34-38
Timestamp: 2025-05-19T05:45:52.957Z
Learning: The code duplication between createClubApplication and editClubApplication methods in ClubApplyService.java is acknowledged but will be addressed in a future refactoring, as per the developer's plan.
backend/src/main/java/moadong/club/payload/response/ClubApplyInfoResponse.java (1)
Learnt from: lepitaaar
PR: #406
File: backend/src/main/java/moadong/club/service/ClubApplyService.java:34-38
Timestamp: 2025-05-19T05:45:52.957Z
Learning: The code duplication between createClubApplication and editClubApplication methods in ClubApplyService.java is acknowledged but will be addressed in a future refactoring, as per the developer's plan.
backend/src/main/java/moadong/media/service/GcsClubImageService.java (1)
Learnt from: lepitaaar
PR: #406
File: backend/src/main/java/moadong/club/service/ClubApplyService.java:34-38
Timestamp: 2025-05-19T05:45:52.957Z
Learning: The code duplication between createClubApplication and editClubApplication methods in ClubApplyService.java is acknowledged but will be addressed in a future refactoring, as per the developer's plan.
backend/src/main/java/moadong/media/service/CloudflareImageService.java (1)
Learnt from: lepitaaar
PR: #406
File: backend/src/main/java/moadong/club/service/ClubApplyService.java:34-38
Timestamp: 2025-05-19T05:45:52.957Z
Learning: The code duplication between createClubApplication and editClubApplication methods in ClubApplyService.java is acknowledged but will be addressed in a future refactoring, as per the developer's plan.
backend/src/main/java/moadong/media/controller/ClubImageController.java (1)
Learnt from: lepitaaar
PR: #406
File: backend/src/main/java/moadong/club/service/ClubApplyService.java:34-38
Timestamp: 2025-05-19T05:45:52.957Z
Learning: The code duplication between createClubApplication and editClubApplication methods in ClubApplyService.java is acknowledged but will be addressed in a future refactoring, as per the developer's plan.
backend/src/main/java/moadong/club/service/ClubProfileService.java (1)
Learnt from: lepitaaar
PR: #406
File: backend/src/main/java/moadong/club/service/ClubApplyService.java:34-38
Timestamp: 2025-05-19T05:45:52.957Z
Learning: The code duplication between createClubApplication and editClubApplication methods in ClubApplyService.java is acknowledged but will be addressed in a future refactoring, as per the developer's plan.
backend/src/main/java/moadong/club/util/RecruitmentStateCalculator.java (1)
Learnt from: lepitaaar
PR: #406
File: backend/src/main/java/moadong/club/service/ClubApplyService.java:34-38
Timestamp: 2025-05-19T05:45:52.957Z
Learning: The code duplication between createClubApplication and editClubApplication methods in ClubApplyService.java is acknowledged but will be addressed in a future refactoring, as per the developer's plan.
backend/src/main/java/moadong/club/controller/ClubSearchController.java (2)
Learnt from: Due-IT
PR: #329
File: backend/src/main/java/moadong/club/controller/ClubSearchController.java:0-0
Timestamp: 2025-05-01T08:32:09.398Z
Learning: ClubSearchController의 searchClubsByKeyword 메서드와 ClubSearchService의 searchClubsByKeyword 메서드 사이에 파라미터 순서 일치가 중요하다. 현재 컨트롤러의 매개변수 순서는 'keyword, recruitmentStatus, category, division'인 반면, 서비스 메서드의 순서는 'keyword, recruitmentStatus, division, category'이다. 컨트롤러에서 서비스 호출 시 'keyword, recruitmentStatus, division, category' 순서로 전달하면 category와 division 값이 바뀌어 검색 결과가 잘못될 수 있다.
Learnt from: lepitaaar
PR: #406
File: backend/src/main/java/moadong/club/service/ClubApplyService.java:34-38
Timestamp: 2025-05-19T05:45:52.957Z
Learning: The code duplication between createClubApplication and editClubApplication methods in ClubApplyService.java is acknowledged but will be addressed in a future refactoring, as per the developer's plan.
backend/src/main/java/moadong/club/payload/dto/ClubApplicantsResult.java (2)
Learnt from: lepitaaar
PR: #406
File: backend/src/main/java/moadong/club/service/ClubApplyService.java:34-38
Timestamp: 2025-05-19T05:45:52.957Z
Learning: The code duplication between createClubApplication and editClubApplication methods in ClubApplyService.java is acknowledged but will be addressed in a future refactoring, as per the developer's plan.
Learnt from: Zepelown
PR: #406
File: backend/src/main/java/moadong/club/entity/ClubApplicationQuestion.java:32-33
Timestamp: 2025-05-15T12:03:57.356Z
Learning: 엔티티 클래스는 요청/응답 객체(DTO)에 의존해서는 안 됩니다. 계층 간 의존성 문제를 방지하기 위해 엔티티와 DTO는 분리되어야 합니다. 예를 들어, ClubApplicationQuestion 엔티티가 ClubApplicationRequest.Options와 같은 요청 객체를 직접 참조하는 대신, 엔티티 패키지 내에 QuestionOptions와 같은 별도의 클래스를 정의하고 사용해야 합니다. 이렇게 하면 요청 객체 변경이 데이터베이스 스키마나 엔티티 계층에 영향을 미치지 않습니다.
backend/src/main/java/moadong/club/service/ClubApplyService.java (2)
Learnt from: lepitaaar
PR: #406
File: backend/src/main/java/moadong/club/service/ClubApplyService.java:34-38
Timestamp: 2025-05-19T05:45:52.957Z
Learning: The code duplication between createClubApplication and editClubApplication methods in ClubApplyService.java is acknowledged but will be addressed in a future refactoring, as per the developer's plan.
Learnt from: Zepelown
PR: #406
File: backend/src/main/java/moadong/club/entity/ClubApplicationQuestion.java:32-33
Timestamp: 2025-05-15T12:03:57.356Z
Learning: 엔티티 클래스는 요청/응답 객체(DTO)에 의존해서는 안 됩니다. 계층 간 의존성 문제를 방지하기 위해 엔티티와 DTO는 분리되어야 합니다. 예를 들어, ClubApplicationQuestion 엔티티가 ClubApplicationRequest.Options와 같은 요청 객체를 직접 참조하는 대신, 엔티티 패키지 내에 QuestionOptions와 같은 별도의 클래스를 정의하고 사용해야 합니다. 이렇게 하면 요청 객체 변경이 데이터베이스 스키마나 엔티티 계층에 영향을 미치지 않습니다.
backend/src/main/java/moadong/club/payload/request/ClubInfoRequest.java (1)
Learnt from: lepitaaar
PR: #406
File: backend/src/main/java/moadong/club/service/ClubApplyService.java:34-38
Timestamp: 2025-05-19T05:45:52.957Z
Learning: The code duplication between createClubApplication and editClubApplication methods in ClubApplyService.java is acknowledged but will be addressed in a future refactoring, as per the developer's plan.
backend/src/main/java/moadong/club/entity/ClubRecruitmentInformation.java (1)
Learnt from: lepitaaar
PR: #406
File: backend/src/main/java/moadong/club/service/ClubApplyService.java:34-38
Timestamp: 2025-05-19T05:45:52.957Z
Learning: The code duplication between createClubApplication and editClubApplication methods in ClubApplyService.java is acknowledged but will be addressed in a future refactoring, as per the developer's plan.
backend/src/main/java/moadong/club/payload/dto/ClubDetailedResult.java (1)
Learnt from: lepitaaar
PR: #406
File: backend/src/main/java/moadong/club/service/ClubApplyService.java:34-38
Timestamp: 2025-05-19T05:45:52.957Z
Learning: The code duplication between createClubApplication and editClubApplication methods in ClubApplyService.java is acknowledged but will be addressed in a future refactoring, as per the developer's plan.
backend/src/main/java/moadong/club/entity/ClubQuestion.java (1)
Learnt from: lepitaaar
PR: #406
File: backend/src/main/java/moadong/club/service/ClubApplyService.java:34-38
Timestamp: 2025-05-19T05:45:52.957Z
Learning: The code duplication between createClubApplication and editClubApplication methods in ClubApplyService.java is acknowledged but will be addressed in a future refactoring, as per the developer's plan.
backend/src/main/java/moadong/club/entity/Club.java (1)
Learnt from: lepitaaar
PR: #406
File: backend/src/main/java/moadong/club/service/ClubApplyService.java:34-38
Timestamp: 2025-05-19T05:45:52.957Z
Learning: The code duplication between createClubApplication and editClubApplication methods in ClubApplyService.java is acknowledged but will be addressed in a future refactoring, as per the developer's plan.
backend/src/test/java/moadong/unit/club/ClubProfileServiceTest.java (2)
Learnt from: lepitaaar
PR: #406
File: backend/src/main/java/moadong/club/service/ClubApplyService.java:34-38
Timestamp: 2025-05-19T05:45:52.957Z
Learning: The code duplication between createClubApplication and editClubApplication methods in ClubApplyService.java is acknowledged but will be addressed in a future refactoring, as per the developer's plan.
Learnt from: seongwon030
PR: #195
File: frontend/src/pages/AdminPage/AdminPage.tsx:7-7
Timestamp: 2025-03-19T05:18:07.818Z
Learning: AdminPage.tsx에서 현재 하드코딩된 클럽 ID('67d2e3b9b15c136c6acbf20b')는 로그인 기능 구현 후 동적으로 가져오는 방식으로 수정될 예정입니다.
🧬 Code Graph Analysis (4)
backend/src/main/java/moadong/club/entity/Faq.java (1)
backend/src/main/java/moadong/club/entity/ClubRecruitmentInformation.java (1)
AllArgsConstructor(22-121)
backend/src/main/java/moadong/club/service/RecruitmentStateChecker.java (1)
backend/src/main/java/moadong/club/util/RecruitmentStateCalculator.java (1)
RecruitmentStateCalculator(10-38)
backend/src/main/java/moadong/club/controller/ClubProfileController.java (1)
backend/src/main/java/moadong/club/controller/ClubSearchController.java (1)
RestController(18-55)
backend/src/main/java/moadong/club/service/ClubApplyService.java (1)
backend/src/main/java/moadong/club/entity/ClubQuestionAnswer.java (1)
AllArgsConstructor(7-16)
🪛 actionlint (1.7.7)
.github/workflows/server_cd_release.yml
58-58: the runner of "docker/login-action@v2" action is too old to run on GitHub Actions. update the action's version to fix this issue
(action)
.github/workflows/oracle_server_cd_develop.yml
57-57: the runner of "docker/login-action@v2" action is too old to run on GitHub Actions. update the action's version to fix this issue
(action)
🪛 YAMLlint (1.37.1)
.github/workflows/server_cd_release.yml
[error] 96-96: trailing spaces
(trailing-spaces)
[error] 98-98: trailing spaces
(trailing-spaces)
[error] 103-103: trailing spaces
(trailing-spaces)
[error] 104-104: no new line character at the end of file
(new-line-at-end-of-file)
.github/workflows/oracle_server_cd_develop.yml
[error] 55-55: trailing spaces
(trailing-spaces)
[error] 84-84: trailing spaces
(trailing-spaces)
[error] 104-104: trailing spaces
(trailing-spaces)
[error] 105-105: trailing spaces
(trailing-spaces)
🔇 Additional comments (48)
backend/src/main/java/moadong/user/util/CookieMaker.java (1)
18-18: 배포 환경 도메인 구성 일치 여부 수동 검증 필요리포지토리 전체를 검색한 결과, CookieMaker.java 에서만
".moadong.com"이 하드코딩되어 있을 뿐 다른 설정 파일(yaml, properties 등)에서 해당 도메인 참조를 찾을 수 없습니다.
실제 DNS, 로드 밸런서, 클라우드 콘솔, 환경 변수 등 배포 환경 전반에서 도메인이.moadong.com으로 올바르게 설정되어 있는지 직접 검토해 주세요.backend/src/test/java/moadong/club/service/ClubSearchServiceTest.java (1)
54-54: 모집 상태 우선순위 변경에 맞춰 테스트가 올바르게 수정되었습니다.
ClubRecruitmentStatus열거형에서ALWAYS와OPEN상태의 우선순위가 변경됨에 따라 테스트 기댓값이 적절히 업데이트되었습니다. 이제OPEN상태(club1)가ALWAYS상태(club4)보다 높은 우선순위를 가집니다.backend/src/main/java/moadong/media/util/S3Config.java (1)
30-30: 코드 정리가 적절히 수행되었습니다.사용하지 않는 import 문들과 주석이 제거되었습니다. S3Client 설정은 Cloudflare R2와의 호환성을 위해 올바르게 유지되고 있습니다.
backend/src/main/java/moadong/club/payload/response/ClubApplicationResponse.java (1)
11-11: 클럽 지원서 응답에 설명 필드가 적절히 추가되었습니다.새로운
description필드가 record에 추가되어 지원서 양식의 상세 정보를 지원합니다. 이는 관련 요청 클래스 및 엔티티의 변경사항과 일관성을 유지합니다.backend/src/main/java/moadong/global/exception/GlobalExceptionHandler.java (1)
1-36: 코드 정리 작업이 적절히 수행되었습니다사용하지 않는 import 제거와 포맷팅 개선이 잘 이루어졌습니다. 예외 처리 로직은 그대로 유지되어 기능에 영향을 주지 않습니다.
backend/src/main/java/moadong/media/domain/FileType.java (1)
8-9: 커버 이미지 지원을 위한 FileType 확장이 적절합니다COVER 타입 추가로 클럽의 로고, 피드, 커버 이미지를 구분하여 관리할 수 있게 되었습니다. enum 패턴이 일관성 있게 유지되고 있습니다.
backend/src/test/java/moadong/fixture/ClubRequestFixture.java (2)
3-4: enum import 추가가 적절합니다ClubCategory와 ClubDivision enum 사용을 위한 import가 추가되었습니다.
14-15: 문자열에서 enum으로 변경하여 타입 안전성이 향상되었습니다하드코딩된 문자열 대신
ClubCategory.학술과ClubDivision.중동enum 상수를 사용하여 컴파일 타임에 유효성을 검증할 수 있게 되었습니다. 이는 런타임 오류를 방지하고 코드의 가독성을 높입니다.backend/src/main/java/moadong/global/config/SecurityConfig.java (1)
43-44: Google Cloud 관련 설정이 비활성화되었습니다GCP에서 Oracle로의 마이그레이션에 따라 credentialsLocation 설정이 주석 처리되었습니다.
backend/src/main/java/moadong/club/enums/ClubRecruitmentStatus.java (1)
9-10: 모집 상태 우선순위 변경 영향 검증 필요현재 검색 결과
ClubRecruitmentStatus.getPriority()를 직접 참조하거나 정렬하는 코드를 자동으로 찾지 못했습니다. 아래 항목을 직접 확인하고, 필요하다면 테스트를 보강하세요.
- 서비스/레포지토리 레이어에서 모임 리스트를 정렬(sort)할 때
ClubRecruitmentStatus.getPriority()를 제대로 사용하고 있는지- 컨트롤러나 프론트엔드의 필터링 로직(filter)에서 우선순위 기반 동작이 의도한 대로 작동하는지
- 관련 단위/통합 테스트가 변경된 우선순위(ALWAYS:2, OPEN:1)를 검증하고 있는지
- 테스트가 부족하다면 우선순위 변경에 따른 정렬·필터링 결과를 확인하는 케이스를 추가
backend/src/main/java/moadong/club/payload/request/ClubApplicationEditRequest.java (1)
10-22: 검증 어노테이션이 적절히 적용되었습니다.제목 길이 제한 확장(50자)과 새로운 설명 필드 추가가 올바른 검증 어노테이션과 함께 구현되었습니다. 변경사항이 일관성 있게 적용되었습니다.
backend/src/main/java/moadong/club/payload/request/ClubApplyQuestion.java (2)
35-35: QuestionItem 값의 길이 제한도 동일하게 확장되었습니다.일관성 있는 변경이 적용되었습니다. 선택지 항목도 200자까지 허용됩니다.
16-16: 프론트엔드 제목 입력 최대 길이(200자) 검증 필요백엔드에서 제목 제한을
20자에서200자로 확장했습니다. 프론트엔드에 별도의maxLength나 유사 검증 로직이 설정되어 있지 않은 것으로 보이니, 아래 사항을 직접 확인해주세요:
- TextField 또는
<input>컴포넌트에maxLength(또는inputProps.maxLength) 설정 여부- 200자 입력 시 레이아웃 깨짐이나 스크롤 동작 이상 유무
- React Hook Form(또는 다른 폼 라이브러리)에서
title필드 검증 규칙에 길이 제한이 반영됐는지backend/src/main/java/moadong/club/payload/response/ClubApplyInfoResponse.java (1)
8-16: 잘 설계된 응답 DTOrecord와 Builder 패턴을 적절히 활용한 깔끔한 구현입니다. 필드명이 명확하고 불변 객체로 적절히 설계되었습니다.
backend/src/main/java/moadong/media/service/ClubImageService.java (1)
19-21: 적절한 인터페이스 확장기존 메서드들과 일관된 네이밍 컨벤션과 매개변수 패턴을 유지하면서 커버 이미지 기능을 깔끔하게 추가했습니다.
backend/src/main/java/moadong/club/payload/request/ClubApplicationCreateRequest.java (2)
12-12: 제목 필드 길이 제한 확장이 적절합니다.제목 필드의 최대 길이를 20자에서 50자로 확장한 것은 더 설명적인 제목을 허용하여 사용성을 개선합니다.
15-17: 설명 필드 추가가 잘 구현되어 있습니다.새로운 description 필드의 검증 어노테이션이 적절하게 설정되어 있으며, 3000자 제한은 상세한 설명을 위해 충분한 공간을 제공합니다.
backend/src/main/java/moadong/club/service/RecruitmentStateChecker.java (1)
31-31: 모집 상태 계산 로직의 유틸리티 클래스 분리가 잘 되어 있습니다.RecruitmentStateCalculator로 로직을 분리한 것은 코드 재사용성과 유지보수성을 향상시키는 좋은 리팩토링입니다. 유틸리티 클래스가 null 날짜, 특수 연도(2999), 시간대 처리 등 다양한 엣지 케이스를 적절히 처리하고 있습니다.
backend/src/main/java/moadong/club/repository/ClubSearchRepository.java (2)
73-84: 모집 상태 필터링 로직 개선이 적절합니다."OPEN" 상태 검색 시 "ALWAYS" 상태도 포함하는 로직은 비즈니스 관점에서 합리적입니다. 상시 모집하는 클럽이 모집 중인 클럽 검색에 포함되는 것이 사용자 경험에 도움이 됩니다. 또한 필드명을
clubRecruitmentStatus로 수정한 것도 올바른 변경입니다.
6-6: 필요한 enum import가 적절히 추가되었습니다.새로운 모집 상태 필터링 로직에서 ClubRecruitmentStatus enum을 사용하기 위한 import가 올바르게 추가되었습니다.
backend/src/main/java/moadong/club/controller/ClubApplyController.java (2)
67-74: 새로운 지원자 현황 조회 엔드포인트가 잘 구현되어 있습니다.인증 및 인가 처리가 적절하고, 기존 컨트롤러 패턴과 일관성을 유지하며, 서비스 레이어로의 위임이 깔끔하게 처리되어 있습니다. API 문서화도 적절합니다.
7-7: 새로운 기능에 필요한 import들이 적절히 추가되었습니다.ClubApplication, ClubApplicationResponse, List import들은 새로운 지원자 현황 조회 기능을 지원하기 위해 필요한 추가사항입니다.
Also applies to: 11-11, 21-21
backend/src/main/java/moadong/club/entity/ClubQuestion.java (3)
32-34: 설명 필드 추가와 업데이트 메서드가 잘 구현되어 있습니다.새로운 description 필드가 적절한 검증 어노테이션과 기본값으로 추가되었고, updateFormDescription 메서드가 기존 패턴과 일관성 있게 구현되어 있습니다.
Also applies to: 49-51
5-5: 필요한 검증 어노테이션 import가 적절히 추가되었습니다.@NotNull 어노테이션 사용을 위한 import가 올바르게 추가되었습니다.
28-30: 제목(title) 필드 검증 완화 확인 필요ClubQuestion 엔티티의 title 필드 어노테이션이
// 기존: @NotBlank @NotNull @Builder.Default private String title = "";로 변경되면서 빈 문자열("")도 허용됩니다. 이로 인해 빈 제목의 ClubQuestion 생성/업데이트가 가능해지므로, 의도된 설계인지 아래 사항들을 확인해 주세요.
- ClubQuestion.java — title 필드의 @NotNull + @Builder.Default("") 설정
- ClubApplyService#updateFormTitle(request.title()) 등 서비스 레이어에서 전달되는 값
- 요청 DTO(create/update Request)에 별도 @notblank 검증이 적용되어 있는지
- 비즈니스 요구사항 상 제목이 반드시 비어있지 않아야 하는지
위 검증 완화가 명확한 비즈니스 의도로 이루어진 것인지 검토 부탁드립니다.
backend/src/test/java/moadong/media/service/CloudflareClubImageServiceFeedTest.java (1)
34-38: 테스트 클래스명과 서비스 주입이 올바르게 업데이트되었습니다.Google Drive에서 Cloudflare로의 마이그레이션에 맞춰 테스트 클래스명과 주입되는 서비스가 적절히 변경되었습니다. 테스트 로직은 동일하게 유지되어 기존 기능의 연속성을 보장합니다.
backend/src/main/java/moadong/club/controller/ClubProfileController.java (2)
19-24: import 문 개선이 적절합니다.와일드카드 import를 명시적인 import로 변경한 것은 코드 가독성과 유지보수성을 향상시키는 좋은 개선입니다.
8-8: 클럽 생성 로직은 UserCommandService로 이동되어 별도 엔드포인트가 제거되었습니다ClubProfileController에서
ClubCreateRequestimport가 사라진 것은 의도된 변경이며, 클럽 생성 기능은 더 이상 별도의 POST/clubs엔드포인트를 통해 호출되지 않습니다.
현재 클럽 생성은UserCommandService#createClub(String userId)메서드에서 사용자 가입 과정 중 자동으로 처리되므로, 추가 작업은 필요 없습니다.backend/src/main/java/moadong/club/enums/ClubCategory.java (2)
11-11: JSON 직렬화 설정이 적절합니다.
@JsonFormat(shape = JsonFormat.Shape.STRING)어노테이션으로 enum이 문자열로 직렬화되도록 설정한 것이 적절합니다.
40-47: JSON 역직렬화 메서드가 잘 구현되었습니다.
@JsonCreator어노테이션과 함께 입력값을 대문자로 변환하여 enum 상수에 매핑하는 로직이 적절합니다. 잘못된 입력에 대해RestApiException으로 일관된 예외 처리를 하는 것도 좋습니다.backend/src/main/java/moadong/global/util/JwtAuthenticationFilter.java (2)
40-53: JWT 인증 에러 처리가 크게 개선되었습니다.토큰 파싱 실패 시 명시적인 예외 처리를 추가하여 보안성을 향상시켰습니다. HTTP 401 응답과 함께 일관된 JSON 에러 형식을 반환하고 필터 체인을 적절히 중단시키는 로직이 잘 구현되어 있습니다.
3-3: 필요한 import가 적절히 추가되었습니다.ObjectMapper와 예외 처리를 위한 import들이 새로운 기능에 맞게 적절히 추가되었습니다.
Also applies to: 9-10
backend/src/main/java/moadong/club/controller/ClubSearchController.java (2)
27-36: API 문서화가 크게 개선되었습니다.검색 엔드포인트의 동작 방식을 더 명확하게 설명하고, 각 필터 파라미터의 가능한 값들을 구체적으로 명시한 것이 API 사용성을 크게 향상시킵니다. 필터링 순서와 키워드 검색의 동작 방식에 대한 설명도 매우 유용합니다.
44-49: 매개변수 순서 일치 확인 완료컨트롤러(
ClubSearchController)에서 호출하는
searchClubsByKeyword(keyword, recruitmentStatus, division, category)순서가
서비스(ClubSearchService) 메서드 정의 및 리포지토리 호출 순서와 완전히 일치함을 확인했습니다.
별도 수정 사항은 없습니다.backend/src/main/java/moadong/club/enums/ClubDivision.java (1)
13-13: 단일 분과(중동) 사용은 의도된 설계입니다. 확장성 제안은 불필요하니 해당 의견을 무시해주세요.Likely an incorrect or invalid review comment.
backend/src/main/java/moadong/media/controller/ClubImageController.java (1)
63-76: 새로운 커버 이미지 API 엔드포인트 구현이 적절합니다새로 추가된 커버 이미지 업로드/삭제 엔드포인트가 기존 로고 및 피드 이미지 API와 일관된 패턴을 따르고 있으며, 다음과 같은 장점이 있습니다:
- 적절한 보안 설정 (
@PreAuthorize,@SecurityRequirement)- 명확한 API 문서화 (
@Operation)- 일관된 응답 형태 (
Response.ok())- RESTful한 엔드포인트 설계
backend/src/main/java/moadong/club/payload/request/ClubInfoRequest.java (2)
6-14: 타입 안전성을 위한 enum 도입이 우수한 개선사항입니다
category와division필드를 String에서 각각ClubCategory와ClubDivisionenum으로 변경한 것은 다음과 같은 장점을 제공합니다:
- 컴파일 타임 타입 안전성 확보
- 유효하지 않은 값에 대한 명확한 에러 처리
- IDE 자동완성 및 리팩토링 지원 향상
- @notblank 제거는 enum이 null이 될 수 없으므로 적절함
18-19: 전화번호 검증 로직 추가가 데이터 무결성을 향상시킵니다
presidentPhoneNumber필드에@PhoneNumber커스텀 검증 어노테이션을 추가한 것은 데이터 무결성을 크게 향상시키는 개선사항입니다.backend/src/main/java/moadong/club/payload/dto/ClubDetailedResult.java (1)
17-17: 새로운 기능 필드 추가가 적절합니다
cover이미지와faqs필드 추가는 클럽 상세 정보를 풍부하게 만드는 좋은 기능 확장입니다.Also applies to: 31-31
backend/src/main/java/moadong/club/entity/Club.java (1)
118-120: 새로운 커버 업데이트 메서드가 일관된 패턴을 따릅니다
updateCover메서드가 기존의updateLogo메서드와 동일한 패턴을 따라 구현되어 일관성이 좋습니다.backend/src/main/java/moadong/media/service/CloudflareImageService.java (1)
123-147: 커버 이미지 업로드/삭제 메서드가 잘 구현되었습니다.기존 로고 업로드/삭제 메서드와 동일한 패턴을 따르고 있으며, 에러 처리와 영속성 관리가 적절하게 구현되어 있습니다.
backend/src/main/java/moadong/global/exception/ErrorCode.java (1)
11-18: 에러 코드 추가가 적절합니다.클럽 검증 관련 에러 코드들과 AES 암호화 에러 코드가 명확한 메시지와 함께 잘 정의되어 있습니다.
Also applies to: 42-42
backend/src/main/java/moadong/club/entity/ClubRecruitmentInformation.java (2)
34-37: 커버 이미지와 FAQ 필드 추가가 적절합니다.새로운 필드들이 기존 패턴을 따라 잘 추가되었으며, 관련 업데이트 메서드들도 올바르게 구현되었습니다.
Also applies to: 61-61, 80-80, 118-121
67-69: updateLogo 메서드 체이닝 사용 여부 확인 완료rg 검색 결과
updateLogo(...)호출 뒤에 이어지는 메서드 체이닝 호출이 발견되지 않았습니다. 반환 타입을void로 변경해도 기존 코드에 영향이 없습니다.backend/src/main/java/moadong/club/payload/dto/ClubApplicantsResult.java (1)
22-42: 복호화 로직이 잘 구현되었습니다.답변 복호화와 에러 처리가 적절하게 구현되어 있으며, 불변 객체를 생성하는 패턴도 좋습니다.
backend/src/main/java/moadong/club/service/ClubApplyService.java (1)
69-83: 암호화 및 지원자 정보 조회 기능이 잘 구현되었습니다.답변 암호화와 복호화, 권한 검증, 상태별 집계 등이 적절하게 구현되어 있습니다.
Also applies to: 92-124
backend/src/main/java/moadong/club/service/ClubProfileService.java (2)
25-26: 사용자와 클럽의 1:1 관계를 확인하세요.
findClubByUserId를 사용하는 것은 한 사용자가 하나의 클럽만 관리한다고 가정합니다. 이 비즈니스 규칙이 맞는지 확인이 필요합니다.Also applies to: 34-35
37-41: 모집 상태 재계산 로직이 적절히 추가되었습니다.모집 정보 업데이트 후
RecruitmentStateCalculator를 호출하여 상태를 재계산하는 것은 좋은 접근입니다.
| - name: Log in to Docker Hub | ||
| uses: docker/login-action@v2 | ||
| with: | ||
| username: ${{ secrets.SERVER_DOCKER_USERNAME }} | ||
| password: ${{ secrets.SERVER_DOCKER_PASSWORD }} | ||
|
|
There was a problem hiding this comment.
docker/login-action 최신화 필요
release 워크플로와 동일하게 v3로 교체해 주세요.
- - name: Log in to Docker Hub
- uses: docker/login-action@v2
+ - name: Log in to Docker Hub
+ uses: docker/login-action@v3📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| - name: Log in to Docker Hub | |
| uses: docker/login-action@v2 | |
| with: | |
| username: ${{ secrets.SERVER_DOCKER_USERNAME }} | |
| password: ${{ secrets.SERVER_DOCKER_PASSWORD }} | |
| - name: Log in to Docker Hub | |
| uses: docker/login-action@v3 | |
| with: | |
| username: ${{ secrets.SERVER_DOCKER_USERNAME }} | |
| password: ${{ secrets.SERVER_DOCKER_PASSWORD }} |
🧰 Tools
🪛 actionlint (1.7.7)
57-57: the runner of "docker/login-action@v2" action is too old to run on GitHub Actions. update the action's version to fix this issue
(action)
🤖 Prompt for AI Agents
In .github/workflows/oracle_server_cd_develop.yml around lines 56 to 61, the
docker/login-action is using version v2, but it should be updated to the latest
version v3 to stay consistent with the release workflow. Change the action
version from docker/login-action@v2 to docker/login-action@v3.
| uses: appleboy/ssh-action@master | ||
| with: | ||
| host: ${{ secrets.ORACLE_INSTANCE_DEV_IP }} | ||
| username: ${{ secrets.ORACLE_INSTANCE_USER }} | ||
| key: ${{ secrets.ORACLE_INSTANCE_DEV_PRIVATE_KEY }} | ||
| port: ${{ secrets.ORACLE_INSTANCE_DEV_PORT }} | ||
| script: | | ||
| docker pull ${{ secrets.DOCKER_IMAGE_DEV }}:latest | ||
|
|
||
| export USERNAME=${{ secrets.ORACLE_INSTANCE_USER }} | ||
| export DOCKER_APP_IMAGE=${{ secrets.DOCKER_IMAGE_DEV }}:latest | ||
| sudo chmod +x /home/${{ secrets.ORACLE_INSTANCE_USER }}/deploy.sh | ||
| sudo -E /home/${{ secrets.ORACLE_INSTANCE_USER }}/deploy.sh | ||
|
|
||
| docker image prune -af | ||
|
|
There was a problem hiding this comment.
🛠️ Refactor suggestion
SSH 액션 버전 고정 + YAMLLint 경고 정리
appleboy/ssh-action@master → 고정 태그로 변경하여 예측 가능성을 확보하고, 후행 공백·EOL 누락을 해결해 YAMLLint 오류를 제거해 주세요.
- uses: appleboy/ssh-action@master
+ uses: appleboy/ssh-action@v0.1.10 # 예시
...
- docker image prune -af
-
+ docker image prune -af
+📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| uses: appleboy/ssh-action@master | |
| with: | |
| host: ${{ secrets.ORACLE_INSTANCE_DEV_IP }} | |
| username: ${{ secrets.ORACLE_INSTANCE_USER }} | |
| key: ${{ secrets.ORACLE_INSTANCE_DEV_PRIVATE_KEY }} | |
| port: ${{ secrets.ORACLE_INSTANCE_DEV_PORT }} | |
| script: | | |
| docker pull ${{ secrets.DOCKER_IMAGE_DEV }}:latest | |
| export USERNAME=${{ secrets.ORACLE_INSTANCE_USER }} | |
| export DOCKER_APP_IMAGE=${{ secrets.DOCKER_IMAGE_DEV }}:latest | |
| sudo chmod +x /home/${{ secrets.ORACLE_INSTANCE_USER }}/deploy.sh | |
| sudo -E /home/${{ secrets.ORACLE_INSTANCE_USER }}/deploy.sh | |
| docker image prune -af | |
| uses: appleboy/ssh-action@v0.1.10 # 예시 | |
| with: | |
| host: ${{ secrets.ORACLE_INSTANCE_DEV_IP }} | |
| username: ${{ secrets.ORACLE_INSTANCE_USER }} | |
| key: ${{ secrets.ORACLE_INSTANCE_DEV_PRIVATE_KEY }} | |
| port: ${{ secrets.ORACLE_INSTANCE_DEV_PORT }} | |
| script: | | |
| docker pull ${{ secrets.DOCKER_IMAGE_DEV }}:latest | |
| export USERNAME=${{ secrets.ORACLE_INSTANCE_USER }} | |
| export DOCKER_APP_IMAGE=${{ secrets.DOCKER_IMAGE_DEV }}:latest | |
| sudo chmod +x /home/${{ secrets.ORACLE_INSTANCE_USER }}/deploy.sh | |
| sudo -E /home/${{ secrets.ORACLE_INSTANCE_USER }}/deploy.sh | |
| docker image prune -af | |
🧰 Tools
🪛 YAMLlint (1.37.1)
[error] 104-104: trailing spaces
(trailing-spaces)
🤖 Prompt for AI Agents
In .github/workflows/oracle_server_cd_develop.yml around lines 89 to 104,
replace the SSH action version from the floating 'master' tag to a fixed version
tag to ensure build predictability. Also, remove any trailing whitespace and add
missing end-of-line characters to fix YAMLLint warnings. Make sure the YAML
syntax remains valid after these changes.
| # Docker 인증 | ||
| - name: Log in to Docker Hub | ||
| uses: docker/login-action@v2 | ||
| with: | ||
| credentials_json: ${{ secrets.GCE_SA_KEY }} | ||
| username: ${{ secrets.SERVER_DOCKER_USERNAME }} | ||
| password: ${{ secrets.SERVER_DOCKER_PASSWORD }} | ||
|
|
There was a problem hiding this comment.
docker/login-action 버전을 v3로 올려야 실행 오류를 피할 수 있습니다
actionlint 경고처럼 v2 러너는 더 이상 최신 러너 이미지에서 동작하지 않을 수 있습니다. v3로 교체해 주세요.
- - name: Log in to Docker Hub
- uses: docker/login-action@v2
+ - name: Log in to Docker Hub
+ uses: docker/login-action@v3📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| # Docker 인증 | |
| - name: Log in to Docker Hub | |
| uses: docker/login-action@v2 | |
| with: | |
| credentials_json: ${{ secrets.GCE_SA_KEY }} | |
| username: ${{ secrets.SERVER_DOCKER_USERNAME }} | |
| password: ${{ secrets.SERVER_DOCKER_PASSWORD }} | |
| # Docker 인증 | |
| - name: Log in to Docker Hub | |
| uses: docker/login-action@v3 | |
| with: | |
| username: ${{ secrets.SERVER_DOCKER_USERNAME }} | |
| password: ${{ secrets.SERVER_DOCKER_PASSWORD }} |
🧰 Tools
🪛 actionlint (1.7.7)
58-58: the runner of "docker/login-action@v2" action is too old to run on GitHub Actions. update the action's version to fix this issue
(action)
🤖 Prompt for AI Agents
In .github/workflows/server_cd_release.yml around lines 56 to 62, the
docker/login-action is using version v2, which may cause execution errors on the
latest runner images. Update the action version from v2 to v3 in the uses field
to ensure compatibility and avoid runtime issues.
| # oracle ssh 접속 후 배포 | ||
| - name: Update Container on VM | ||
| run: | | ||
| gcloud compute ssh ${{ secrets.GCE_INSTANCE_RELEASE }} --zone=${{ secrets.GCP_REGION }} --command=" | ||
| gcloud auth configure-docker asia-northeast3-docker.pkg.dev | ||
| gcloud auth activate-service-account --key-file=/home/${{ secrets.GCE_INSTANCE_USER }}/gce_sa_key.json | ||
|
|
||
| sudo usermod -aG docker $USER | ||
| newgrp docker | ||
|
|
||
| docker pull ${{ secrets.DOCKER_IMAGE_RELEASE }}:latest | ||
|
|
||
| export USERNAME=${{ secrets.GCE_INSTANCE_USER }} # docker compose 파일에서 사용할 변수명 설정 | ||
| export DOCKER_APP_IMAGE=${{ secrets.DOCKER_IMAGE_RELEASE }}:latest | ||
| sudo chmod +x /home/${{ secrets.GCE_INSTANCE_USER }}/deploy.sh # 실행 권한 부여 | ||
| sudo -E /home/${{ secrets.GCE_INSTANCE_USER }}/deploy.sh # su권한으로 환경 변수 유지 및 실행 | ||
|
|
||
| docker image prune -af | ||
| docker ps -a" | ||
| uses: appleboy/ssh-action@master | ||
| with: | ||
| host: ${{ secrets.ORACLE_INSTANCE_RELEASE_IP }} | ||
| username: ${{ secrets.ORACLE_INSTANCE_USER }} | ||
| key: ${{ secrets.ORACLE_INSTANCE_RELEASE_PRIVATE_KEY }} | ||
| port: ${{ secrets.ORACLE_INSTANCE_RELEASE_PORT }} | ||
| script: | | ||
|
|
||
| docker pull ${{ secrets.DOCKER_IMAGE_RELEASE }}:latest | ||
|
|
||
| export USERNAME=${{ secrets.ORACLE_INSTANCE_USER }} | ||
| export DOCKER_APP_IMAGE=${{ secrets.DOCKER_IMAGE_RELEASE }}:latest | ||
| sudo chmod +x /home/${{ secrets.ORACLE_INSTANCE_USER }}/deploy.sh | ||
| sudo -E /home/${{ secrets.ORACLE_INSTANCE_USER }}/deploy.sh | ||
|
|
||
| docker image prune -af No newline at end of file |
There was a problem hiding this comment.
🛠️ Refactor suggestion
appleboy/ssh-action@master 태그는 고정 버전이 아니므로 재현성이 깨집니다
CI 보안 및 재현성을 위해 커밋 SHA 또는 릴리스 태그(v0.x.y)로 고정하는 것을 권장합니다. 동시에 불필요한 공백이 다수 존재해 YAMLLint 오류가 발생합니다.
- uses: appleboy/ssh-action@master
+ uses: appleboy/ssh-action@v0.1.10 # 예시: 실제 최신 안정 태그로 교체그리고 96, 98, 103, 104행의 후행 공백을 제거하고 파일 끝에 개행을 추가해 YAMLLint 오류를 없애 주세요.
📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| # oracle ssh 접속 후 배포 | |
| - name: Update Container on VM | |
| run: | | |
| gcloud compute ssh ${{ secrets.GCE_INSTANCE_RELEASE }} --zone=${{ secrets.GCP_REGION }} --command=" | |
| gcloud auth configure-docker asia-northeast3-docker.pkg.dev | |
| gcloud auth activate-service-account --key-file=/home/${{ secrets.GCE_INSTANCE_USER }}/gce_sa_key.json | |
| sudo usermod -aG docker $USER | |
| newgrp docker | |
| docker pull ${{ secrets.DOCKER_IMAGE_RELEASE }}:latest | |
| export USERNAME=${{ secrets.GCE_INSTANCE_USER }} # docker compose 파일에서 사용할 변수명 설정 | |
| export DOCKER_APP_IMAGE=${{ secrets.DOCKER_IMAGE_RELEASE }}:latest | |
| sudo chmod +x /home/${{ secrets.GCE_INSTANCE_USER }}/deploy.sh # 실행 권한 부여 | |
| sudo -E /home/${{ secrets.GCE_INSTANCE_USER }}/deploy.sh # su권한으로 환경 변수 유지 및 실행 | |
| docker image prune -af | |
| docker ps -a" | |
| uses: appleboy/ssh-action@master | |
| with: | |
| host: ${{ secrets.ORACLE_INSTANCE_RELEASE_IP }} | |
| username: ${{ secrets.ORACLE_INSTANCE_USER }} | |
| key: ${{ secrets.ORACLE_INSTANCE_RELEASE_PRIVATE_KEY }} | |
| port: ${{ secrets.ORACLE_INSTANCE_RELEASE_PORT }} | |
| script: | | |
| docker pull ${{ secrets.DOCKER_IMAGE_RELEASE }}:latest | |
| export USERNAME=${{ secrets.ORACLE_INSTANCE_USER }} | |
| export DOCKER_APP_IMAGE=${{ secrets.DOCKER_IMAGE_RELEASE }}:latest | |
| sudo chmod +x /home/${{ secrets.ORACLE_INSTANCE_USER }}/deploy.sh | |
| sudo -E /home/${{ secrets.ORACLE_INSTANCE_USER }}/deploy.sh | |
| docker image prune -af | |
| # oracle ssh 접속 후 배포 | |
| - name: Update Container on VM | |
| - uses: appleboy/ssh-action@master | |
| + uses: appleboy/ssh-action@v0.1.10 # 예시: 실제 최신 안정 태그로 교체 | |
| with: | |
| host: ${{ secrets.ORACLE_INSTANCE_RELEASE_IP }} | |
| username: ${{ secrets.ORACLE_INSTANCE_USER }} | |
| key: ${{ secrets.ORACLE_INSTANCE_RELEASE_PRIVATE_KEY }} | |
| port: ${{ secrets.ORACLE_INSTANCE_RELEASE_PORT }} | |
| script: | | |
| docker pull ${{ secrets.DOCKER_IMAGE_RELEASE }}:latest | |
| export USERNAME=${{ secrets.ORACLE_INSTANCE_USER }} | |
| export DOCKER_APP_IMAGE=${{ secrets.DOCKER_IMAGE_RELEASE }}:latest | |
| sudo chmod +x /home/${{ secrets.ORACLE_INSTANCE_USER }}/deploy.sh | |
| sudo -E /home/${{ secrets.ORACLE_INSTANCE_USER }}/deploy.sh | |
| docker image prune -af |
🧰 Tools
🪛 YAMLlint (1.37.1)
[error] 96-96: trailing spaces
(trailing-spaces)
[error] 98-98: trailing spaces
(trailing-spaces)
[error] 103-103: trailing spaces
(trailing-spaces)
[error] 104-104: no new line character at the end of file
(new-line-at-end-of-file)
🤖 Prompt for AI Agents
In .github/workflows/server_cd_release.yml around lines 87 to 104, the
appleboy/ssh-action is pinned to the master branch which can cause
reproducibility issues; update the action reference to use a specific commit SHA
or a stable release tag like v0.x.y. Also, remove trailing whitespace on lines
96, 98, 103, and 104, and ensure there is a newline at the end of the file to
fix YAML lint errors.
| // S3 | ||
| implementation platform('software.amazon.awssdk:bom:2.25.8') | ||
| implementation 'software.amazon.awssdk:s3' | ||
| implementation 'software.amazon.awssdk:auth' | ||
| implementation 'software.amazon.awssdk:s3:2.26.0' | ||
| implementation 'software.amazon.awssdk:auth:2.26.0' | ||
| // implementation 'software.amazon.awssdk:netty-nio-client:2.26.0' |
There was a problem hiding this comment.
🛠️ Refactor suggestion
AWS SDK BOM 제거로 버전 불일치 위험이 생겼습니다
BOM을 제거하고 각 모듈에 직접 버전을 지정하면, 추후 다른 software.amazon.awssdk 모듈을 추가할 때 실수로 서로 다른 버전이 혼재될 가능성이 큽니다. BOM 방식으로 통일하고 버전만 올리는 편이 안전합니다.
-// S3
-implementation 'software.amazon.awssdk:s3:2.26.0'
-implementation 'software.amazon.awssdk:auth:2.26.0'
-// implementation 'software.amazon.awssdk:netty-nio-client:2.26.0'
+// S3
+implementation platform('software.amazon.awssdk:bom:2.26.0')
+implementation 'software.amazon.awssdk:s3'
+implementation 'software.amazon.awssdk:auth'
+// implementation 'software.amazon.awssdk:netty-nio-client'이렇게 하면 모든 AWS SDK 모듈이 동일한 2.26.0 버전을 공유하므로 의존성 충돌 위험을 줄일 수 있습니다.
🤖 Prompt for AI Agents
In backend/build.gradle around lines 56 to 59, the AWS SDK dependencies specify
versions individually, which risks version mismatches. Remove the explicit
version numbers from each AWS SDK module and instead import the AWS SDK BOM
(Bill of Materials) to manage versions centrally. This ensures all AWS SDK
modules use the same version, reducing dependency conflicts. Adjust the build
file to include the BOM and remove version numbers from individual AWS SDK
dependencies.
| long between = ChronoUnit.DAYS.between(recruitmentStartDate, now); | ||
| if (between <= 14) { |
There was a problem hiding this comment.
날짜 계산 로직이 잘못되었습니다.
ChronoUnit.DAYS.between(recruitmentStartDate, now)는 현재 시간이 시작일 이전일 때 음수를 반환합니다. UPCOMING 상태를 올바르게 판단하려면 인자 순서를 바꿔야 합니다.
- long between = ChronoUnit.DAYS.between(recruitmentStartDate, now);
+ long between = ChronoUnit.DAYS.between(now, recruitmentStartDate);📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| long between = ChronoUnit.DAYS.between(recruitmentStartDate, now); | |
| if (between <= 14) { | |
| long between = ChronoUnit.DAYS.between(now, recruitmentStartDate); | |
| if (between <= 14) { |
🤖 Prompt for AI Agents
In backend/src/main/java/moadong/club/util/RecruitmentStateCalculator.java
around lines 26 to 27, the date calculation uses ChronoUnit.DAYS.between with
arguments in the wrong order, causing negative values when now is before
recruitmentStartDate. Fix this by swapping the arguments to
ChronoUnit.DAYS.between(now, recruitmentStartDate) to correctly calculate days
until the start date for UPCOMING state determination.
| // @Bean | ||
| // public Storage storage() throws IOException { | ||
| // InputStream keyFile = ResourceUtils.getURL(credentialsLocation).openStream(); | ||
| // return StorageOptions.newBuilder() | ||
| // .setCredentials(GoogleCredentials.fromStream(keyFile)) | ||
| // .build() | ||
| // .getService(); | ||
| // } |
There was a problem hiding this comment.
💡 Verification agent
🧩 Analysis chain
Google Cloud Storage Bean이 비활성화되었습니다
마이그레이션에 따라 Storage Bean 생성 로직이 주석 처리되었습니다. 마이그레이션이 완료되고 안정성이 확인되면 주석 처리된 코드를 완전히 제거하는 것을 고려해보세요.
다음 스크립트로 Storage Bean의 의존성이 완전히 제거되었는지 확인해보세요:
🏁 Script executed:
#!/bin/bash
# Storage Bean 사용 확인
echo "=== Storage Bean 참조 확인 ==="
rg "@Autowired.*Storage|@Inject.*Storage" --type java
echo "=== GCS 관련 서비스 사용 확인 ==="
rg "GcsClubImageService|GoogleCloudStorage" --type java
echo "=== Storage 타입 사용 확인 ==="
rg "com\.google\.cloud\.storage\.Storage" --type javaLength of output: 813
주석 처리된 Storage Bean 및 관련 코드 정리 필요
rg 스크립트 결과, Storage Bean 생성 로직과 GCS 관련 타입이 더 이상 코드 내에서 참조되지 않음을 확인했습니다. 마이그레이션이 완료된 현 시점에서 다음 항목을 제거하여 코드 가독성과 유지보수성을 개선하세요:
- backend/src/main/java/moadong/global/config/SecurityConfig.java
- 주석 처리된
storage()Bean 메소드 완전 제거 import com.google.cloud.storage.Storage;및import com.google.cloud.storage.StorageOptions;불필요 import 삭제
- 주석 처리된
- backend/src/main/java/moadong/media/service/GcsClubImageService.java
- 클래스 정의 등 주석 처리된 전체 구현 삭제 또는 파일 자체 삭제 검토
🤖 Prompt for AI Agents
In backend/src/main/java/moadong/global/config/SecurityConfig.java around lines
65 to 72, remove the entire commented-out storage() Bean method and delete the
unused imports for com.google.cloud.storage.Storage and
com.google.cloud.storage.StorageOptions to clean up unused code and improve
maintainability. Also, in
backend/src/main/java/moadong/media/service/GcsClubImageService.java, either
delete the entire file or remove all commented-out code including the class
definition since it is no longer referenced.

#️⃣연관된 이슈
📝작업 내용
중점적으로 리뷰받고 싶은 부분(선택)
논의하고 싶은 부분(선택)
🫡 참고사항
Summary by CodeRabbit
신규 기능
기능 개선
버그 수정
플랫폼/배포 변경
테스트
기타