Conversation
[feature] 지원서의 메모를 수정할 수 있다.
[feature] 지원서 제출 상태 변경 API 추가
|
The latest updates on your projects. Learn more about Vercel for Git ↗︎
|
Test Results75 tests 75 ✅ 2s ⏱️ Results for commit b2de6c7. ♻️ This comment has been updated with latest results. |
|
Warning
|
| Cohort / File(s) | Change Summary |
|---|---|
컨트롤러 및 엔드포인트 확장backend/src/main/java/moadong/club/controller/ClubApplyController.java |
지원자 상세 수정(메모, 상태)용 PUT, 지원자 삭제용 DELETE 엔드포인트 추가. 인증 필요. |
엔티티 확장backend/src/main/java/moadong/club/entity/ClubApplication.java |
memo 필드 추가, 메모 및 상태 동시 수정 메서드(updateDetail) 추가. |
지원자 결과 DTO 변경backend/src/main/java/moadong/club/payload/dto/ClubApplicantsResult.java |
필드명 questionId → id로 변경, createdAt 필드 추가, 팩토리 메서드 수정. |
지원자 수정 요청 DTO 추가backend/src/main/java/moadong/club/payload/request/ClubApplicantEditRequest.java |
메모(최대 500자, not null), 상태를 포함하는 신규 레코드 클래스 추가. |
레포지토리 메서드 추가backend/src/main/java/moadong/club/repository/ClubApplicationRepository.java |
findByIdAndQuestionId 메서드 추가로 지원서 단건 조회 가능. |
서비스 로직 확장backend/src/main/java/moadong/club/service/ClubApplyService.java |
지원자 상세 수정 및 삭제 트랜잭션 메서드 추가, 권한 및 존재 여부 검증 포함. |
에러코드 추가backend/src/main/java/moadong/global/exception/ErrorCode.java |
지원서 미존재시 에러코드(APPLICANT_NOT_FOUND) 추가. |
Sequence Diagram(s)
sequenceDiagram
participant Client
participant Controller
participant Service
participant Repository
participant Entity
Client->>Controller: PUT /api/club/{clubId}/apply/{appId} (수정 요청)
Controller->>Service: editApplicantDetail(clubId, appId, request, user)
Service->>Repository: findByIdAndQuestionId(appId, clubId)
Repository-->>Service: ClubApplication
Service->>Entity: updateDetail(memo, status)
Service->>Repository: save(ClubApplication)
Service-->>Controller: 완료
Controller-->>Client: 성공 응답
Client->>Controller: DELETE /api/club/{clubId}/apply/{appId} (삭제 요청)
Controller->>Service: deleteApplicant(clubId, appId, user)
Service->>Repository: findByIdAndQuestionId(appId, clubId)
Repository-->>Service: ClubApplication
Service->>Repository: delete(ClubApplication)
Service-->>Controller: 완료
Controller-->>Client: 성공 응답
Estimated code review effort
🎯 3 (Moderate) | ⏱️ ~15–20 minutes
Possibly related PRs
- [feature] 지원서의 메모를 수정할 수 있다. #620: 기존 PUT 엔드포인트(메모 수정) 도입 PR로, 이번 PR에서 삭제 기능 추가 및 수정 범위 확장(상태 포함) 등 직접적으로 연관됨.
Suggested reviewers
- Zepelown
- seongwon030
- oesnuj
✨ Finishing Touches
- 📝 Generate Docstrings
🧪 Generate unit tests
- Create PR with unit tests
- Post copyable unit tests in a comment
- Commit unit tests in branch
feature/remove-applicant
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.
🪧 Tips
Chat
There are 3 ways to chat with CodeRabbit:
- Review comments: Directly reply to a review comment made by CodeRabbit. Example:
I pushed a fix in commit <commit_id>, please review it.Explain this complex logic.Open a follow-up GitHub issue for this discussion.
- Files and specific lines of code (under the "Files changed" tab): Tag
@coderabbitaiin a new review comment at the desired location with your query. Examples:@coderabbitai explain this code block.
- PR comments: Tag
@coderabbitaiin a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:@coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.@coderabbitai read src/utils.ts and explain its main purpose.@coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
Support
Need help? Create a ticket on our support page for assistance with any issues or questions.
CodeRabbit Commands (Invoked using PR comments)
@coderabbitai pauseto pause the reviews on a PR.@coderabbitai resumeto resume the paused reviews.@coderabbitai reviewto trigger an incremental review. This is useful when automatic reviews are disabled for the repository.@coderabbitai full reviewto do a full review from scratch and review all the files again.@coderabbitai summaryto regenerate the summary of the PR.@coderabbitai generate docstringsto generate docstrings for this PR.@coderabbitai generate sequence diagramto generate a sequence diagram of the changes in this PR.@coderabbitai generate unit teststo generate unit tests for this PR.@coderabbitai resolveresolve all the CodeRabbit review comments.@coderabbitai configurationto show the current CodeRabbit configuration for the repository.@coderabbitai helpto get help.
Other keywords and placeholders
- Add
@coderabbitai ignoreanywhere in the PR description to prevent this PR from being reviewed. - Add
@coderabbitai summaryto generate the high-level summary at a specific location in the PR description. - Add
@coderabbitaianywhere in the PR title to generate the title automatically.
Documentation and Community
- Visit our Documentation for detailed information on how to use CodeRabbit.
- Join our Discord Community to get help, request features, and share feedback.
- Follow us on X/Twitter for updates and announcements.
There was a problem hiding this comment.
Actionable comments posted: 2
🧹 Nitpick comments (1)
backend/src/main/java/moadong/club/entity/ClubApplication.java (1)
42-45: 엔티티 변경 메서드 검토 필요
updateDetail메서드가 필드를 직접 변경하는 방식으로 구현되었습니다. 다음 사항들을 고려해보세요:
- 입력값에 대한 검증 로직 추가 (memo 길이 제한 등)
- 변경 추적을 위한 lastModifiedAt 필드 업데이트
- 도메인 이벤트 발행 고려
public void updateDetail(String memo, ApplicationStatus status) { + if (memo != null && memo.length() > 500) { + throw new IllegalArgumentException("메모는 500자를 초과할 수 없습니다."); + } this.memo = memo; this.status = status; + // lastModifiedAt 필드가 있다면 업데이트 }
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (7)
backend/src/main/java/moadong/club/controller/ClubApplyController.java(2 hunks)backend/src/main/java/moadong/club/entity/ClubApplication.java(1 hunks)backend/src/main/java/moadong/club/payload/dto/ClubApplicantsResult.java(2 hunks)backend/src/main/java/moadong/club/payload/request/ClubApplicantEditRequest.java(1 hunks)backend/src/main/java/moadong/club/repository/ClubApplicationRepository.java(1 hunks)backend/src/main/java/moadong/club/service/ClubApplyService.java(2 hunks)backend/src/main/java/moadong/global/exception/ErrorCode.java(1 hunks)
🧰 Additional context used
🧠 Learnings (3)
📚 Learning: the code duplication between createclubapplication and editclubapplication methods in clubapplyservi...
Learnt from: lepitaaar
PR: Moadong/moadong#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/entity/ClubApplication.javabackend/src/main/java/moadong/club/payload/request/ClubApplicantEditRequest.javabackend/src/main/java/moadong/club/service/ClubApplyService.javabackend/src/main/java/moadong/club/payload/dto/ClubApplicantsResult.javabackend/src/main/java/moadong/club/repository/ClubApplicationRepository.javabackend/src/main/java/moadong/club/controller/ClubApplyController.java
📚 Learning: 엔티티 클래스는 요청/응답 객체(dto)에 의존해서는 안 됩니다. 계층 간 의존성 문제를 방지하기 위해 엔티티와 dto는 분리되어야 합니다. 예를 들어, `clubapplicati...
Learnt from: Zepelown
PR: Moadong/moadong#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/ClubApplyService.javabackend/src/main/java/moadong/club/payload/dto/ClubApplicantsResult.java
📚 Learning: adminpage.tsx에서 현재 하드코딩된 클럽 id('67d2e3b9b15c136c6acbf20b')는 로그인 기능 구현 후 동적으로 가져오는 방식으로 수정될 예정입니다....
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')는 로그인 기능 구현 후 동적으로 가져오는 방식으로 수정될 예정입니다.
Applied to files:
backend/src/main/java/moadong/club/service/ClubApplyService.java
🔇 Additional comments (11)
backend/src/main/java/moadong/club/repository/ClubApplicationRepository.java (1)
14-14: LGTM!새로운
findByIdAndQuestionId메서드가 적절하게 추가되었습니다. id와 questionId를 모두 조건으로 사용하는 것은 권한 검증 측면에서도 좋은 설계입니다.backend/src/main/java/moadong/club/entity/ClubApplication.java (1)
33-34: LGTM!memo 필드가 적절하게 추가되었습니다. 기본값 설정과 Builder.Default 사용도 적절합니다.
backend/src/main/java/moadong/club/payload/dto/ClubApplicantsResult.java (3)
19-19: 필드명 변경에 따른 breaking change 검토
questionId필드가id로 변경되었습니다. 이는 기존 API 응답 구조를 변경하므로 클라이언트에 breaking change를 일으킬 수 있습니다.기존 API를 사용하는 클라이언트가 있는지 확인하고, 필요시 버전 관리나 마이그레이션 계획을 수립해주세요.
22-22: LGTM!
createdAt필드 추가로 지원서 생성 시간 정보를 제공하는 것은 좋은 개선입니다.
40-43: LGTM!factory 메서드에서 새로운 필드들이 적절하게 매핑되었습니다. 기존 암호화 해독 로직도 유지되어 좋습니다.
backend/src/main/java/moadong/club/service/ClubApplyService.java (3)
3-3: 새로운 임포트가 적절히 추가되었습니다.
@Transactional어노테이션과ClubApplicantEditRequestDTO에 대한 임포트가 새로운 기능에 맞게 올바르게 추가되었습니다.Also applies to: 9-9
128-143: 지원자 상세 정보 수정 로직이 올바르게 구현되었습니다.메서드가 다음과 같은 올바른 패턴을 따르고 있습니다:
- 클럽 존재 여부 및 권한 확인
- 지원서 조회 및 존재 여부 확인
- 엔티티 업데이트 및 저장
@Transactional어노테이션으로 데이터 일관성 보장기존 코드와 일관된 구조와 예외 처리를 사용하고 있습니다.
145-159: 지원자 삭제 로직이 올바르게 구현되었습니다.삭제 메서드가 다음과 같은 안전한 패턴을 따르고 있습니다:
- 동일한 권한 확인 로직 사용
- 삭제 전 지원서 존재 여부 확인
@Transactional어노테이션으로 원자성 보장코드 구조가 기존 서비스 메서드들과 일관되며 적절한 예외 처리를 포함하고 있습니다.
backend/src/main/java/moadong/club/controller/ClubApplyController.java (3)
7-7: 새로운 DTO 임포트가 적절히 추가되었습니다.
ClubApplicantEditRequest가 새로운 엔드포인트에서 사용되기 위해 올바르게 임포트되었습니다.
73-86: 지원자 정보 수정 엔드포인트가 올바르게 구현되었습니다.다음과 같은 좋은 관행들이 적용되었습니다:
- RESTful 경로 설계 (
/apply/{appId})- 적절한 HTTP 메서드 (PUT) 사용
- 인증 및 권한 검증
- 요청 본문 유효성 검사
- 명확한 Swagger 문서화
기존 엔드포인트들과 일관된 구조를 따르고 있습니다.
88-101: 지원자 삭제 엔드포인트가 올바르게 구현되었습니다.다음과 같은 올바른 패턴들이 적용되었습니다:
- 적절한 HTTP 메서드 (DELETE) 사용
- 동일한 경로 패턴으로 일관성 유지
- 보안 어노테이션과 인증 요구사항
- 명확한 API 문서화
메서드명
removeApplicant가deleteApplicant서비스 메서드와 일치하지 않지만, 컨트롤러 레벨에서는 의미상 적절합니다.
backend/src/main/java/moadong/club/payload/request/ClubApplicantEditRequest.java
Show resolved
Hide resolved
|
|
||
| AES_CIPHER_ERROR(HttpStatus.INTERNAL_SERVER_ERROR, "900-1", "암호화 중 오류가 발생했습니다.") | ||
| AES_CIPHER_ERROR(HttpStatus.INTERNAL_SERVER_ERROR, "900-1", "암호화 중 오류가 발생했습니다."), | ||
| APPLICANT_NOT_FOUND(HttpStatus.NOT_FOUND, "900-2", "지원서가 존재하지 않습니다."), |
There was a problem hiding this comment.
🛠️ Refactor suggestion
중복 에러 코드 검토 필요
APPLICANT_NOT_FOUND와 기존 APPLICATION_NOT_FOUND (Line 36) 사이에 기능적 중복이 있어 보입니다. 두 에러 코드 모두 같은 메시지("지원서가 존재하지 않습니다.")를 가지고 있습니다.
새로운 지원자 관리 API에서 기존 APPLICATION_NOT_FOUND를 재사용할 수 있는지 검토하거나, 두 에러 코드 간의 구체적인 차이점을 명확히 해주세요.
🤖 Prompt for AI Agents
In backend/src/main/java/moadong/global/exception/ErrorCode.java at line 43,
there is a potential functional overlap between APPLICANT_NOT_FOUND and
APPLICATION_NOT_FOUND at line 36, both having the same error message. Review
whether the existing APPLICATION_NOT_FOUND error code can be reused for the new
applicant management API instead of creating APPLICANT_NOT_FOUND. If both are
necessary, clarify and differentiate their specific use cases and error messages
to avoid confusion and redundancy.
#️⃣연관된 이슈
#619, #618, #617
📝작업 내용
중점적으로 리뷰받고 싶은 부분(선택)
논의하고 싶은 부분(선택)
🫡 참고사항
Summary by CodeRabbit
신규 기능
버그 수정
기타