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

1. 새로운 관리자 API 엔드포인트가 추가되어 멘토 지원서에 대학을 할당할 수 있게 되었습니다.
2. 요청 DTO MentorApplicationAssignUniversityRequest가 도입되어 대학 ID를 전달받습니다.
3. 서비스 계층에 assignUniversity(mentorApplicationId, universityId) 메서드가 추가되어 도메인 검증과 대학 조회 후 매핑합니다.
4. 도메인 MentorApplication에 대학 할당 로직(assignUniversity)과 상태 검증 로직(validateCanAssignUniversity)이 추가되었습니다.
5. 검색 DTO 및 응답 DTO에 UniversitySelectType 필드가 추가되고, 저장소 필터와 쿼리 프로젝션이 해당 필드를 반영하도록 확장되었습니다.
6. 관련 단위 테스트들이 확장되어 필터링 조건과 매핑 시나리오(성공/오류)를 검증합니다.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Suggested reviewers

  • wibaek
  • whqtker
  • Hexeong
  • lsy1307

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의 주요 변경사항을 명확하게 반영하고 있습니다. 멘토 지원서 대학교 매핑 기능과 대학 선택 상태 페이징 조건 추가라는 두 가지 핵심 기능을 간결하게 설명합니다.
Description check ✅ Passed PR 설명이 필수 항목을 모두 포함하고 있습니다. 관련 이슈(#579)를 명시했고, 작업 내용 2개를 명확히 구분하여 설명했으며, 리뷰 요구사항도 상세히 기술했습니다.
Linked Issues check ✅ Passed 코드 변경사항이 이슈 #579의 요구사항을 충족합니다. UniversitySelectType 페이징 필터링 추가(완료)와 멘토 지원서 대학 매핑 기능(assignUniversity 메서드)이 모두 구현되었습니다.
Out of Scope Changes check ✅ Passed 모든 변경사항이 이슈 #579의 범위 내에 있습니다. API 경로명 변경(kebab-case)과 검증 로직 재구성은 기능 구현에 필요한 범위 내 변경입니다.
✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment

📜 Recent review details

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 7858e26 and 7df44a0.

📒 Files selected for processing (5)
  • src/main/java/com/example/solidconnection/admin/controller/AdminMentorApplicationController.java
  • src/main/java/com/example/solidconnection/admin/dto/MentorApplicationSearchCondition.java
  • src/main/java/com/example/solidconnection/admin/service/AdminMentorApplicationService.java
  • src/main/java/com/example/solidconnection/mentor/domain/MentorApplication.java
  • src/test/java/com/example/solidconnection/admin/service/AdminMentorApplicationServiceTest.java
🚧 Files skipped from review as they are similar to previous changes (1)
  • src/main/java/com/example/solidconnection/admin/dto/MentorApplicationSearchCondition.java
🧰 Additional context used
🧠 Learnings (3)
📓 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-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/mentor/domain/MentorApplication.java
  • src/test/java/com/example/solidconnection/admin/service/AdminMentorApplicationServiceTest.java
  • src/main/java/com/example/solidconnection/admin/controller/AdminMentorApplicationController.java
  • src/main/java/com/example/solidconnection/admin/service/AdminMentorApplicationService.java
📚 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/mentor/domain/MentorApplication.java
  • src/test/java/com/example/solidconnection/admin/service/AdminMentorApplicationServiceTest.java
  • src/main/java/com/example/solidconnection/admin/controller/AdminMentorApplicationController.java
  • src/main/java/com/example/solidconnection/admin/service/AdminMentorApplicationService.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 (11)
src/main/java/com/example/solidconnection/mentor/domain/MentorApplication.java (4)

126-137: LGTM! 승인 로직이 잘 정리되었습니다.

  1. approve() 메서드 개선:

    • validatePending() 호출로 PENDING 상태 검증
    • validateCanApprove() 호출로 대학 선택 여부 검증
  2. validateCanApprove() 메서드:

    • universitySelectTypeCATALOG가 아니면 예외 발생
    • 비즈니스 규칙에 따라 대학이 매핑되지 않은 지원서는 승인 불가

이전 리뷰에서 언급된 PENDING 상태 검증이 잘 반영되었습니다.


139-143: LGTM! 거절 로직도 깔끔하게 분리되었습니다.

validatePending() 호출로 이미 확정된 지원서에 대한 거절 시도를 방지합니다.


145-155: 대학 할당 로직이 잘 구현되었습니다.

  1. assignUniversity(long universityId):

    • universityId 설정 및 universitySelectTypeCATALOG로 변경
    • DB @Check 제약조건과 일관성 유지
  2. validateCanAssignUniversity():

    • PENDING 상태 검증
    • OTHER 타입만 대학 할당 가능

다만, assignUniversity를 호출하기 전에 validateCanAssignUniversity를 반드시 호출해야 한다는 점이 명시적이지 않습니다. 서비스 계층에서 올바르게 사용하고 있으므로 현재는 문제없지만, 추후 유지보수 시 주의가 필요합니다.


157-161: LGTM! 공통 검증 로직이 잘 추출되었습니다.

validatePending() 메서드를 private으로 추출하여 approve(), reject(), validateCanAssignUniversity()에서 재사용합니다. DRY 원칙을 잘 따르고 있습니다.

src/main/java/com/example/solidconnection/admin/service/AdminMentorApplicationService.java (2)

13-14: LGTM! 필요한 의존성이 올바르게 추가되었습니다.

University 도메인과 UniversityRepository가 대학 매핑 기능을 위해 추가되었습니다.

Also applies to: 26-26


68-81: 대학 매핑 서비스 로직이 잘 구현되었습니다.

다음의 점들이 좋습니다:

  1. 검증 순서가 적절합니다.

    • 먼저 MentorApplication 존재 여부 확인
    • validateCanAssignUniversity()로 도메인 규칙 검증
    • 마지막으로 University 존재 여부 확인
  2. university.getId()를 사용하여 대학이 실제로 존재함을 보장합니다.

  3. universityRepository.getUniversityById()는 대학을 찾지 못할 경우 CustomException(UNIVERSITY_NOT_FOUND)를 적절히 던지므로, null-safety가 잘 보장됩니다.

src/test/java/com/example/solidconnection/admin/service/AdminMentorApplicationServiceTest.java (3)

63-86: LGTM! 테스트 데이터 설정이 잘 확장되었습니다.

  1. 새로운 테스트 필드 추가:

    • mentorApplication7, mentorApplication8 (OTHER 타입)
    • 대응하는 user7, user8
  2. OTHER 타입 테스트 데이터:

    • universityIdnull인 지원서들로 대학 매핑 시나리오 테스트 가능

216-265: LGTM! UniversitySelectType 필터링 테스트가 잘 추가되었습니다.

  1. CATALOG_타입의_멘토_지원서만_조회한다:

    • CATALOG 타입 필터링 검증
    • 6개의 예상 결과와 타입 일치 확인
  2. OTHER_타입의_멘토_지원서만_조회한다:

    • OTHER 타입 필터링 검증
    • 2개의 예상 결과와 타입 일치 확인

assertAll로 묶어서 모든 검증이 실행되도록 잘 처리되었습니다.


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

  1. OTHER_타입의_멘토_지원서에_대학을_매핑하면_대학이_할당되고_타입이_CATALOG로_변경된다:

    • 성공 케이스 검증
    • universityIduniversitySelectType 변경 확인
  2. 존재하지_않는_멘토_지원서에_대학을_매핑하면_예외_응답을_반환한다:

    • MENTOR_APPLICATION_NOT_FOUND 예외 검증
  3. CATALOG_타입의_멘토_지원서에_대학을_매핑하면_예외_응답을_반환한다:

    • MENTOR_APPLICATION_NOT_OTHER_STATUS 예외 검증
  4. 존재하지_않는_대학을_매핑하면_예외_응답을_반환한다:

    • UNIVERSITY_NOT_FOUND 예외 검증

모든 엣지 케이스가 잘 커버되어 있습니다!

src/main/java/com/example/solidconnection/admin/controller/AdminMentorApplicationController.java (2)

44-59: LGTM! Path variable 네이밍이 kebab-case로 통일되었습니다.

이전 리뷰에서 요청된 대로 mentorApplicationIdmentor-application-id로 변경되었습니다. 일관된 RESTful URL 스타일을 유지합니다.


67-75: LGTM! 대학 할당 엔드포인트가 잘 구현되었습니다.

  1. 엔드포인트 설계:

    • POST /{mentor-application-id}/assign-university
    • RESTful 명명 규칙 준수
  2. 요청 처리:

    • @Valid 어노테이션으로 요청 검증
    • universityId 추출 후 서비스 호출
  3. 응답:

    • 성공 시 HTTP 200 반환

깔끔하고 일관된 구현입니다!


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일 수 있지만, 관리자가 승인하기 전에 대학을 할당하도록 한 설계가 정확합니다.

Copy link
Contributor

@Gyuhyeok99 Gyuhyeok99 left a comment

Choose a reason for hiding this comment

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

늘 깔끔하게 잘 작성해주시네요!
저희가 이야기한 flow대로 잘 동작할 거 같아 문제 없을 거 같습니다!
그냥 근본적으로 이렇게 해결하는 게 맞나 싶긴하지만.. 이건 추후에 고민하도록하죠!
(이말을 한 이유는 관리자가 너무 불필요한 작업이 많아질 거 같다는 생각이었습니다 ㅎㅎ..)

UniversitySelectType universitySelectType
) {

}
Copy link
Contributor

Choose a reason for hiding this comment

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

개행!

Comment on lines 219 to 229
// then
assertThat(response.getContent()).hasSize(expectedMentorApplications.size());
assertThat(response.getContent())
.extracting(content -> content.mentorApplicationResponse().id())
.containsOnly(expectedMentorApplications.stream()
.map(MentorApplication::getId)
.toArray(Long[]::new));
assertThat(response.getContent())
.extracting(content -> content.mentorApplicationResponse().universitySelectType())
.containsOnly(UniversitySelectType.CATALOG);
}
Copy link
Contributor

Choose a reason for hiding this comment

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

여기도 지난번 리뷰처럼 assertAll로 묶으면 좋을 듯하네요!

Page<MentorApplicationSearchResponse> response = adminMentorApplicationService.searchMentorApplications(condition, pageable);

// then
assertThat(response.getContent()).hasSize(expectedMentorApplications.size());
Copy link
Contributor

Choose a reason for hiding this comment

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

같은의견입니다!

return ResponseEntity.ok(response);
}

@PostMapping("/{mentorApplicationId}/assign-university")
Copy link
Contributor

Choose a reason for hiding this comment

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

mentorApplicationId가 아닌 mentor-application-id 로 해주실 수 있을까요?
이 controller의 다른 곳도 다 카멜케이스로 되어있는데 제가 예전 Pr에서 놓쳤다봅니다 😭

Copy link
Member

@whqtker whqtker left a comment

Choose a reason for hiding this comment

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

고생하셨습니다 🎉

MentorApplication mentorApplication = mentorApplicationRepository.findById(mentorApplicationId)
.orElseThrow(() -> new CustomException(MENTOR_APPLICATION_NOT_FOUND));

if(mentorApplication.getUniversitySelectType() != UniversitySelectType.OTHER){
Copy link
Member

Choose a reason for hiding this comment

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

if 앞에 공백 추가해주세요 !

public void assignUniversity(long universityId) {
this.universityId = universityId;
this.universitySelectType = UniversitySelectType.CATALOG;
}
Copy link
Member

Choose a reason for hiding this comment

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

도메인 메서드와 이를 사용하는 서비스 메서드 모두 APPROVED, REJECTED 인 지원서에도 대학 추가가 가능한 것으로 보입니다(관련 검증을 찾을 수 없습니다). 만약 PENDING 상태의 지원서만 대학이 추가되어야 한다면 관련 검증이 있어야 할 거 같습니다.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

@whqtker 말씀 하신 내용 적용 하였습니다!

* refactor: 개행 및 공백 추가

* refactor: pathVariable 네이밍을 kebab-case 로 통일
* refactor: PENDING 상태 및 OTHER 타입 검증을 도메인 메서드로 관리

* refactor: assignUniversity() 호출 전 검증 책임을 도메인 엔티티에 위임
@sukangpunch
Copy link
Contributor Author

늘 깔끔하게 잘 작성해주시네요! 저희가 이야기한 flow대로 잘 동작할 거 같아 문제 없을 거 같습니다! 그냥 근본적으로 이렇게 해결하는 게 맞나 싶긴하지만.. 이건 추후에 고민하도록하죠! (이말을 한 이유는 관리자가 너무 불필요한 작업이 많아질 거 같다는 생각이었습니다 ㅎㅎ..)

맞습니다.. 조금 더 직관적으로 처리할 수 있으면 좋을 듯 한데 좋은 방법이 떠오르지 않더군요 한번 회의 해보면 좋을 것 같습니다!

@Gyuhyeok99
Copy link
Contributor

머지해도 좋을 거 같습니다~

@sukangpunch sukangpunch merged commit 2cf03ee into solid-connection:develop Dec 27, 2025
2 checks passed
whqtker added a commit that referenced this pull request Jan 19, 2026
* fix: yml 들여쓰기 수정 (#555)

* fix: yml 들여쓰기 수정

* fix: jdk 변경

* refactor: 멘토 및 채팅 관련 API 응답 수정 (#537)

* refactor: 멘토의 멘토링 조회 응답에서 mentoringId가 아니라 roomId를 포함하도록

* refactor: 파트너가 멘토인 경우 partnerId는 mentorId로

- AS IS: 멘토/멘티 모두 partnerId가 siteUserId
- TO BE: 멘티: siteUserId, 멘토: mentorId

* refactor: 응답의 senderId가 mentorId/siteUserId가 되도록

* refactor: senderId에 해당하는 chatParticipant가 없을 경우 예외 처리하는 로직 추가

* refactor: 메서드명에 맞게 시그니처 변경

* refactor: getChatMessages 메서드에서 응답으로 siteUserId를 넘겨주도록

- AS IS: mentorId(mentor) / siteUserId(mentee)
- TO BE: siteUserId(all)

* refactor: 헬퍼 메서드로 메서드 복잡성을 분산한다

* refactor: getChatPartner 메서드의 응답으로 siteUserId를 넘겨주도록

- AS IS: mentorId(mentor) / siteUserId(mentee)
- TO BE: siteUserId(all)

* refactor: CD 성능 개선 (#552)

* fix: deprecated된 base image를 eclipse-temurin:17-jdk로 변경

* refactor: scp 파일 전송하는 방식에서 GHCR로 push/pull하도록 변경

* fix: GHCR image 제거시 Org의 GITHUB_TOKEN 사용하도록 변경

* refactor : scp 파일 전송하는 방식에서 GHCR로 push/pull하도록 prod-cd.yml과 docker-compose.prod.yml 변경

* fix: prod 인스턴스 old image 이름 통일

* fix: prod-cd.yml StrictHostKeyChecking 옵션 문법 오류 수정

* fix: prod-cd.yml StrictHostKeyChecking 옵션 문법 오류 수정

* fix: dev-cd.yml Old images 정리 작업 중 이미지 이름 불일치 문제 해결

* chore: 마지막 줄 개행 추가

* chore: 마지막 줄 개행 추가

* feat: stage 인스턴스에 대한 최신 이미지 5개 유지 기능 및 old 이미지 제거 기능 추가

* chore: 중복된 환경변수 지정 제거

* chore: 중복된 pem키 생성 로직 제거

* fix: 잘못된 pem키 이름 수정

* refactor: 원격 호스트에서 pull할 경우, 최소 권한으로 실행하도록 Github App으로 임시토큰 발급하도록 수정

* fix: Github App이 발행한 임시 토큰에 대해 읽기 권한 명시 (#565)

* fix: GitHub app token permission 문제 해결 (#566)

* fix: Github App이 발행한 임시 토큰에 대해 읽기 권한 명시

* fix: Github App이 발행한 임시 토큰에 대해 읽기 권한 명시 문법 오류 수정

* fix: Github App이 발행한 임시 토큰에 대해 읽기 권한 명시 문법 오류 수정

* fix: Github App이 발행한 임시 토큰에 대해 Contents 읽기 권한 추가

* fix: GitHub app token permission 문제 오류 해결 (#567)

* fix: Github App이 발행한 임시 토큰에 대해 읽기 권한 명시

* fix: Github App이 발행한 임시 토큰에 대해 읽기 권한 명시 문법 오류 수정

* fix: Github App이 발행한 임시 토큰에 대해 읽기 권한 명시 문법 오류 수정

* fix: Github App이 발행한 임시 토큰에 대해 Contents 읽기 권한 추가

* fix: Github App이 발행한 임시 토큰에 대해 조직 레벨에서 읽기 권한 추가

* fix: GitHub app token permission이 repo 레벨에서 부여되는 문제 해결 (#568)

* fix: Github App이 발행한 임시 토큰에 대해 읽기 권한 명시

* fix: Github App이 발행한 임시 토큰에 대해 읽기 권한 명시 문법 오류 수정

* fix: Github App이 발행한 임시 토큰에 대해 읽기 권한 명시 문법 오류 수정

* fix: Github App이 발행한 임시 토큰에 대해 Contents 읽기 권한 추가

* fix: Github App이 발행한 임시 토큰에 대해 조직 레벨에서 읽기 권한 추가

* fix: Github App이 발행한 임시 토큰에 대해 조직 레벨에서 읽기 권한 추가

* fix: GitHub app token permission 권한 오류 해결 (#569)

* fix: Github App이 발행한 임시 토큰에 대해 읽기 권한 명시

* fix: Github App이 발행한 임시 토큰에 대해 읽기 권한 명시 문법 오류 수정

* fix: Github App이 발행한 임시 토큰에 대해 읽기 권한 명시 문법 오류 수정

* fix: Github App이 발행한 임시 토큰에 대해 Contents 읽기 권한 추가

* fix: Github App이 발행한 임시 토큰에 대해 조직 레벨에서 읽기 권한 추가

* fix: Github App이 발행한 임시 토큰에 대해 조직 레벨에서 읽기 권한 추가

* fix: Github App이 발행한 임시 토큰에 대해 조직 레벨에서 읽기 권한 추가

* test: fork repo의 작업 branch에서 해당 workflows가 실행되도록 임시 수정

* refactor: test용 설정 제거

* feat: claude.md 파일 추가 (#560)

* fix : 동일 멘토 멘티 중복 신청 불가능하도록 수정 (#563)

* fix : 동일 멘토 멘티 중복 신청 불가능하도록 수정
- UK 제약조건 추가
- flyway script 추가
- CustomException 추가
- Service 로직 수정
- Test code 추가

* fix : column명 오류 수정
- column명 camelCase -> snake_case로 변경

* fix : column명 오류 수정
- column명 name으로 명시

* fix: GitHub app token permission 권한 오류 해결 (#570)

* fix: Github App이 발행한 임시 토큰에 대해 읽기 권한 명시

* fix: Github App이 발행한 임시 토큰에 대해 읽기 권한 명시 문법 오류 수정

* fix: Github App이 발행한 임시 토큰에 대해 읽기 권한 명시 문법 오류 수정

* fix: Github App이 발행한 임시 토큰에 대해 Contents 읽기 권한 추가

* fix: Github App이 발행한 임시 토큰에 대해 조직 레벨에서 읽기 권한 추가

* fix: Github App이 발행한 임시 토큰에 대해 조직 레벨에서 읽기 권한 추가

* fix: Github App이 발행한 임시 토큰에 대해 조직 레벨에서 읽기 권한 추가

* test: fork repo의 작업 branch에서 해당 workflows가 실행되도록 임시 수정

* refactor: test용 설정 제거

* fix: docker login username 불일치 문제

* refactor: 최소권한 원칙 적용을 위한 Action Job 분리

* refactor: 필요없는 주석 제거

* fix: GHCR 정리 권한 PAT로 해결 (#573)

* feat: 지원서가 APPROVED 인 유저의 멘토 생성 기능 추가 (#562)

* feat: 지원서가 APPROVED 인 유저의 멘토 생성 기능 추가

* refactor: submitMentorApplication 메서드의 멘토 지원 유효 검증 부분을 메서드로 추출

* refactor: MentorMyPage 생성, 수정 부분의 channel 생성, 업데이트 부분 중복 제거

* test: Mentor 생성 관련 테스트 추가

* fix: 코드래빗 리뷰 적용

* refactor: 멘토 생성 시 channelRequest가 null 일 떄 예외 처리

* feat: MentorApplicationRequest 필드에 유효성 어노테이션 추가

* test: 채널 검색 시 siteUserId로 조회하는 문제 해결

* fix: 리뷰 수정사항 적용

* fix: 파일 끝에 개행 추가

* refactor: 멘토 생성 메서드에서 siteUser의 검증 제외

* refactor: dto 단에서 채널 리스트 null 검증

* feat: MentorApplication에 termId 추가 flyway 스크립트 추가

* fix: flyway 버전 충돌 해결

* feat: 어드민 멘토 승격 요청 페이징 조회 기능 추가 (#576)

* feat: 어드민 멘토 지원서 페이징 조회 기능 추가

* feat: mentor/repository 패키지에 custom 패키지 추가

- custom 패키지에 페이징 조회를 책임지는 MentorApplicationFilterRepository 추가

- MentorApplicationSearchCondition 에서 넘긴 keyword 기반으로 닉네임, 권역, 나라, 학교명으로 필터링 검색 기능 추가

- MentorApplicationSearchCondition 에서 넘긴 mentorApplicationStatus 기반으로 승인, 거절, 진행중 으로 필터링 기능 추가

* test: 어드민 멘토 지원서 페이징 조회 테스트 추가

* feat: MentorApplication 엔티티에 approved_at 필드 추가 flyway 스크립트 작성

* fix: 파일 끝에 개행 추가

* refactor: 페이징 조회 시 count 쿼리에 불필요한 조인 막기

* fix: 코드래빗 리뷰 적용

* fix: flyway V39 스크립트 파일명 수정

* test: 테스트 코드 오류 수정, 검증 추가  

* test: 기대하는 값이랑 다른 테스트 응답을 수정합니다

* feat: 어드민 멘토 승격 지원서 승인/거절 기능, 상태 별 지원서 개수 조회 기능 추가 (#577)

* feat: 어드민 멘토 승격 지원서 승인/거절 기능 추가

* test: 어드민 멘토 지원서 승인/거절 테스트 추가

* feat: 멘토 지원서 상태별 개수 조회 기능 추가

* test: 멘토 지원서 상태별 개수 조회 테스트 추가

* fix: 대학이 선택되지 않은 멘토 지원서 승인 시 예외 발생하도록 수정

* refactor: 리뷰 내용 반영

* refactor: MENTOR_APPLICATION_ALREADY_CONFIRM -> MENTOR_APPLICATION_ALREADY_CONFIRMED 로 수정

* refactor: 멘토 지원서 거절 사유 관련하여 기획에 명시되지 않은 길이 제한 제거

* refactor: 리뷰 적용

* refactor: 변수명, 필드명 일관성 맞추기

* test: assertAll 적용

* feat: region 관련 관리 기능 추가 (#561)

* feat: 지역 생성 기능 구현 (AdminRegion)

지역을 생성하는 기능을 구현했습니다:
- AdminRegionCreateRequest: 지역 생성 요청 DTO
- AdminRegionResponse: 지역 응답 DTO
- AdminRegionService.createRegion(): 중복 검사를 포함한 지역 생성 로직
- AdminRegionController.createRegion(): HTTP POST 엔드포인트

중복 검사:
- 지역 코드 중복 확인
- 한글명 중복 확인

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <[email protected]>

* feat: 지역 수정/삭제/조회 기능 구현 및 테스트 추가 (AdminRegion)

지역 관리 기능을 완성했습니다:

구현 기능:
- AdminRegionUpdateRequest: 지역 수정 요청 DTO
- AdminRegionService.updateRegion(): 한글명 중복 검사를 포함한 지역 수정
- AdminRegionService.deleteRegion(): 지역 삭제
- AdminRegionService.getAllRegions(): 전체 지역 조회
- AdminRegionController: 수정/삭제/조회 HTTP 엔드포인트

테스트 코드 (AdminRegionServiceTest):
- CREATE: 정상 생성, 코드 중복, 한글명 중복 테스트
- UPDATE: 정상 수정, NOT_FOUND, 중복 한글명, 동일 한글명 테스트
- DELETE: 정상 삭제, NOT_FOUND 테스트
- READ: 빈 목록, 전체 조회 테스트

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <[email protected]>

* fix: 지역 관리 관련 에러코드 추가 (ErrorCode)

지역 관리 기능에 필요한 에러코드를 추가했습니다:
- REGION_NOT_FOUND: 존재하지 않는 지역
- REGION_ALREADY_EXISTS: 이미 존재하는 지역

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <[email protected]>

* fix: jpa 오류 수정

* refactor: 코드리뷰 반영

---------

Co-authored-by: Claude <[email protected]>

* fix: config.alloy 파일 경로 불일치 문제 해결 (#586)

* fix: config.alloy 파일 경로 불일치 문제 해결

* refactor: docker-compose를 수정하는게 아닌 cd.yml의 경로를 수정하여 해결

* feat: 소셜 로그인 사용자는 비밀번호 변경을 할 수 없다. (#582)

* feat: 소셜 로그인 사용자는 비밀번호 변경을 할 수 없도록

* test: 소셜 로그인 사용자 비밀번호 변경 관련 테스트 코드 작성

* chore: 컨벤션에 맞게 메서드명 변경

- ~~ 예외가 발생한다

* chore: 충돌 해결

* fix: Upgrade 헤더 유무에 따라 Connection 헤더의 값을 동적으로 설정하도록 (#581)

* fix: Upgrade 헤더 유무에 따라 Connection 헤더의 값을 동적으로 설정하도록

- Upgrade 헤더가 존재하면(e.g. WebSocket) upgrade로 설정
- Upgrade 헤더가 존재하지 않으면 keep-alive로 설정

* chore: 서브모듈 업데이트

* feat: 멘토 지원서 대학교 매핑 기능, 대학 선택 상태 페이징 조건 추가 (#583)

* feat: 멘토 지원서 검색 조건에 UniversitySelectType 추가

* feat: 어드민 멘토 지원서 페이징 조회 응답에 UniversitySelectType 추가

* test: 멘토 지원서 조회 테스트 추가

- test: UniversitySelectType 기반 페이징 조회 테스트 추가

* feat: 멘토 지원서에 대학 매핑 기능 추가

* test: 멘토 지원서 대학 매핑 테스트 추가

* refactor: 의미 없는 import 제거

* refactor: 리뷰 내용 반영

* refactor: 개행 및 공백 추가

* refactor: pathVariable 네이밍을 kebab-case 로 통일

* refactor: Service 레이어의 검증 로직을 도메인으로 이동

* refactor: PENDING 상태 및 OTHER 타입 검증을 도메인 메서드로 관리

* refactor: assignUniversity() 호출 전 검증 책임을 도메인 엔티티에 위임

* test : assertAll 로 검증 그룹화

* refactor: 스프링 부트 앱 외의 사이드 인프라 배포 과정을 분리 (#592)

* refactor: dev 환경에서의 side-infra 배포 과정 분리

* refactor: prod 환경에서의 side-infra 배포 과정 분리

* refactor: docker-compose 가 실행되고 있지 않아도 스크립트가 실패하지 않게 변경

* fix: docker compose up 시에 사용할 환경변수 중 누락된 변수를 추가

* fix: S3 이름 불일치 문제 해결 (#594)

* fix: s3 이름 불일치 문제 해결

* fix: s3와의 연동된 cloudfront URL로 수정

* refactor: 분리한 사이드 인프라에 대해서 필요없는 파일 정리 (#596)

* test: flyway 스크립트를 검증하는 테스트 코드 작성 (#588)

* test: flyway 스크립트를 검증하는 테스트 코드 작성

* fix: DirtiesContext 어노테이션을 통해 기존 컨텍스트를 폐기하도록

- 새로운 MySQL 환경에서 마이그레이션이 이루어지도록 수정

* fix: flyway 검증용의 별도의 MySQL 컨테이너를 사용하도록

* chore: 테스트 의도를 쉽게 이해할 수 있도록 주석 추가

* chore: 명시적으로 컨테이너를 시작하도록

- 또한 MySQLTestContainer 코드와 유사한 컨벤션을 가지도록 수정

* refactor: 게시글 조회 응답에 댓글 deprecated 여부 포함하도록 (#599)

* feat: 유저의 멘토 지원서 신청 이력 조회 기능 추가 (#603)

* feat: 유저의 멘토 지원 이력 조회 기능 추가

* refactor: 매개변수 타입 통일

* refactor: long 타입을 Long 으로 수정

* test: 멘토 지원서 이력 조회 테스트 추가

* test: MentorApplicationFixtureBuilder 에 rejectedReason 필드 및 빌더 메서드 추가

* refactor: 리뷰 사항 적용

* test: 멘토 지원서 이력 조회 에서 user와 university 재사용

* refactor: 긴 uri 를 짧게 수정

* refactor: 서브모듈 해시값 되돌리기

* refactor: 개행 지우기

* refactor: applicationOrder 자료형을 long 으로 수정

* fix: applicationOrder 를 int 자료형으로 처리하도록 복구

- 순서를 나타내고, 해당 값이 21억을 넘길 수 없다 판단하여 더 적합한 int 자료형으로 복구

* test: long type 을 기대하던 테스트 에러 해결

* fix: 탈퇴한 사용자가 물리적 삭제가 되지 않았던 문제를 해결한다 (#574)

* refactor: FK에 ON DELETE CASCADE 옵션 추가

* refactor: 삭제 메서드로 사용자 연관 데이터를 삭제하도록

* feat: 어드민 유저 차단 기능 추가 (#604)

* feat: 어드민 차단 기능

* test: 어드민 차단 기능

* feat: API 성능 로깅, 쿼리 별 메트릭 전송 추가 (#602)

* feat: HTTP 요청/응답 로깅 필터 구현

- traceId 기반 요청 추적
- 요청/응답 로깅
- CustomExceptionHandler와 중복 로깅 방지
- Actuator 엔드포인트 로깅 제외

* feat: ExceptionHandler에 중복 로깅 방지 플래그 및 userId 로깅 추가

* feat: API 수행시간 로깅 인터셉터 추가

* feat: ApiPerf 인터셉터, Logging 필터 빈 등록

* refactor: logback 설정 변경

- info, warn, error, api_perf 로 로그 파일 분리해서 관리

* feat: 쿼리 별 수행시간 메트릭 모니터링 추가

* feat: 데이터소스 프록시 의존성 및 config 파일 추가

* feat: 데이터 소스 프록시가 metric을 찍을 수 있도록 listener 클래스 추가

* feat: 요청 시 method, uri 정보를 listener에서 활용하기 위해 RequestContext 및 관련 interceptor 추가

* refactor: 비효율적인 Time 빌더 생성 개선

- Time.builder 를 사용하면 매번 빌더를 생성하여 비효율적인 문제를 meterRegistry.timer 방식으로 해결

* feat: 로깅을 위해 HttpServeletRequest 속성에 userId 추가

* refactor: logback 설정 중 local은 console만 찍도록 수정

* refactor: FILE_PATTERN -> LOG_PATTERN 으로 수정

* test: TokenAuthenticationFilter에서 request에 userId 설정 검증 추가

- principal 조회 예외를 막기 위해 siteUserDetailsService given 추가

* refacotr: 코드 래빗 리뷰사항 반영

* test: 중복되는 테스트 제거

* refactor: 사용하지 않는 필드 제거

* refactor: 리뷰 내용 반영

* refactor: ApiPerformanceInterceptor에서 uri 정규화 관련 코드 제거

* refactor: ApiPerformanceInterceptor에서 if-return 문을 if-else 문으로 수정

* refactor: 추가한 interceptor 의 설정에 actuator 경로 무시하도록 셋팅

* refactor: 중복되는 의존성 제거

* refactor: 로깅 시 민감한 쿼리 파라미터 마스킹

- EXCLUDE_QUERIES 에 해당하는 쿼리 파라미터 KEY 값의 VALUE 를 masking 값으로 치환

* refactor: 예외 처리 후에도 Response 로그 찍도록 수정

* refactor: CustomExceptionHandler 원상복구

- Response 로그를 통해 user를 추적할 수 있으므로 로그에 userId 를 추가하지 않습니다

* refactor: 리뷰 사항 반영

* refactor: RequestContext 빌더 제거

* refactor: RequestContextInterceptor import 수정

* refactor: logback yml 파일에서 timestamp 서버 시간과 동일한 규격으로 수정

* refactor: ApiPerformanceInterceptor 에서 동일 내용 로그 중복으로 찍는 문제 수정

* fix: decode를 두 번 하는 문제 수정

* test: 로깅 관련 filter, interceptor 테스트 추가

* refactor: 코드래빗 리뷰사항 반영

* test: contains 로 비교하던 검증 로직을 isEqualTo 로 수정

* test: preHandle 테스트 에서 result 값을 항상 검증

* refactor: 단위테스트에 TestContainer 어노테이션 제거

* fix: conflict 해결

* fix: docker-compose 충돌 해결 (#610)

* chore: release github action 임의 실행 추가

* refactor: 기본 추천 대학 후보 추가 (#161)

* fix: config.alloy 경로 수정

* hotfix: 모의지원 현황 어드민 권한 제거

* hotfix: import 제거

* chore: 서브모듈 해시 업데이트 (#611)
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: 대학이 선택되지 않은 멘토 지원서에 대하여 대학을 매핑 기능, 페이징 조회 기능 추가

3 participants