Skip to content

[REFACTOR/#504] 에러코드를 Swagger 문서에 자동으로 노출하도록 개선 - #505

Open
kimyw1018 wants to merge 1 commit into
developfrom
refactor/#504-swagger-operation-customizer
Open

kimyw1018 wants to merge 1 commit into
developfrom
refactor/#504-swagger-operation-customizer

Conversation

@kimyw1018

@kimyw1018 kimyw1018 commented Oct 7, 2026 •

Copy link
Copy Markdown
Contributor

#️⃣연관된 이슈

close #504

📝작업 내용

에러코드 분기는 되어 있지만 Swagger 등에 문서화가 안 되어 있어서 프론트가 적절히 분기 처리할 수 없는 문제를 해결합니다.
@ApiErrorCodeExamples 어노테이션 + SwaggerErrorCodes enum + SwaggerConfig의 OperationCustomizer를 추가해서, 엔드포인트별로 실제 던질 수 있는 에러코드를 Swagger 응답 예시(상태코드별 드롭다운 + 메시지 + 샘플 JSON)로 자동 노출하도록 했습니다.

🔎코드 설명(스크린샷(선택))

  • ErrorStatus(기존 단일 소스)는 그대로 유지하고, SwaggerErrorCodes enum에 엔드포인트별로 Set.of(ErrorStatus...)를 묶었습니다.
  • 컨트롤러 메서드에 @ApiErrorCodeExamples(SwaggerErrorCodes.XXX)를 붙이면, SwaggerConfig.customExceptionOperationCustomizer()가 리플렉션으로 읽어서 HTTP 상태코드별로 그룹핑된 예시를 Swagger UI에 추가합니다.
  • 34개 컨트롤러 전체를 서비스 구현체까지 추적해서, 각 핸들러가 실제로 던지는 ErrorStatus만 정확히 매핑했습니다. 예외를 던지지 않는 순수 조회 엔드포인트는 어노테이션을 달지 않았습니다.
  • JWT 필터 단의 전역 인증 에러(AUTHORIZATION_EXCEPTION 등)는 해당 엔드포인트 로직이 직접 던지는 경우에만 포함했습니다 (로그인/토큰갱신 등).

💬고민사항 및 리뷰 요구사항 (Optional)

  • ReportServiceImpl의 리뷰 신고 분기에서 리뷰를 못 찾았을 때 ErrorStatus.NO_SUCH_MEMBER를 던지는 기존 네이밍 이슈를 발견했는데, 이번 PR 범위 밖이라 수정하지 않고 있는 그대로 문서화했습니다. 별도 이슈로 다룰지 검토 부탁드립니다.
  • 컨트롤러 30개 + SwaggerConfig에 어노테이션/import만 추가하는 순수 추가(additive) 변경이라 기존 로직은 건드리지 않았습니다.

비고 (Optional)

./gradlew compileJava, ./gradlew test 모두 통과 확인했습니다.

Summary by CodeRabbit

  • 문서화
    • Swagger API 문서에서 관리자, 인증, 백오피스, 채팅, 회원, 제휴 등 주요 API별 오류 코드와 오류 응답 예시를 확인할 수 있습니다.
    • 오류 예시는 HTTP 상태 코드별로 표시되며, 실패 여부와 오류 코드, 메시지를 포함합니다.

- ApiErrorCodeExamples 어노테이션과 SwaggerErrorCodes enum 추가
- SwaggerConfig에 OperationCustomizer를 등록해 어노테이션을 읽어 상태코드별 에러 예시(JSON)를 Swagger에 자동 반영
- 34개 컨트롤러 전체에서 각 핸들러가 실제로 던지는 ErrorStatus를 서비스 체인까지 추적해 매핑 및 어노테이션 적용
@coderabbitai

coderabbitai Bot commented Oct 7, 2026 •

Copy link
Copy Markdown

Review in Change Stack →

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration
  • Configuration used: Repository: ASSU-dev/ASSU_BE/.coderabbit.yaml
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: bc6a5a37-0cb5-42dc-931f-0f85afc918b1
📥 Commits

Reviewing files that changed from the base of the PR and between 3c4e773 and 87e4c51.

📒 Files selected for processing (33)
  • src/main/java/com/assu/server/domain/admin/controller/AdminController.java
  • src/main/java/com/assu/server/domain/admin/controller/StudentAdminController.java
  • src/main/java/com/assu/server/domain/appreview/controller/AppReviewController.java
  • src/main/java/com/assu/server/domain/auth/controller/AuthController.java
  • src/main/java/com/assu/server/domain/auth/controller/BackofficeAuthController.java
  • src/main/java/com/assu/server/domain/backoffice/controller/BackofficeAdminController.java
  • src/main/java/com/assu/server/domain/backoffice/controller/BackofficeChatController.java
  • src/main/java/com/assu/server/domain/backoffice/controller/BackofficeDevSyncController.java
  • src/main/java/com/assu/server/domain/backoffice/controller/BackofficeHomeCurationController.java
  • src/main/java/com/assu/server/domain/backoffice/controller/BackofficeInquiryController.java
  • src/main/java/com/assu/server/domain/backoffice/controller/BackofficeMemberController.java
  • src/main/java/com/assu/server/domain/backoffice/controller/BackofficeNotificationController.java
  • src/main/java/com/assu/server/domain/backoffice/controller/BackofficeOperatorController.java
  • src/main/java/com/assu/server/domain/backoffice/controller/BackofficePaperController.java
  • src/main/java/com/assu/server/domain/backoffice/controller/BackofficePartnerController.java
  • src/main/java/com/assu/server/domain/backoffice/controller/BackofficeReportController.java
  • src/main/java/com/assu/server/domain/certification/controller/CertificationController.java
  • src/main/java/com/assu/server/domain/chat/controller/ChatController.java
  • src/main/java/com/assu/server/domain/deviceToken/controller/DeviceTokenController.java
  • src/main/java/com/assu/server/domain/inquiry/controller/InquiryController.java
  • src/main/java/com/assu/server/domain/member/controller/MemberController.java
  • src/main/java/com/assu/server/domain/notification/controller/NotificationController.java
  • src/main/java/com/assu/server/domain/partner/controller/PartnerController.java
  • src/main/java/com/assu/server/domain/partnership/controller/PartnershipController.java
  • src/main/java/com/assu/server/domain/qr/controller/TemporaryQrController.java
  • src/main/java/com/assu/server/domain/report/controller/ReportController.java
  • src/main/java/com/assu/server/domain/review/controller/ReviewController.java
  • src/main/java/com/assu/server/domain/store/controller/StoreController.java
  • src/main/java/com/assu/server/domain/student/controller/StudentController.java
  • src/main/java/com/assu/server/domain/suggestion/controller/SuggestionController.java
  • src/main/java/com/assu/server/global/apiPayload/code/status/SwaggerErrorCodes.java
  • src/main/java/com/assu/server/global/config/SwaggerConfig.java
  • src/main/java/com/assu/server/global/exception/annotation/ApiErrorCodeExamples.java

Included review availability: This review used your included allowance. Your plan provides up to 1 included review per hour; 0 remain after this review.


📝 Walkthrough

Walkthrough

컨트롤러 메서드에 작업별 오류 코드 예시를 연결했습니다. 새 애너테이션과 오류 코드 enum을 추가하고, Swagger 설정에서 해당 오류 코드로 HTTP 상태 코드별 JSON 응답 예시를 생성하도록 했습니다. 기존 API 처리와 요청·응답 시그니처는 변경하지 않았습니다.

Changes

Swagger 오류 응답 예시

Layer / File(s) Summary
오류 코드 계약과 예시 생성
src/main/java/com/assu/server/global/exception/annotation/ApiErrorCodeExamples.java, src/main/java/com/assu/server/global/apiPayload/code/status/SwaggerErrorCodes.java, src/main/java/com/assu/server/global/config/SwaggerConfig.java
작업별 ErrorStatus 집합을 담는 enum과 메서드 애너테이션을 추가했습니다. OperationCustomizer가 애너테이션을 읽고 상태 코드별 JSON 오류 예시를 등록합니다.
관리자·인증·백오피스 API 매핑
src/main/java/com/assu/server/domain/admin/controller/*, src/main/java/com/assu/server/domain/auth/controller/*, src/main/java/com/assu/server/domain/backoffice/controller/*
관리자 대시보드와 추천, 인증 및 백오피스 엔드포인트에 대응하는 오류 코드 예시 애너테이션을 추가했습니다.
인증·회원·알림 API 매핑
src/main/java/com/assu/server/domain/certification/controller/CertificationController.java, src/main/java/com/assu/server/domain/chat/controller/ChatController.java, src/main/java/com/assu/server/domain/deviceToken/controller/DeviceTokenController.java, src/main/java/com/assu/server/domain/inquiry/controller/InquiryController.java, src/main/java/com/assu/server/domain/member/controller/MemberController.java, src/main/java/com/assu/server/domain/notification/controller/NotificationController.java
인증 세션, 채팅, 기기 토큰, 문의, 프로필 이미지 및 알림 엔드포인트에 대응하는 오류 코드 예시 애너테이션을 추가했습니다.
제휴·학생·콘텐츠 API 매핑
src/main/java/com/assu/server/domain/appreview/controller/AppReviewController.java, src/main/java/com/assu/server/domain/partner/controller/PartnerController.java, src/main/java/com/assu/server/domain/partnership/controller/PartnershipController.java, src/main/java/com/assu/server/domain/qr/controller/TemporaryQrController.java, src/main/java/com/assu/server/domain/report/controller/ReportController.java, src/main/java/com/assu/server/domain/review/controller/ReviewController.java, src/main/java/com/assu/server/domain/store/controller/StoreController.java, src/main/java/com/assu/server/domain/student/controller/StudentController.java, src/main/java/com/assu/server/domain/suggestion/controller/SuggestionController.java
앱 리뷰, 파트너 추천, 제휴, QR, 신고, 리뷰, 매장, 학생 및 건의 엔드포인트에 대응하는 오류 코드 예시 애너테이션을 추가했습니다.

Priority: ➖ Normal

Estimated code review effort: 3 (Moderate) | ~25 minutes

Severity of issue fixed: Medium

Merge Risk: ⚪ Minimal · up to 87e4c

The Swagger examples can be merged after normal checks. Validation-error examples may omit field-level details, but API behavior is unchanged.

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ 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%. Docstring coverage is scoped to functions touched by this diff. Analyzed 125 functions across 33 files. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed 엔드포인트별 오류 코드 예시를 Swagger 문서에 자동으로 노출하는 핵심 변경을 명확히 요약합니다.
Linked Issues check ✅ Passed #504는 기존 ErrorStatus를 바탕으로 엔드포인트별 오류 예시를 OpenAPI에 추가하도록 요구합니다. SwaggerErrorCodes는 엔드포인트별 ErrorStatus 집합을 제공하고, 런타임 메서드 어노테이션 ApiErrorCodeExamples가 그 집합을 지정합니다. SwaggerConfig의 OperationCustomizer는 어노테이…
Out of Scope Changes check ✅ Passed 변경된 enum, 어노테이션, OperationCustomizer 및 컨트롤러 연결은 모두 #504의 Swagger 오류 응답 문서화 목적과 직접 관련됩니다. 요약상 기존 요청 처리 로직은 변경되지 않았습니다. 리뷰 미존재 시 NO_SUCH_MEMBER를 반환하는 기존 동작을 그대로 문서화한 것도 이번 작업 범위를 벗어난 동작 변경이 아닙니다.
  • Fix all pre-merge checks with AI
✨ Finishing Touches 💡 1
📝 Generate docstrings 💡
  • Commit to this branch
  • Create a new PR
🧪 Generate unit tests (beta)
  • Commit to this branch
  • Create a new PR
  • Autopilot · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

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

오류 코드가 이름을 얻고
상태 코드마다 예시가 놓입니다
메서드 위 작은 표식 하나
Swagger 문서에 응답을 더하고
같은 API 흐름은 그대로 갑니다
예시들이 가지런히 모입니다

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

@kimyw1018 kimyw1018 self-assigned this Oct 7, 2026

@2ghrms 2ghrms left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

굿입니다~ 테스트만 해보고 머지하면 좋을 것 같아요

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[REFACTOR/#504] 스웨거 에러 응답 명시

2 participants