-
Notifications
You must be signed in to change notification settings - Fork 8
feat: 멘토 지원서 대학교 매핑 기능, 대학 선택 상태 페이징 조건 추가 #583
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: develop
Are you sure you want to change the base?
feat: 멘토 지원서 대학교 매핑 기능, 대학 선택 상태 페이징 조건 추가 #583
Conversation
Walkthrough이 변경은 멘토 지원서에 대학을 할당하는 새로운 기능을 추가합니다. 새로운 관리자 API 엔드포인트가 도입되며, 요청 DTO와 서비스 로직이 추가됩니다. 대학 선택 유형(UniversitySelectType)을 추적하기 위해 여러 DTO와 저장소 계층이 확장되었으며, 도메인 모델에 대학 할당 메서드가 추가되었습니다. 테스트 케이스도 새로운 필터링 및 매핑 시나리오를 검증하도록 확대되었습니다. Estimated code review effort🎯 3 (Moderate) | ⏱️ ~25 minutes 주의가 필요한 영역:
Suggested reviewers
Pre-merge checks and finishing touches❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing touches
🧪 Generate unit tests (beta)
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 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 0
🧹 Nitpick comments (2)
src/main/java/com/example/solidconnection/admin/controller/AdminMentorApplicationController.java (1)
66-75: LGTM! 새 엔드포인트가 기존 패턴과 일관되게 구현되었습니다.
- REST 규칙 준수:
POST /{mentorApplicationId}/assign-university경로가 기존approve,reject엔드포인트와 일관됩니다.- 유효성 검증:
@Valid를 통해universityId의@NotNull검증이 수행됩니다.- 서비스 위임: 비즈니스 로직을 서비스 계층에 적절히 위임합니다.
🔎 (선택) 더 간결한 호출 방식
@PostMapping("/{mentorApplicationId}/assign-university") public ResponseEntity<Void> assignUniversity( @PathVariable("mentorApplicationId") Long mentorApplicationId, @Valid @RequestBody MentorApplicationAssignUniversityRequest request ) { - Long universityId = request.universityId(); - adminMentorApplicationService.assignUniversity(mentorApplicationId, universityId); + adminMentorApplicationService.assignUniversity(mentorApplicationId, request.universityId()); return ResponseEntity.ok().build(); }src/test/java/com/example/solidconnection/admin/service/AdminMentorApplicationServiceTest.java (1)
443-443: 선택적 개선: 중복 대학 생성을 피하기 위해 setUp에서 생성된 대학을 재사용할 수 있습니다.
universityFixture.메이지_대학()이 setUp의university1과 별도로 호출되고 있습니다. 테스트 격리 측면에서 의도된 것일 수 있지만, 필드로 선언된university1을 재사용하면 더 명확할 수 있습니다.🔎 제안된 수정
- University university = universityFixture.메이지_대학(); + // setUp에서 생성된 university1 재사용setUp에서
university1을 테스트 클래스 필드로 선언하여 재사용:private University university1; // setUp에서 university1 = universityFixture.메이지_대학();
📜 Review details
Configuration used: Repository UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (9)
src/main/java/com/example/solidconnection/admin/controller/AdminMentorApplicationController.java(2 hunks)src/main/java/com/example/solidconnection/admin/dto/MentorApplicationAssignUniversityRequest.java(1 hunks)src/main/java/com/example/solidconnection/admin/dto/MentorApplicationResponse.java(1 hunks)src/main/java/com/example/solidconnection/admin/dto/MentorApplicationSearchCondition.java(1 hunks)src/main/java/com/example/solidconnection/admin/service/AdminMentorApplicationService.java(5 hunks)src/main/java/com/example/solidconnection/common/exception/ErrorCode.java(1 hunks)src/main/java/com/example/solidconnection/mentor/domain/MentorApplication.java(1 hunks)src/main/java/com/example/solidconnection/mentor/repository/custom/MentorApplicationFilterRepositoryImpl.java(5 hunks)src/test/java/com/example/solidconnection/admin/service/AdminMentorApplicationServiceTest.java(12 hunks)
🧰 Additional context used
🧠 Learnings (4)
📓 Common learnings
Learnt from: sukangpunch
Repo: solid-connection/solid-connect-server PR: 562
File: src/main/java/com/example/solidconnection/mentor/service/MentorMyPageService.java:76-93
Timestamp: 2025-11-20T14:03:56.462Z
Learning: MentorApplication의 universityId는 PENDING 상태에서는 null일 수 있지만, admin이 승인(APPROVED)할 때 반드시 대학 데이터를 생성하고 universityId를 채운 후 승인하므로, APPROVED 상태의 MentorApplication은 항상 non-null universityId를 가진다는 것이 비즈니스 규칙이다.
Learnt from: sukangpunch
Repo: solid-connection/solid-connect-server PR: 562
File: src/main/java/com/example/solidconnection/mentor/dto/MentorApplicationRequest.java:10-23
Timestamp: 2025-11-17T06:30:49.502Z
Learning: MentorApplication 도메인에서 universityId는 null일 수 있으며, MentorApplicationRequest에서도 이 필드에 대한 NotNull validation을 추가하지 않아야 한다.
📚 Learning: 2025-11-17T06:30:49.502Z
Learnt from: sukangpunch
Repo: solid-connection/solid-connect-server PR: 562
File: src/main/java/com/example/solidconnection/mentor/dto/MentorApplicationRequest.java:10-23
Timestamp: 2025-11-17T06:30:49.502Z
Learning: MentorApplication 도메인에서 universityId는 null일 수 있으며, MentorApplicationRequest에서도 이 필드에 대한 NotNull validation을 추가하지 않아야 한다.
Applied to files:
src/main/java/com/example/solidconnection/admin/service/AdminMentorApplicationService.javasrc/main/java/com/example/solidconnection/admin/controller/AdminMentorApplicationController.javasrc/main/java/com/example/solidconnection/admin/dto/MentorApplicationResponse.javasrc/main/java/com/example/solidconnection/mentor/domain/MentorApplication.javasrc/test/java/com/example/solidconnection/admin/service/AdminMentorApplicationServiceTest.javasrc/main/java/com/example/solidconnection/mentor/repository/custom/MentorApplicationFilterRepositoryImpl.javasrc/main/java/com/example/solidconnection/admin/dto/MentorApplicationSearchCondition.javasrc/main/java/com/example/solidconnection/admin/dto/MentorApplicationAssignUniversityRequest.javasrc/main/java/com/example/solidconnection/common/exception/ErrorCode.java
📚 Learning: 2025-11-20T14:03:56.462Z
Learnt from: sukangpunch
Repo: solid-connection/solid-connect-server PR: 562
File: src/main/java/com/example/solidconnection/mentor/service/MentorMyPageService.java:76-93
Timestamp: 2025-11-20T14:03:56.462Z
Learning: MentorApplication의 universityId는 PENDING 상태에서는 null일 수 있지만, admin이 승인(APPROVED)할 때 반드시 대학 데이터를 생성하고 universityId를 채운 후 승인하므로, APPROVED 상태의 MentorApplication은 항상 non-null universityId를 가진다는 것이 비즈니스 규칙이다.
Applied to files:
src/main/java/com/example/solidconnection/admin/service/AdminMentorApplicationService.javasrc/main/java/com/example/solidconnection/admin/controller/AdminMentorApplicationController.javasrc/main/java/com/example/solidconnection/admin/dto/MentorApplicationResponse.javasrc/main/java/com/example/solidconnection/mentor/domain/MentorApplication.javasrc/test/java/com/example/solidconnection/admin/service/AdminMentorApplicationServiceTest.javasrc/main/java/com/example/solidconnection/mentor/repository/custom/MentorApplicationFilterRepositoryImpl.javasrc/main/java/com/example/solidconnection/admin/dto/MentorApplicationSearchCondition.javasrc/main/java/com/example/solidconnection/admin/dto/MentorApplicationAssignUniversityRequest.javasrc/main/java/com/example/solidconnection/common/exception/ErrorCode.java
📚 Learning: 2025-08-26T05:00:56.556Z
Learnt from: nayonsoso
Repo: solid-connection/solid-connect-server PR: 486
File: src/main/java/com/example/solidconnection/university/repository/custom/UnivApplyInfoFilterRepositoryImpl.java:166-178
Timestamp: 2025-08-26T05:00:56.556Z
Learning: UnivApplyInfo의 텍스트 검색 기능에서는 University.koreanName이 아닌 UnivApplyInfo.koreanName을 검색 대상으로 사용하는 것이 의도된 설계이다.
Applied to files:
src/test/java/com/example/solidconnection/admin/service/AdminMentorApplicationServiceTest.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: build
🔇 Additional comments (16)
src/main/java/com/example/solidconnection/admin/dto/MentorApplicationAssignUniversityRequest.java (1)
5-10: LGTM! 깔끔한 DTO 구현입니다.
- @NotNull 검증: 대학 할당 시
universityId가 필수이므로 적절합니다.- 불변 레코드 사용: Java record를 활용하여 간결하고 안전한 구조입니다.
기존 학습 내용에 따르면
MentorApplicationRequest에서는universityId가 null일 수 있지만, 이 DTO는 관리자가 대학을 할당하는 전용 요청이므로@NotNull이 올바른 선택입니다.src/main/java/com/example/solidconnection/common/exception/ErrorCode.java (1)
134-134: LGTM! 새 에러 코드가 적절하게 추가되었습니다.
- 에러 코드 명명:
MENTOR_APPLICATION_NOT_OTHER_STATUS가 의도를 명확히 전달합니다.- HTTP 상태 코드:
BAD_REQUEST가 유효성 검증 실패에 적합합니다.- 메시지: 한국어 메시지가 다른 에러 코드들과 일관성을 유지합니다.
src/main/java/com/example/solidconnection/admin/dto/MentorApplicationResponse.java (1)
4-4: LGTM! 응답 DTO 확장이 잘 되었습니다.
- 새 필드 추가:
universitySelectType필드가 관리자 화면에서 대학 선택 유형을 표시할 수 있게 합니다.- 필드 위치:
university필드 다음에 배치되어 논리적으로 그룹화됩니다.- 필터링 지원:
MentorApplicationSearchCondition과 함께 OTHER/CATALOG 유형별 필터링이 가능해집니다.Also applies to: 12-12
src/main/java/com/example/solidconnection/mentor/domain/MentorApplication.java (1)
139-143: 서비스 계층에서 필요한 검증이 이미 구현되어 있습니다.
AdminMentorApplicationService.assignUniversity()메서드를 확인한 결과:
universitySelectType검증 - 이미 구현됨
- 서비스 계층에서
universitySelectType != UniversitySelectType.OTHER검증 (라인 83-85)- 조건 불일치 시
MENTOR_APPLICATION_NOT_OTHER_STATUS예외 발생상태(
mentorApplicationStatus) 검증 - 설계상 불필요
assignUniversity는approveMentorApplication호출 전에 실행되므로, 호출 시점에 반드시 PENDING 상태- 상태 검증은
approve()메서드에서 수행 (PENDING이 아니면MENTOR_APPLICATION_ALREADY_CONFIRMED예외)- 도메인 모델의 워크플로우: PENDING → assignUniversity → approveMentorApplication (universityId 검증) → approve() (상태 검증)
도메인 객체의 불변성 보장은 현재 설계에서 적절하게 이루어지고 있습니다.
Likely an incorrect or invalid review comment.
src/main/java/com/example/solidconnection/admin/dto/MentorApplicationSearchCondition.java (1)
7-12: LGTM! 검색 조건 레코드에universitySelectType필드가 깔끔하게 추가되었습니다.
- 필드 추가
UniversitySelectType universitySelectType필드가 검색 조건에 추가됨- 기존 패턴을 잘 따르고 있으며, 모든 필드가 nullable하여 선택적 필터링 지원
src/main/java/com/example/solidconnection/mentor/repository/custom/MentorApplicationFilterRepositoryImpl.java (4)
45-58: LGTM! 프로젝션에universitySelectType필드가 올바르게 추가되었습니다.
- 프로젝션 확장
MentorApplicationResponse에universitySelectType필드 추가- 기존 필드 순서와 일관성 유지
83-88: LGTM! 검색 쿼리에 필터 조건이 깔끔하게 추가되었습니다.
- 필터 통합
universitySelectTypeEq조건이 WHERE 절에 추가됨- 기존 필터 패턴과 일관성 있게 구현
113-118: LGTM! 카운트 쿼리에도 동일한 필터가 적용되었습니다.
- 일관성 유지
- 검색 쿼리와 카운트 쿼리에 동일한 필터 조건 적용
- 페이징 결과의 정확성 보장
149-152: LGTM! 헬퍼 메서드가 기존 패턴을 잘 따르고 있습니다.
- 구현 패턴
- null 체크 후 조건 반환
- 다른 필터 메서드(
verifyMentorStatusEq등)와 동일한 패턴 사용src/test/java/com/example/solidconnection/admin/service/AdminMentorApplicationServiceTest.java (6)
63-64: LGTM! 테스트 데이터가 적절히 확장되었습니다.
- 새 필드 추가
mentorApplication7,mentorApplication8추가- OTHER 타입 테스트를 위한 데이터 준비
74-86: LGTM! setUp에서 OTHER 타입 멘토 지원서가 올바르게 생성됩니다.
- 테스트 데이터 설정
user7,user8생성UniversitySelectType.OTHER와nulluniversityId로 멘토 지원서 생성- 학습된 비즈니스 규칙에 따라 PENDING 상태에서 universityId가 null일 수 있음을 반영
206-251: LGTM! CATALOG/OTHER 타입 필터링 테스트가 잘 작성되었습니다.
CATALOG_타입_멘토_지원서만_조회한다 (lines 206-229)
- CATALOG 타입만 필터링되는지 검증
- 6개의 CATALOG 타입 지원서 확인
OTHER_타입_멘토_지원서만_조회한다 (lines 231-251)
- OTHER 타입만 필터링되는지 검증
- 2개의 OTHER 타입 지원서 확인
436-489: LGTM! 대학 매핑 테스트가 포괄적으로 작성되었습니다.
성공 케이스 (lines 439-452)
- OTHER 타입 지원서에 대학 매핑 시 universityId 할당 및 CATALOG 타입 변경 검증
에러 케이스
- 존재하지 않는 멘토 지원서 (lines 454-464)
- CATALOG 타입 지원서에 매핑 시도 (lines 466-476)
- 존재하지 않는 대학 (lines 478-488)
95-97: LGTM! 검색 조건 생성자가 4개 인자로 올바르게 업데이트되었습니다.
- 생성자 변경 반영
MentorApplicationSearchCondition에UniversitySelectType파라미터 추가- 기존 테스트들이 새 시그니처에 맞게 수정됨
mentorApplication7추가로 인해 예상 결과 리스트도 업데이트
404-406: LGTM! 상태별 개수 테스트가 새 지원서를 반영하여 업데이트되었습니다.
- 예상 결과 업데이트
expectedPendingCount에mentorApplication7추가expectedRejectedCount에mentorApplication8추가- OTHER 타입 지원서들이 올바르게 카운트됨
src/main/java/com/example/solidconnection/admin/service/AdminMentorApplicationService.java (1)
75-90: 멘토 지원서 대학 할당 로직이 완벽하게 구현되었습니다.
멘토 지원서 검증
대학을 할당하기 전에 멘토 지원서가 실제로 존재하는지 먼저 확인하는 안전한 구조입니다.
UniversitySelectType.OTHER조건 확인
직접 입력(OTHER) 유형의 지원서에만 대학을 매핑하도록 제한하여 업무 규칙을 잘 지키고 있습니다.대학 존재 여부 검증
대학 저장소의getUniversityById()메서드가 대학을 찾지 못할 경우UNIVERSITY_NOT_FOUND예외를 던지므로, 올바른 대학만 할당됩니다.도메인 메서드를 통한 상태 관리
검증을 마친 후 도메인 메서드(assignUniversity())를 호출하여 캡슐화를 유지합니다.비즈니스 규칙 준수
PENDING 상태에서는universityId가 null일 수 있지만, 관리자가 승인하기 전에 대학을 할당하도록 한 설계가 정확합니다.
관련 이슈
작업 내용
특이 사항
리뷰 요구사항 (선택)
현재 추가 된 기능상으로 대학 을 매핑할 때, 해당하는 대학이 존재하는지 먼저 확인 한 다음universityId를 매핑 하도록 해야 합니다.
의도한 동작 방식은
인데, 이 사이에서 고려해야 할 부분이 있다면 리뷰 남겨주시면 감사하겠습니다!
추가 되어야 할 기능 및 디자인