Skip to content

Conversation

@sukangpunch
Copy link
Contributor

@sukangpunch sukangpunch commented Dec 19, 2025

관련 이슈

작업 내용

  1. 대학이 선택되지 않은 멘토 지원서에 대학 추가 기능을 추가하였습니다.
  2. 대학 선택 상태(OTHER, CATALOG) 별로 페이징을 할 수 있도록 조건을 추가하였습니다.

특이 사항

리뷰 요구사항 (선택)

현재 추가 된 기능상으로 대학 을 매핑할 때, 해당하는 대학이 존재하는지 먼저 확인 한 다음universityId를 매핑 하도록 해야 합니다.

의도한 동작 방식은

  1. 어드민 페이지에서 대학이 선택되지 않은 지원서 들 조회 (페이징 조회)
  2. 해당 지원서들의 증명 파일 에서 대학교 확인
  3. 대학교 추가
  4. 대학교 - 멘토 지원서 매핑 (assignUniversity API)

인데, 이 사이에서 고려해야 할 부분이 있다면 리뷰 남겨주시면 감사하겠습니다!

추가 되어야 할 기능 및 디자인

  1. 어드민 페이지서 멘토 지원서 매핑 디자인
  2. 현재 매핑 하려는 대학 조회 기능
  3. 멘토 상세 내역 조회 기능(멘토 지원서를 제출한 유저가 매칭된 멘티가 존재할 수 있는지?)

@coderabbitai
Copy link

coderabbitai bot commented Dec 19, 2025

Walkthrough

이 변경은 멘토 지원서에 대학을 할당하는 새로운 기능을 추가합니다. 새로운 관리자 API 엔드포인트가 도입되며, 요청 DTO와 서비스 로직이 추가됩니다. 대학 선택 유형(UniversitySelectType)을 추적하기 위해 여러 DTO와 저장소 계층이 확장되었으며, 도메인 모델에 대학 할당 메서드가 추가되었습니다. 테스트 케이스도 새로운 필터링 및 매핑 시나리오를 검증하도록 확대되었습니다.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

주의가 필요한 영역:

  • ErrorCode.java: 동일한 MENTOR_APPLICATION_NOT_OTHER_STATUS 상수가 중복으로 정의되어 있습니다. 컴파일 오류를 야기할 수 있으므로 반드시 검토 및 수정이 필요합니다.
  • MentorApplicationFilterRepositoryImpl.java: universitySelectType 필터링 로직이 추가되었으며, 쿼리 프로젝션이 확장되었습니다. 데이터베이스 쿼리의 정확성을 확인해야 합니다.
  • AdminMentorApplicationService.java: assignUniversity 메서드에서 OTHER 상태 검증 로직과 대학 조회 로직이 올바르게 구현되었는지 확인 필요합니다.
  • AdminMentorApplicationServiceTest.java: 신규 테스트 케이스가 대폭 추가되었으므로 테스트 데이터 설정과 검증 로직을 면밀히 검토해야 합니다.

Suggested reviewers

  • wibaek
  • whqtker
  • Hexeong
  • JAEHEE25
  • lsy1307
  • Gyuhyeok99

Pre-merge checks and finishing touches

❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. You can run @coderabbitai generate docstrings to improve docstring coverage.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed PR 제목은 멘토 지원서 대학교 매핑 기능과 대학 선택 상태 페이징 조건 추가라는 두 가지 주요 변경사항을 명확하게 요약하고 있습니다.
Linked Issues check ✅ Passed 체크리스트 항목 중 페이징 조회 기능은 완료되었으나, 멘토 지원서에 대학 매핑 기능이 추가되었는지 확인 필요합니다. 코드 변경사항에서 assignUniversity 기능이 구현된 것으로 보입니다.
Out of Scope Changes check ✅ Passed PR의 모든 변경사항은 멘토 지원서 대학 매핑 기능 및 페이징 조회와 관련된 범위 내 변경으로 보입니다.
Description check ✅ Passed PR 설명이 필수 섹션을 포함하고 있으며, 작업 내용과 리뷰 요구사항이 명확하게 기술되어 있습니다.
✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

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

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 0

🧹 Nitpick comments (2)
src/main/java/com/example/solidconnection/admin/controller/AdminMentorApplicationController.java (1)

66-75: LGTM! 새 엔드포인트가 기존 패턴과 일관되게 구현되었습니다.

  1. REST 규칙 준수: POST /{mentorApplicationId}/assign-university 경로가 기존 approve, reject 엔드포인트와 일관됩니다.
  2. 유효성 검증: @Valid를 통해 universityId@NotNull 검증이 수행됩니다.
  3. 서비스 위임: 비즈니스 로직을 서비스 계층에 적절히 위임합니다.
🔎 (선택) 더 간결한 호출 방식
     @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

📥 Commits

Reviewing files that changed from the base of the PR and between 3c342a8 and 7858e26.

📒 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.java
  • src/main/java/com/example/solidconnection/admin/controller/AdminMentorApplicationController.java
  • src/main/java/com/example/solidconnection/admin/dto/MentorApplicationResponse.java
  • src/main/java/com/example/solidconnection/mentor/domain/MentorApplication.java
  • src/test/java/com/example/solidconnection/admin/service/AdminMentorApplicationServiceTest.java
  • src/main/java/com/example/solidconnection/mentor/repository/custom/MentorApplicationFilterRepositoryImpl.java
  • src/main/java/com/example/solidconnection/admin/dto/MentorApplicationSearchCondition.java
  • src/main/java/com/example/solidconnection/admin/dto/MentorApplicationAssignUniversityRequest.java
  • src/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.java
  • src/main/java/com/example/solidconnection/admin/controller/AdminMentorApplicationController.java
  • src/main/java/com/example/solidconnection/admin/dto/MentorApplicationResponse.java
  • src/main/java/com/example/solidconnection/mentor/domain/MentorApplication.java
  • src/test/java/com/example/solidconnection/admin/service/AdminMentorApplicationServiceTest.java
  • src/main/java/com/example/solidconnection/mentor/repository/custom/MentorApplicationFilterRepositoryImpl.java
  • src/main/java/com/example/solidconnection/admin/dto/MentorApplicationSearchCondition.java
  • src/main/java/com/example/solidconnection/admin/dto/MentorApplicationAssignUniversityRequest.java
  • src/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 구현입니다.

  1. @NotNull 검증: 대학 할당 시 universityId가 필수이므로 적절합니다.
  2. 불변 레코드 사용: Java record를 활용하여 간결하고 안전한 구조입니다.

기존 학습 내용에 따르면 MentorApplicationRequest에서는 universityId가 null일 수 있지만, 이 DTO는 관리자가 대학을 할당하는 전용 요청이므로 @NotNull이 올바른 선택입니다.

src/main/java/com/example/solidconnection/common/exception/ErrorCode.java (1)

134-134: LGTM! 새 에러 코드가 적절하게 추가되었습니다.

  1. 에러 코드 명명: MENTOR_APPLICATION_NOT_OTHER_STATUS가 의도를 명확히 전달합니다.
  2. HTTP 상태 코드: BAD_REQUEST가 유효성 검증 실패에 적합합니다.
  3. 메시지: 한국어 메시지가 다른 에러 코드들과 일관성을 유지합니다.
src/main/java/com/example/solidconnection/admin/dto/MentorApplicationResponse.java (1)

4-4: LGTM! 응답 DTO 확장이 잘 되었습니다.

  1. 새 필드 추가: universitySelectType 필드가 관리자 화면에서 대학 선택 유형을 표시할 수 있게 합니다.
  2. 필드 위치: university 필드 다음에 배치되어 논리적으로 그룹화됩니다.
  3. 필터링 지원: MentorApplicationSearchCondition과 함께 OTHER/CATALOG 유형별 필터링이 가능해집니다.

Also applies to: 12-12

src/main/java/com/example/solidconnection/mentor/domain/MentorApplication.java (1)

139-143: 서비스 계층에서 필요한 검증이 이미 구현되어 있습니다.

AdminMentorApplicationService.assignUniversity() 메서드를 확인한 결과:

  1. universitySelectType 검증 - 이미 구현됨

    • 서비스 계층에서 universitySelectType != UniversitySelectType.OTHER 검증 (라인 83-85)
    • 조건 불일치 시 MENTOR_APPLICATION_NOT_OTHER_STATUS 예외 발생
  2. 상태(mentorApplicationStatus) 검증 - 설계상 불필요

    • assignUniversityapproveMentorApplication 호출 전에 실행되므로, 호출 시점에 반드시 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 필드가 깔끔하게 추가되었습니다.

  1. 필드 추가
    • UniversitySelectType universitySelectType 필드가 검색 조건에 추가됨
    • 기존 패턴을 잘 따르고 있으며, 모든 필드가 nullable하여 선택적 필터링 지원
src/main/java/com/example/solidconnection/mentor/repository/custom/MentorApplicationFilterRepositoryImpl.java (4)

45-58: LGTM! 프로젝션에 universitySelectType 필드가 올바르게 추가되었습니다.

  1. 프로젝션 확장
    • MentorApplicationResponseuniversitySelectType 필드 추가
    • 기존 필드 순서와 일관성 유지

83-88: LGTM! 검색 쿼리에 필터 조건이 깔끔하게 추가되었습니다.

  1. 필터 통합
    • universitySelectTypeEq 조건이 WHERE 절에 추가됨
    • 기존 필터 패턴과 일관성 있게 구현

113-118: LGTM! 카운트 쿼리에도 동일한 필터가 적용되었습니다.

  1. 일관성 유지
    • 검색 쿼리와 카운트 쿼리에 동일한 필터 조건 적용
    • 페이징 결과의 정확성 보장

149-152: LGTM! 헬퍼 메서드가 기존 패턴을 잘 따르고 있습니다.

  1. 구현 패턴
    • null 체크 후 조건 반환
    • 다른 필터 메서드(verifyMentorStatusEq 등)와 동일한 패턴 사용
src/test/java/com/example/solidconnection/admin/service/AdminMentorApplicationServiceTest.java (6)

63-64: LGTM! 테스트 데이터가 적절히 확장되었습니다.

  1. 새 필드 추가
    • mentorApplication7, mentorApplication8 추가
    • OTHER 타입 테스트를 위한 데이터 준비

74-86: LGTM! setUp에서 OTHER 타입 멘토 지원서가 올바르게 생성됩니다.

  1. 테스트 데이터 설정
    • user7, user8 생성
    • UniversitySelectType.OTHERnull universityId로 멘토 지원서 생성
    • 학습된 비즈니스 규칙에 따라 PENDING 상태에서 universityId가 null일 수 있음을 반영

206-251: LGTM! CATALOG/OTHER 타입 필터링 테스트가 잘 작성되었습니다.

  1. CATALOG_타입_멘토_지원서만_조회한다 (lines 206-229)

    • CATALOG 타입만 필터링되는지 검증
    • 6개의 CATALOG 타입 지원서 확인
  2. OTHER_타입_멘토_지원서만_조회한다 (lines 231-251)

    • OTHER 타입만 필터링되는지 검증
    • 2개의 OTHER 타입 지원서 확인

436-489: LGTM! 대학 매핑 테스트가 포괄적으로 작성되었습니다.

  1. 성공 케이스 (lines 439-452)

    • OTHER 타입 지원서에 대학 매핑 시 universityId 할당 및 CATALOG 타입 변경 검증
  2. 에러 케이스

    • 존재하지 않는 멘토 지원서 (lines 454-464)
    • CATALOG 타입 지원서에 매핑 시도 (lines 466-476)
    • 존재하지 않는 대학 (lines 478-488)

95-97: LGTM! 검색 조건 생성자가 4개 인자로 올바르게 업데이트되었습니다.

  1. 생성자 변경 반영
    • MentorApplicationSearchConditionUniversitySelectType 파라미터 추가
    • 기존 테스트들이 새 시그니처에 맞게 수정됨
    • mentorApplication7 추가로 인해 예상 결과 리스트도 업데이트

404-406: LGTM! 상태별 개수 테스트가 새 지원서를 반영하여 업데이트되었습니다.

  1. 예상 결과 업데이트
    • expectedPendingCountmentorApplication7 추가
    • expectedRejectedCountmentorApplication8 추가
    • OTHER 타입 지원서들이 올바르게 카운트됨
src/main/java/com/example/solidconnection/admin/service/AdminMentorApplicationService.java (1)

75-90: 멘토 지원서 대학 할당 로직이 완벽하게 구현되었습니다.

  1. 멘토 지원서 검증
    대학을 할당하기 전에 멘토 지원서가 실제로 존재하는지 먼저 확인하는 안전한 구조입니다.

  2. UniversitySelectType.OTHER 조건 확인
    직접 입력(OTHER) 유형의 지원서에만 대학을 매핑하도록 제한하여 업무 규칙을 잘 지키고 있습니다.

  3. 대학 존재 여부 검증
    대학 저장소의 getUniversityById() 메서드가 대학을 찾지 못할 경우 UNIVERSITY_NOT_FOUND 예외를 던지므로, 올바른 대학만 할당됩니다.

  4. 도메인 메서드를 통한 상태 관리
    검증을 마친 후 도메인 메서드(assignUniversity())를 호출하여 캡슐화를 유지합니다.

  5. 비즈니스 규칙 준수
    PENDING 상태에서는 universityId가 null일 수 있지만, 관리자가 승인하기 전에 대학을 할당하도록 한 설계가 정확합니다.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

feat: 대학이 선택되지 않은 멘토 지원서에 대하여 대학을 매핑 기능, 페이징 조회 기능 추가

1 participant