[refactor] 동아리 지원서 양식을 부분적으로 수정가능하게만든다#834
Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
|
Warning
|
| Cohort / File(s) | 변경 요약 |
|---|---|
컨트롤러 HTTP 메서드 및 API 문서backend/src/main/java/moadong/club/controller/ClubApplyAdminController.java |
편집 엔드포인트 HTTP 메서드 PUT → PATCH로 변경; Operation 설명을 확장(부분 업데이트 및 편집 가능 필드 나열) |
요청 페이로드 확장backend/src/main/java/moadong/club/payload/request/ClubApplicationFormEditRequest.java |
semesterYear(Integer, @Min(2000), @Max(2999)) 및 semesterTerm(SemesterTerm) 필드 추가; title, description, active, questions에 있던 @NotBlank/@NotNull 제약 제거하여 부분 업데이트 허용 |
서비스 로직 리팩토링backend/src/main/java/moadong/club/service/ClubApplyAdminService.java |
createQuestions/updateQuestions를 createApplicationForm/updateApplicationForm으로 교체; buildClubFormQuestions 헬퍼 추가; 부분 업데이트(질문, 제목, 설명, 활성화, 학기) 조건부 처리 로직 및 관련 흐름 정리 |
테스트 픽스처 업데이트backend/src/test/java/moadong/fixture/ClubApplicationEditFixture.java |
ClubApplicationFormEditRequest 생성자 호출에 semesterYear(2025) 및 semesterTerm(SECOND) 인자 추가, SemesterTerm import 추가 |
Sequence Diagram
sequenceDiagram
participant Client as 클라이언트
participant Controller as Controller
participant Service as Service
participant Repo as Repository
Client->>Controller: PATCH /admin/application-form/:id (부분 필드 포함)
Controller->>Service: editClubApplication(formId, editRequest)
Service->>Repo: findById(formId)
Repo-->>Service: ClubApplicationForm
rect rgb(220,240,220)
Note over Service: 선택적 필드 기반 업데이트
alt questions 제공됨
Service->>Service: buildClubFormQuestions(questions)
Service->>Service: questions 교체/갱신
end
alt title/description/active 제공됨
Service->>Service: 해당 필드만 갱신
end
alt semesterYear/semesterTerm 제공됨
Service->>Service: 학기 관련 필드 갱신 및 검증
end
end
Service->>Repo: save(updatedForm)
Repo-->>Service: savedForm
Service-->>Controller: 응답 생성
Controller-->>Client: 200 OK
Estimated code review effort
🎯 3 (Moderate) | ⏱️ ~25 minutes
- 추가로 주의할 파일/영역:
ClubApplyAdminService.updateApplicationForm의 null/빈값 검사 및 학기 검증 로직buildClubFormQuestions가 기존 질문 빌드/유지 로직을 정확히 대체하는지- DTO의 제약 완화로 인한 null 처리(컨트롤러/서비스/테스트) 영향
- 테스트 픽스처가 모든 관련 테스트를 올바르게 반영했는지
Possibly related issues
- [refactor] MOA-317 동아리 지원서 양식을 부분적으로 수정가능하게만든다 #833: 편집 엔드포인트의 PUT → PATCH 전환 목표와 일치 — 이 PR이 해당 목적을 구현하고 있음.
Possibly related PRs
- [feature] 해당 학기에 게시할 지원서 폼을 선택할 수 있다 #765: 서비스의 생성/업데이트 흐름과 학기/활성화 처리 변경과 직접 연관됨.
- Revert "Revert "[feature] 동아리 지원서 폼 제작 시에 학기를 선택할 수 있고 생성된 모든 지원서 폼을 … #762:
semesterYear/semesterTerm추가 및 DTO/서비스 변경과 코드 레벨에서 강한 연관성 있음. - Revert "[feature] 동아리 지원서 폼 제작 시에 학기를 선택할 수 있고 생성된 모든 지원서 폼을 학기별로 분류하여 조회할 수 있다" #750: 동일 DTO와 학기 관련 로직을 다루어 충돌 가능성이 있으므로 검토 필요.
Suggested labels
📬 API
Suggested reviewers
- Zepelown
- PororoAndFriends
- alsdddk
- yw6938
Pre-merge checks and finishing touches
❌ Failed checks (1 warning)
| Check name | Status | Explanation | Resolution |
|---|---|---|---|
| Docstring Coverage | Docstring coverage is 16.67% 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 |
|---|---|---|
| Description Check | ✅ Passed | Check skipped - CodeRabbit’s high-level summary is enabled. |
| Title check | ✅ Passed | PR 제목은 지원서 양식을 부분적으로 수정 가능하도록 만드는 것이 주요 변경 사항이며, 변경 세트의 핵심을 명확하게 요약하고 있습니다. |
| Linked Issues check | ✅ Passed | PUT에서 PATCH로 HTTP 메서드 변경이 완료되었으며, 부분 수정을 지원하는 코드 리팩토링이 모두 구현되어 있습니다. |
| Out of Scope Changes check | ✅ Passed | 모든 변경 사항은 PATCH 메서드 구현 및 부분 수정 지원이라는 명확한 범위 내에 있으며, 불필요한 변경은 없습니다. |
✨ Finishing touches
- 📝 Generate docstrings
🧪 Generate unit tests (beta)
- Create PR with unit tests
- Post copyable unit tests in a comment
- Commit unit tests in branch
refactor/#833-change-method-update-application-form-controller-MOA-317
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.
Comment @coderabbitai help to get the list of available commands and usage tips.
Test Results78 tests 75 ✅ 17s ⏱️ Results for commit 10bfd34. ♻️ This comment has been updated with latest results. |
There was a problem hiding this comment.
Actionable comments posted: 1
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
Disabled knowledge base sources:
- Jira integration is disabled by default for public repositories
You can enable these sources in your CodeRabbit configuration.
📒 Files selected for processing (4)
backend/src/main/java/moadong/club/controller/ClubApplyAdminController.java(1 hunks)backend/src/main/java/moadong/club/payload/request/ClubApplicationFormEditRequest.java(1 hunks)backend/src/main/java/moadong/club/service/ClubApplyAdminService.java(11 hunks)backend/src/test/java/moadong/fixture/ClubApplicationEditFixture.java(2 hunks)
🧰 Additional context used
🧠 Learnings (4)
📚 Learning: 2025-09-30T05:26:41.788Z
Learnt from: alsdddk
Repo: Moadong/moadong PR: 765
File: backend/src/main/java/moadong/club/service/ClubApplyService.java:431-435
Timestamp: 2025-09-30T05:26:41.788Z
Learning: In the Moadong codebase's club application feature (backend/src/main/java/moadong/club/), multiple ClubApplicationForm entities can have ACTIVE status for the same clubId, semesterYear, and semesterTerm simultaneously. There is no uniqueness constraint requiring only one ACTIVE form per semester.
Applied to files:
backend/src/test/java/moadong/fixture/ClubApplicationEditFixture.javabackend/src/main/java/moadong/club/service/ClubApplyAdminService.javabackend/src/main/java/moadong/club/payload/request/ClubApplicationFormEditRequest.javabackend/src/main/java/moadong/club/controller/ClubApplyAdminController.java
📚 Learning: 2025-05-19T05:45:52.957Z
Learnt from: lepitaaar
Repo: Moadong/moadong 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.
Applied to files:
backend/src/test/java/moadong/fixture/ClubApplicationEditFixture.javabackend/src/main/java/moadong/club/service/ClubApplyAdminService.javabackend/src/main/java/moadong/club/payload/request/ClubApplicationFormEditRequest.javabackend/src/main/java/moadong/club/controller/ClubApplyAdminController.java
📚 Learning: 2025-08-25T14:43:52.320Z
Learnt from: lepitaaar
Repo: Moadong/moadong PR: 703
File: backend/src/main/java/moadong/club/controller/ClubApplyController.java:84-84
Timestamp: 2025-08-25T14:43:52.320Z
Learning: In the Moadong codebase, questionId and clubId are equivalent identifiers that represent the same entity. The ClubApplicationRepository.findAllByIdInAndQuestionId method correctly uses clubId as the questionId parameter for filtering club applications.
Applied to files:
backend/src/test/java/moadong/fixture/ClubApplicationEditFixture.javabackend/src/main/java/moadong/club/service/ClubApplyAdminService.java
📚 Learning: 2025-05-15T12:03:57.356Z
Learnt from: Zepelown
Repo: Moadong/moadong 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`와 같은 별도의 클래스를 정의하고 사용해야 합니다. 이렇게 하면 요청 객체 변경이 데이터베이스 스키마나 엔티티 계층에 영향을 미치지 않습니다.
Applied to files:
backend/src/main/java/moadong/club/service/ClubApplyAdminService.java
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
- GitHub Check: test
🔇 Additional comments (3)
backend/src/main/java/moadong/club/controller/ClubApplyAdminController.java (1)
44-54: PATCH 전환 반영 잘 확인했습니다PUT에서 PATCH로의 전환과 설명 보강이 부분 수정 요구사항과 맞물려 자연스럽습니다. 컨트롤러 단에서의 의도 전달이 명확해졌어요.
backend/src/test/java/moadong/fixture/ClubApplicationEditFixture.java (1)
3-25: 픽스처 확장 확인했습니다새 필드(연도·학기)를 포함하도록 픽스처가 갱신되어 테스트 준비가 잘 되어 있습니다.
backend/src/main/java/moadong/club/payload/request/ClubApplicationFormEditRequest.java (1)
4-26: 부분 업데이트를 위한 DTO 조정 👍필수 제약을 완화하면서 추가된 학년도·학기 필드가 PATCH 시나리오를 자연스럽게 지원할 수 있게 되었습니다.
There was a problem hiding this comment.
Actionable comments posted: 1
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
Disabled knowledge base sources:
- Jira integration is disabled by default for public repositories
You can enable these sources in your CodeRabbit configuration.
📒 Files selected for processing (1)
backend/src/main/java/moadong/club/service/ClubApplyAdminService.java(11 hunks)
🧰 Additional context used
🧠 Learnings (4)
📚 Learning: 2025-05-19T05:45:52.957Z
Learnt from: lepitaaar
Repo: Moadong/moadong 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.
Applied to files:
backend/src/main/java/moadong/club/service/ClubApplyAdminService.java
📚 Learning: 2025-09-30T05:26:41.788Z
Learnt from: alsdddk
Repo: Moadong/moadong PR: 765
File: backend/src/main/java/moadong/club/service/ClubApplyService.java:431-435
Timestamp: 2025-09-30T05:26:41.788Z
Learning: In the Moadong codebase's club application feature (backend/src/main/java/moadong/club/), multiple ClubApplicationForm entities can have ACTIVE status for the same clubId, semesterYear, and semesterTerm simultaneously. There is no uniqueness constraint requiring only one ACTIVE form per semester.
Applied to files:
backend/src/main/java/moadong/club/service/ClubApplyAdminService.java
📚 Learning: 2025-08-25T14:43:52.320Z
Learnt from: lepitaaar
Repo: Moadong/moadong PR: 703
File: backend/src/main/java/moadong/club/controller/ClubApplyController.java:84-84
Timestamp: 2025-08-25T14:43:52.320Z
Learning: In the Moadong codebase, questionId and clubId are equivalent identifiers that represent the same entity. The ClubApplicationRepository.findAllByIdInAndQuestionId method correctly uses clubId as the questionId parameter for filtering club applications.
Applied to files:
backend/src/main/java/moadong/club/service/ClubApplyAdminService.java
📚 Learning: 2025-05-15T12:03:57.356Z
Learnt from: Zepelown
Repo: Moadong/moadong 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`와 같은 별도의 클래스를 정의하고 사용해야 합니다. 이렇게 하면 요청 객체 변경이 데이터베이스 스키마나 엔티티 계층에 영향을 미치지 않습니다.
Applied to files:
backend/src/main/java/moadong/club/service/ClubApplyAdminService.java
🔇 Additional comments (4)
backend/src/main/java/moadong/club/service/ClubApplyAdminService.java (4)
88-97: 리팩토링이 잘 되었습니다폼 생성 로직을
createApplicationForm헬퍼로 통합하여 코드 중복을 제거했습니다. 학기 검증도 적절히 수행되고 있습니다.
100-118: PATCH 업데이트 로직이 적절합니다
updateApplicationForm헬퍼를 통해 부분 업데이트를 지원하도록 잘 리팩토링되었습니다.
283-291: 폼 생성 헬퍼가 명확합니다모든 필수 필드를 적절히 설정하고 있습니다.
315-344: 질문 변환 로직이 정확합니다DTO에서 엔티티로의 변환이 명확하게 구현되어 있습니다.
There was a problem hiding this comment.
Actionable comments posted: 0
♻️ Duplicate comments (1)
backend/src/main/java/moadong/club/service/ClubApplyAdminService.java (1)
308-309: 학기 필드를 조건부로 업데이트해야 합니다.현재 코드는
semesterYear나semesterTerm중 하나라도 요청에 포함되면 두 필드를 모두 무조건 업데이트합니다. 이는 PATCH 메서드의 부분 수정 의미와 맞지 않습니다. 예를 들어,semesterYear만 수정하려는 경우에도semesterTerm이 같은 값으로 재설정되어 불필요한 업데이트가 발생합니다.검증은 두 필드의 조합으로 수행하되, 실제 업데이트는 요청에 포함된 필드만 해야 합니다.
다음과 같이 수정하세요:
if (request.semesterYear() != null || request.semesterTerm() != null) { Integer semesterYear = Optional.ofNullable(request.semesterYear()).orElse(clubApplicationForm.getSemesterYear()); SemesterTerm semesterTerm = Optional.ofNullable(request.semesterTerm()).orElse(clubApplicationForm.getSemesterTerm()); validateSemester(semesterYear, semesterTerm); - clubApplicationForm.updateSemesterYear(semesterYear); - clubApplicationForm.updateSemesterTerm(semesterTerm); + if (request.semesterYear() != null) { + clubApplicationForm.updateSemesterYear(semesterYear); + } + if (request.semesterTerm() != null) { + clubApplicationForm.updateSemesterTerm(semesterTerm); + } }
🧹 Nitpick comments (2)
backend/src/main/java/moadong/club/service/ClubApplyAdminService.java (2)
9-9: 와일드카드 임포트 대신 명시적 임포트를 고려하세요.와일드카드 임포트(
import moadong.club.payload.request.*)는 의존성을 불명확하게 만들고 네이밍 충돌 가능성을 높일 수 있습니다. 명시적으로 사용하는 클래스만 임포트하는 것이 코드 가독성과 유지보수성 측면에서 더 좋습니다.
362-363: 예외를 무시하는 빈 catch 블록을 개선하는 것을 고려하세요.SSE 연결 정리 과정에서 발생하는 예외를 완전히 무시하고 있습니다. 정리 작업 중 예외가 발생해도 큰 문제는 없지만, 최소한 로깅을 추가하면 디버깅 시 도움이 될 수 있습니다.
예를 들어:
} catch (Exception ignored) { + log.debug("SSE emitter 정리 중 예외 발생 (무시됨): {}", ignored.getMessage()); }Also applies to: 407-408
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
Disabled knowledge base sources:
- Jira integration is disabled by default for public repositories
You can enable these sources in your CodeRabbit configuration.
📒 Files selected for processing (1)
backend/src/main/java/moadong/club/service/ClubApplyAdminService.java(11 hunks)
🧰 Additional context used
🧠 Learnings (4)
📚 Learning: 2025-05-19T05:45:52.957Z
Learnt from: lepitaaar
Repo: Moadong/moadong 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.
Applied to files:
backend/src/main/java/moadong/club/service/ClubApplyAdminService.java
📚 Learning: 2025-09-30T05:26:41.788Z
Learnt from: alsdddk
Repo: Moadong/moadong PR: 765
File: backend/src/main/java/moadong/club/service/ClubApplyService.java:431-435
Timestamp: 2025-09-30T05:26:41.788Z
Learning: In the Moadong codebase's club application feature (backend/src/main/java/moadong/club/), multiple ClubApplicationForm entities can have ACTIVE status for the same clubId, semesterYear, and semesterTerm simultaneously. There is no uniqueness constraint requiring only one ACTIVE form per semester.
Applied to files:
backend/src/main/java/moadong/club/service/ClubApplyAdminService.java
📚 Learning: 2025-08-25T14:43:52.320Z
Learnt from: lepitaaar
Repo: Moadong/moadong PR: 703
File: backend/src/main/java/moadong/club/controller/ClubApplyController.java:84-84
Timestamp: 2025-08-25T14:43:52.320Z
Learning: In the Moadong codebase, questionId and clubId are equivalent identifiers that represent the same entity. The ClubApplicationRepository.findAllByIdInAndQuestionId method correctly uses clubId as the questionId parameter for filtering club applications.
Applied to files:
backend/src/main/java/moadong/club/service/ClubApplyAdminService.java
📚 Learning: 2025-05-15T12:03:57.356Z
Learnt from: Zepelown
Repo: Moadong/moadong 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`와 같은 별도의 클래스를 정의하고 사용해야 합니다. 이렇게 하면 요청 객체 변경이 데이터베이스 스키마나 엔티티 계층에 영향을 미치지 않습니다.
Applied to files:
backend/src/main/java/moadong/club/service/ClubApplyAdminService.java
🔇 Additional comments (5)
backend/src/main/java/moadong/club/service/ClubApplyAdminService.java (5)
91-96: LGTM!
createApplicationForm헬퍼 메서드를 사용하여 폼을 생성하는 로직이 명확하고 올바릅니다. 학기 검증도 사전에 수행되어 안전합니다.
106-106: LGTM!
updateApplicationForm메서드 호출로 변경되어 부분 업데이트 로직과 일관성 있게 동작합니다.Also applies to: 114-114
283-291: LGTM!
createApplicationForm메서드가 명확하게 리팩토링되었고, 생성 로직이 올바르게 구현되어 있습니다.buildClubFormQuestions헬퍼 사용으로 코드 중복도 제거되었습니다.
293-313: 부분 업데이트 로직이 잘 구현되었습니다.전반적으로 PATCH 의미론에 맞게 각 필드를 조건부로 업데이트하는 구조가 잘 구현되었습니다.
null체크를 통해 요청에 포함된 필드만 업데이트하여 PR 목표를 달성했습니다.(학기 필드 업데이트 로직의 개선사항은 별도 코멘트를 참고하세요.)
315-344: LGTM!공통 로직을
buildClubFormQuestions헬퍼 메서드로 추출하여 코드 중복을 효과적으로 제거했습니다. 생성과 업데이트 경로 모두에서 재사용 가능하여 유지보수성이 향상되었습니다.Based on learnings
|
수고하셨습니당~ |
| @PutMapping("/application/{applicationFormId}") | ||
| @Operation(summary = "클럽 지원서 양식 수정", description = "클럽 지원서 양식을 수정합니다") | ||
| @PatchMapping("/application/{applicationFormId}") | ||
| @Operation(summary = "클럽 지원서 양식 수정", |
#️⃣연관된 이슈
#833
📝작업 내용
지원서 양식 관련 요구사항이 확장됨에 따라 더 유연한 업데이트를 지원하기위해
지원서 양식 수정 API를 PUT에서 PATCH로변경 그에따라 부분 수정 코드로 변경하였습니다
중점적으로 리뷰받고 싶은 부분(선택)
논의하고 싶은 부분(선택)
🫡 참고사항
Summary by CodeRabbit
릴리스 노트
New Features
Refactor
Tests