Skip to content

[HSC-404] 전역 예외처리 구조 개선 및 인증/검증 응답 표준화#264

Merged
tkv00 merged 11 commits into
devfrom
refactor/HSC-404
Mar 23, 2026
Merged

[HSC-404] 전역 예외처리 구조 개선 및 인증/검증 응답 표준화#264
tkv00 merged 11 commits into
devfrom
refactor/HSC-404

Conversation

@tkv00
Copy link
Copy Markdown
Contributor

@tkv00 tkv00 commented Mar 23, 2026

📝작업 내용

전역 예외처리 구조를 CustomException 중심에서 DomainException 중심 구조로 리팩토링했습니다.

이번 PR에서 반영한 범위는 다음과 같습니다.

  • DomainException 도입 및 도메인별 에러 enum 분리
  • auth, customer, admin, infra 단위 예외 클래스 및 에러코드 구조 적용
  • 인증 예외처리를 Security 계층으로 이동하고 401/403 응답 중앙화
  • Request DTO 제약조건 및 @Valid 적용 범위 확대
  • DB unique constraint 충돌을 ErrorCode + field 구조로 매핑할 수 있도록 ConstraintExceptionMapper 도입
  • GlobalExceptionHandler를 새 예외 구조 기준으로 재정리

👀변경 사항

구분 변경 내용
예외 구조 CustomException 제거 후 DomainException 기반 구조로 전환
도메인별 에러코드 AuthErrorCode, CustomerErrorCode, AdminErrorCode, InfraErrorCode 추가
도메인별 예외 AuthException, CustomerException, AdminException, InfraException 추가
공통 에러코드 SharedErrorCode, ErrorCategory, ApiErrorResponseFactory 추가
인증 처리 SecurityConfig에 인증/인가 규칙 적용, ApiAuthenticationEntryPoint, ApiAccessDeniedHandler 추가
인증 응답 보호 API 접근 실패 시 Security 계층에서 401/403 공통 JSON 응답 반환
요청 검증 CreateCounselDto, ChangeProductRequest, LogFeatureWebhookRequest, AnalysisResponseWebhookRequest 등에 제약조건 추가
컨트롤러 검증 @RequestBody 기반 엔드포인트에 @Valid 적용 범위 확대
DB 충돌 응답 ConstraintMapping, ConstraintExceptionMapper 도입으로 DB constraint 예외를 구조화
전역 핸들러 validation/security/domain/db 예외를 공통 응답 포맷으로 직렬화하도록 정리

추가로 확인할 만한 정량 지표는 아래와 같습니다.

항목 기존 현재
인증 보호 엔드포인트 0/12 12/12
비인증 요청 500 오분류 위험 6개 0개
@RequestBody + @Valid 적용률 6/10 10/10
CustomException 사용 수 43 0
DomainException 계열 사용 수 0 44
DB constraint 명시 매핑률 2/11 2/11
DB constraint 인지 범위 2/11 11/11

커밋은 아래와 같이 나누었습니다.

  • [HSC-404] refactor: 도메인 예외 구조 도입
  • [HSC-404] feat: 인증 예외 처리 중앙화
  • [HSC-404] feat: 요청 검증과 DB 충돌 응답 개선

🎫 Jira Ticket

  • Jira Ticket: HCR-404

#️⃣관련 이슈

참고 자료

https://one-year-gap.github.io/docs/2026/03/22/%EC%97%90%EC%99%B8%EC%B2%98%EB%A6%AC-%EA%B3%A0%EB%8F%84%ED%99%94/

@tkv00 tkv00 requested review from YeongHyeonHeo, bon0512 and rettooo and removed request for bon0512 and rettooo March 23, 2026 00:41
@github-actions github-actions Bot added Customer Team ♻️ refactor 기능 변화가 아닌 코드 리팩터링 🔥 priority: P0 즉시 처리 필요(서비스/데모 블로커) 🗂️ area: BE 백엔드 영역 labels Mar 23, 2026
@github-actions github-actions Bot changed the title 전역 예외처리 구조 개선 및 인증/검증 응답 표준화 [HSC-404] 전역 예외처리 구조 개선 및 인증/검증 응답 표준화 Mar 23, 2026
@gemini-code-assist
Copy link
Copy Markdown

Summary of Changes

Hello, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

이번 PR은 전역 예외 처리 구조를 개선하고 인증/검증 응답을 표준화하여 애플리케이션의 안정성과 보안을 강화하는 데 중점을 둡니다. 또한, 요청 검증을 강화하고 DB 제약 조건 충돌 처리 방식을 개선하여 개발 및 유지보수 효율성을 높입니다.

Highlights

  • 전역 예외 처리 구조 개선: CustomException 중심에서 DomainException 중심으로 예외 처리 구조를 리팩토링하여 일관성을 높였습니다.
  • 인증/검증 응답 표준화: Security 계층으로 인증 예외 처리를 이동하고, 401/403 응답을 중앙화하여 보안을 강화했습니다.
  • 요청 검증 강화: Request DTO에 제약 조건을 추가하고 @Valid 적용 범위를 확대하여 데이터 유효성을 개선했습니다.
  • DB 제약 조건 충돌 처리 개선: ConstraintExceptionMapper를 도입하여 DB unique constraint 충돌을 구조화된 에러 코드로 매핑할 수 있도록 했습니다.
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for GitHub and other Google products, sign up here.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

@github-actions
Copy link
Copy Markdown

github-actions Bot commented Mar 23, 2026

🧪 Test Coverage Report (JaCoCo)

overall__line overall__branch changed__line changed__branch

기준(soft, workflow는 실패 안 함): Overall line 70% / branch 50%, Changed line 80% / branch 60% · Generated: 2026-03-23 06:42 UTC

Scope Line Branch Line Graph Branch Graph Verdict
Overall 41.1% 29.8% ████████░░░░░░░░░░░░ ██████░░░░░░░░░░░░░░ ⚠️⚠️
Changed 52.1% 45.3% ██████████░░░░░░░░░░ █████████░░░░░░░░░░░ ⚠️⚠️

Package line spark (sample): ▃▂▁▂▂▄▄·▇█▁▆▆▆·▆▁▁▆█▇▄▁▁▁██▁▁▃
Package branch spark (sample): ▃▁·▁▁·▁·▇··▅▆▅·▅▁▁▅▇▇▃▁·▁·█▁▁▁

📦 Package coverage (worst 10)

Rank Package Line Branch Lines Line Graph Branch Graph
1 site.holliverse.shared.monitoring 0.0% N/A 76 ░░░░░░░░░░░░░░░░░░░░ ░░░░░░░░░░░░░░░░░░░░
2 site.holliverse.customer.application.usecase.log 0.0% 0.0% 69 ░░░░░░░░░░░░░░░░░░░░ ░░░░░░░░░░░░░░░░░░░░
3 site.holliverse.customer.coupon.application 0.0% 0.0% 61 ░░░░░░░░░░░░░░░░░░░░ ░░░░░░░░░░░░░░░░░░░░
4 site.holliverse.infra.kafka.consumer 0.0% 0.0% 55 ░░░░░░░░░░░░░░░░░░░░ ░░░░░░░░░░░░░░░░░░░░
5 site.holliverse.customer.integration.fastapi 0.0% 0.0% 28 ░░░░░░░░░░░░░░░░░░░░ ░░░░░░░░░░░░░░░░░░░░
6 site.holliverse.customer.integration.external 0.0% 0.0% 28 ░░░░░░░░░░░░░░░░░░░░ ░░░░░░░░░░░░░░░░░░░░
7 site.holliverse.customer.application.usecase.counsel 0.0% 0.0% 14 ░░░░░░░░░░░░░░░░░░░░ ░░░░░░░░░░░░░░░░░░░░
8 site.holliverse.customer.coupon.web 0.0% 0.0% 12 ░░░░░░░░░░░░░░░░░░░░ ░░░░░░░░░░░░░░░░░░░░
9 site.holliverse.shared.config.runtime 0.0% N/A 11 ░░░░░░░░░░░░░░░░░░░░ ░░░░░░░░░░░░░░░░░░░░
10 site.holliverse.customer.web.util 0.0% 0.0% 8 ░░░░░░░░░░░░░░░░░░░░ ░░░░░░░░░░░░░░░░░░░░

🧨 Lowest coverage classes (worst 10)

Rank Class Line Branch Lines Line Graph Branch Graph
1 site.holliverse.infra.kafka.consumer.RecommendationKafkaConsumer 0.0% 0.0% 55 ░░░░░░░░░░░░░░░░░░░░ ░░░░░░░░░░░░░░░░░░░░
2 site.holliverse.customer.application.usecase.log.UserLogService 0.0% 0.0% 52 ░░░░░░░░░░░░░░░░░░░░ ░░░░░░░░░░░░░░░░░░░░
3 site.holliverse.shared.monitoring.CustomerMetrics 0.0% N/A 50 ░░░░░░░░░░░░░░░░░░░░ ░░░░░░░░░░░░░░░░░░░░
4 site.holliverse.admin.application.usecase.CalculateLogChurnScoreService 0.0% 0.0% 38 ░░░░░░░░░░░░░░░░░░░░ ░░░░░░░░░░░░░░░░░░░░
5 site.holliverse.admin.application.usecase.CalculateChurnScoreService 0.0% 0.0% 37 ░░░░░░░░░░░░░░░░░░░░ ░░░░░░░░░░░░░░░░░░░░
6 site.holliverse.customer.coupon.application.UseMemberCouponUseCase 0.0% 0.0% 34 ░░░░░░░░░░░░░░░░░░░░ ░░░░░░░░░░░░░░░░░░░░
7 site.holliverse.admin.application.usecase.ChurnRiskReason$ReasonCode 0.0% 0.0% 31 ░░░░░░░░░░░░░░░░░░░░ ░░░░░░░░░░░░░░░░░░░░
8 site.holliverse.customer.integration.fastapi.FastApiRecommendationClient 0.0% 0.0% 28 ░░░░░░░░░░░░░░░░░░░░ ░░░░░░░░░░░░░░░░░░░░
9 site.holliverse.customer.integration.external.AdminLogFeaturesClient 0.0% 0.0% 28 ░░░░░░░░░░░░░░░░░░░░ ░░░░░░░░░░░░░░░░░░░░
10 site.holliverse.customer.coupon.application.GetMemberCouponsUseCase 0.0% 0.0% 27 ░░░░░░░░░░░░░░░░░░░░ ░░░░░░░░░░░░░░░░░░░░
🧩 Changed files coverage breakdown (69 files)
File Line Branch Lines Verdict Line Graph Branch Graph
src/main/java/site/holliverse/admin/application/usecase/ChurnCouponIssueProcessor.java 0.0% 0.0% 16 ⚠️⚠️ ░░░░░░░░░░░░░░░░░░░░ ░░░░░░░░░░░░░░░░░░░░
src/main/java/site/holliverse/admin/application/usecase/HandleLogFeatureUseCase.java 0.0% N/A 10 ⚠️ ░░░░░░░░░░░░░░░░░░░░ ░░░░░░░░░░░░░░░░░░░░
src/main/java/site/holliverse/admin/application/usecase/UserActionFeatureEventName.java 0.0% N/A 13 ⚠️ ░░░░░░░░░░░░░░░░░░░░ ░░░░░░░░░░░░░░░░░░░░
src/main/java/site/holliverse/admin/web/controller/ChurnRealTimeController.java 0.0% N/A 6 ⚠️ ░░░░░░░░░░░░░░░░░░░░ ░░░░░░░░░░░░░░░░░░░░
src/main/java/site/holliverse/admin/web/controller/InternalAnalysisWebhookController.java 0.0% 0.0% 27 ⚠️⚠️ ░░░░░░░░░░░░░░░░░░░░ ░░░░░░░░░░░░░░░░░░░░
src/main/java/site/holliverse/admin/web/controller/InternalLogFeatureController.java 0.0% N/A 2 ⚠️ ░░░░░░░░░░░░░░░░░░░░ ░░░░░░░░░░░░░░░░░░░░
src/main/java/site/holliverse/auth/handler/ApiAuthenticationEntryPoint.java 0.0% N/A 8 ⚠️ ░░░░░░░░░░░░░░░░░░░░ ░░░░░░░░░░░░░░░░░░░░
src/main/java/site/holliverse/customer/application/usecase/counsel/CreateCounselUseCase.java 0.0% 0.0% 14 ⚠️⚠️ ░░░░░░░░░░░░░░░░░░░░ ░░░░░░░░░░░░░░░░░░░░
src/main/java/site/holliverse/customer/application/usecase/log/UserLogService.java 0.0% 0.0% 52 ⚠️⚠️ ░░░░░░░░░░░░░░░░░░░░ ░░░░░░░░░░░░░░░░░░░░
src/main/java/site/holliverse/customer/application/usecase/recommendation/RecommendationPendingFutureRegistry.java 0.0% N/A 5 ⚠️ ░░░░░░░░░░░░░░░░░░░░ ░░░░░░░░░░░░░░░░░░░░
src/main/java/site/holliverse/customer/coupon/application/GetMemberCouponsUseCase.java 0.0% 0.0% 27 ⚠️⚠️ ░░░░░░░░░░░░░░░░░░░░ ░░░░░░░░░░░░░░░░░░░░
src/main/java/site/holliverse/customer/coupon/application/UseMemberCouponUseCase.java 0.0% 0.0% 34 ⚠️⚠️ ░░░░░░░░░░░░░░░░░░░░ ░░░░░░░░░░░░░░░░░░░░
src/main/java/site/holliverse/customer/integration/external/AdminLogFeaturesClient.java 0.0% 0.0% 28 ⚠️⚠️ ░░░░░░░░░░░░░░░░░░░░ ░░░░░░░░░░░░░░░░░░░░
src/main/java/site/holliverse/customer/integration/fastapi/FastApiRecommendationClient.java 0.0% 0.0% 28 ⚠️⚠️ ░░░░░░░░░░░░░░░░░░░░ ░░░░░░░░░░░░░░░░░░░░
src/main/java/site/holliverse/customer/web/controller/CounselController.java 0.0% N/A 2 ⚠️ ░░░░░░░░░░░░░░░░░░░░ ░░░░░░░░░░░░░░░░░░░░
src/main/java/site/holliverse/infra/kafka/consumer/RecommendationKafkaConsumer.java 0.0% 0.0% 55 ⚠️⚠️ ░░░░░░░░░░░░░░░░░░░░ ░░░░░░░░░░░░░░░░░░░░
src/main/java/site/holliverse/shared/error/ConstraintMapping.java 0.0% N/A 1 ⚠️ ░░░░░░░░░░░░░░░░░░░░ ░░░░░░░░░░░░░░░░░░░░
src/main/java/site/holliverse/shared/monitoring/CustomerMetrics.java 0.0% N/A 50 ⚠️ ░░░░░░░░░░░░░░░░░░░░ ░░░░░░░░░░░░░░░░░░░░
src/main/java/site/holliverse/shared/monitoring/CustomerMonitoringBinder.java 0.0% N/A 26 ⚠️ ░░░░░░░░░░░░░░░░░░░░ ░░░░░░░░░░░░░░░░░░░░
src/main/java/site/holliverse/auth/application/usecase/TokenRevoker.java 42.9% N/A 7 ⚠️ █████████░░░░░░░░░░░ ░░░░░░░░░░░░░░░░░░░░
src/main/java/site/holliverse/customer/application/usecase/recommendation/RecommendationService.java 50.6% 25.0% 81 ⚠️⚠️ ██████████░░░░░░░░░░ █████░░░░░░░░░░░░░░░
src/main/java/site/holliverse/auth/web/controller/AuthController.java 80.0% 75.0% 25 ✅✅ ████████████████░░░░ ███████████████░░░░░
src/main/java/site/holliverse/customer/application/usecase/member/GetCustomerProfileUseCase.java 86.4% 60.5% 81 ✅✅ █████████████████░░░ ████████████░░░░░░░░
src/main/java/site/holliverse/customer/application/usecase/product/ChangeProductUseCase.java 87.0% 75.0% 23 ✅✅ █████████████████░░░ ███████████████░░░░░
src/main/java/site/holliverse/coupon/application/CouponGrantService.java 94.1% 75.0% 17 ✅✅ ███████████████████░ ███████████████░░░░░
src/main/java/site/holliverse/auth/application/usecase/RefreshTokenUseCase.java 96.8% 75.0% 31 ✅✅ ███████████████████░ ███████████████░░░░░
src/main/java/site/holliverse/customer/application/usecase/persona/GetMyPersonaUseCase.java 97.4% 83.3% 38 ✅✅ ███████████████████░ █████████████████░░░
src/main/java/site/holliverse/auth/application/usecase/AuthUseCase.java 98.8% 85.7% 82 ✅✅ ████████████████████ █████████████████░░░
src/main/java/site/holliverse/admin/application/usecase/BulkUpdateMemberStatusUseCase.java 100.0% 100.0% 8 ✅✅ ████████████████████ ████████████████████
src/main/java/site/holliverse/admin/application/usecase/GetKeywordBubbleChartUseCase.java 100.0% 77.8% 31 ✅✅ ████████████████████ ████████████████░░░░
src/main/java/site/holliverse/admin/application/usecase/GetMemberDetailUseCase.java 100.0% N/A 4 ✅✅ ████████████████████ ░░░░░░░░░░░░░░░░░░░░
src/main/java/site/holliverse/admin/application/usecase/IssueChurnCouponUseCase.java 100.0% 100.0% 20 ✅✅ ████████████████████ ████████████████████
src/main/java/site/holliverse/admin/application/usecase/UpdateMemberUseCase.java 100.0% 80.0% 18 ✅✅ ████████████████████ ████████████████░░░░
src/main/java/site/holliverse/admin/web/controller/CounselController.java 100.0% N/A 6 ✅✅ ████████████████████ ░░░░░░░░░░░░░░░░░░░░
src/main/java/site/holliverse/auth/application/usecase/CustomerInitialPlanAssignmentUseCase.java 100.0% 75.0% 16 ✅✅ ████████████████████ ███████████████░░░░░
src/main/java/site/holliverse/customer/application/usecase/product/GetProductDetailUseCase.java 100.0% 83.3% 53 ✅✅ ████████████████████ █████████████████░░░
src/main/java/site/holliverse/customer/domain/policy/SubscriptionChangePolicy.java 100.0% 100.0% 5 ✅✅ ████████████████████ ████████████████████
src/main/java/site/holliverse/customer/web/controller/PersonaController.java 100.0% N/A 17 ✅✅ ████████████████████ ░░░░░░░░░░░░░░░░░░░░
src/main/java/site/holliverse/customer/web/controller/ProductController.java 100.0% N/A 10 ✅✅ ████████████████████ ░░░░░░░░░░░░░░░░░░░░
src/main/java/site/holliverse/customer/web/controller/RecommendationController.java 100.0% N/A 2 ✅✅ ████████████████████ ░░░░░░░░░░░░░░░░░░░░
src/main/java/site/holliverse/customer/web/controller/SubscriptionController.java 100.0% N/A 4 ✅✅ ████████████████████ ░░░░░░░░░░░░░░░░░░░░
src/main/java/site/holliverse/admin/error/AdminErrorCode.java N/A N/A 0 ✅✅ ░░░░░░░░░░░░░░░░░░░░ ░░░░░░░░░░░░░░░░░░░░
src/main/java/site/holliverse/admin/error/AdminException.java N/A N/A 0 ✅✅ ░░░░░░░░░░░░░░░░░░░░ ░░░░░░░░░░░░░░░░░░░░
src/main/java/site/holliverse/admin/web/dto/analytics/AdminRegionalMetricRequestDto.java N/A N/A 0 ✅✅ ░░░░░░░░░░░░░░░░░░░░ ░░░░░░░░░░░░░░░░░░░░
src/main/java/site/holliverse/admin/web/dto/counsel/AnalysisResponseWebhookRequest.java N/A N/A 0 ✅✅ ░░░░░░░░░░░░░░░░░░░░ ░░░░░░░░░░░░░░░░░░░░
src/main/java/site/holliverse/admin/web/dto/log/LogFeatureWebhookRequest.java N/A N/A 0 ✅✅ ░░░░░░░░░░░░░░░░░░░░ ░░░░░░░░░░░░░░░░░░░░
src/main/java/site/holliverse/auth/error/AuthErrorCode.java N/A N/A 0 ✅✅ ░░░░░░░░░░░░░░░░░░░░ ░░░░░░░░░░░░░░░░░░░░
src/main/java/site/holliverse/auth/error/AuthException.java N/A N/A 0 ✅✅ ░░░░░░░░░░░░░░░░░░░░ ░░░░░░░░░░░░░░░░░░░░
src/main/java/site/holliverse/auth/handler/ApiAccessDeniedHandler.java N/A N/A 0 ✅✅ ░░░░░░░░░░░░░░░░░░░░ ░░░░░░░░░░░░░░░░░░░░
src/main/java/site/holliverse/auth/handler/LoginFailureHandler.java N/A N/A 0 ✅✅ ░░░░░░░░░░░░░░░░░░░░ ░░░░░░░░░░░░░░░░░░░░
src/main/java/site/holliverse/auth/handler/SocialFailureHandler.java N/A N/A 0 ✅✅ ░░░░░░░░░░░░░░░░░░░░ ░░░░░░░░░░░░░░░░░░░░
src/main/java/site/holliverse/customer/config/AdminLogFeaturesConfig.java N/A N/A 0 ✅✅ ░░░░░░░░░░░░░░░░░░░░ ░░░░░░░░░░░░░░░░░░░░
src/main/java/site/holliverse/customer/config/IntegrationConfig.java N/A N/A 0 ✅✅ ░░░░░░░░░░░░░░░░░░░░ ░░░░░░░░░░░░░░░░░░░░
src/main/java/site/holliverse/customer/error/CustomerErrorCode.java N/A N/A 0 ✅✅ ░░░░░░░░░░░░░░░░░░░░ ░░░░░░░░░░░░░░░░░░░░
src/main/java/site/holliverse/customer/error/CustomerException.java N/A N/A 0 ✅✅ ░░░░░░░░░░░░░░░░░░░░ ░░░░░░░░░░░░░░░░░░░░
src/main/java/site/holliverse/customer/web/dto/counsel/CreateCounselDto.java N/A N/A 0 ✅✅ ░░░░░░░░░░░░░░░░░░░░ ░░░░░░░░░░░░░░░░░░░░
src/main/java/site/holliverse/customer/web/dto/product/change/ChangeProductRequest.java N/A N/A 0 ✅✅ ░░░░░░░░░░░░░░░░░░░░ ░░░░░░░░░░░░░░░░░░░░
src/main/java/site/holliverse/infra/error/InfraErrorCode.java N/A N/A 0 ✅✅ ░░░░░░░░░░░░░░░░░░░░ ░░░░░░░░░░░░░░░░░░░░
src/main/java/site/holliverse/infra/error/InfraException.java N/A N/A 0 ✅✅ ░░░░░░░░░░░░░░░░░░░░ ░░░░░░░░░░░░░░░░░░░░
src/main/java/site/holliverse/infra/kafka/config/RecommendationKafkaConfig.java N/A N/A 0 ✅✅ ░░░░░░░░░░░░░░░░░░░░ ░░░░░░░░░░░░░░░░░░░░
src/main/java/site/holliverse/shared/config/AsyncConfig.java N/A N/A 0 ✅✅ ░░░░░░░░░░░░░░░░░░░░ ░░░░░░░░░░░░░░░░░░░░
src/main/java/site/holliverse/shared/config/web/GlobalExceptionHandler.java N/A N/A 0 ✅✅ ░░░░░░░░░░░░░░░░░░░░ ░░░░░░░░░░░░░░░░░░░░
src/main/java/site/holliverse/shared/error/ApiErrorResponseFactory.java N/A N/A 0 ✅✅ ░░░░░░░░░░░░░░░░░░░░ ░░░░░░░░░░░░░░░░░░░░
src/main/java/site/holliverse/shared/error/ConstraintExceptionMapper.java N/A N/A 0 ✅✅ ░░░░░░░░░░░░░░░░░░░░ ░░░░░░░░░░░░░░░░░░░░
src/main/java/site/holliverse/shared/error/DomainException.java N/A N/A 0 ✅✅ ░░░░░░░░░░░░░░░░░░░░ ░░░░░░░░░░░░░░░░░░░░
src/main/java/site/holliverse/shared/error/ErrorCategory.java N/A N/A 0 ✅✅ ░░░░░░░░░░░░░░░░░░░░ ░░░░░░░░░░░░░░░░░░░░
src/main/java/site/holliverse/shared/error/ErrorCode.java N/A N/A 0 ✅✅ ░░░░░░░░░░░░░░░░░░░░ ░░░░░░░░░░░░░░░░░░░░
src/main/java/site/holliverse/shared/error/SharedErrorCode.java N/A N/A 0 ✅✅ ░░░░░░░░░░░░░░░░░░░░ ░░░░░░░░░░░░░░░░░░░░
src/main/java/site/holliverse/shared/security/SecurityConfig.java N/A N/A 0 ✅✅ ░░░░░░░░░░░░░░░░░░░░ ░░░░░░░░░░░░░░░░░░░░

🔎 HTML 리포트: Actions → Artifacts → jacoco-html · XML: jacoco-xml

Copy link
Copy Markdown

@gemini-code-assist gemini-code-assist Bot left a comment

Choose a reason for hiding this comment

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

Code Review

전반적으로 매우 훌륭한 리팩토링입니다. CustomException을 도메인별 예외 계층(DomainException, AuthException 등)으로 전환하고, ErrorCode를 인터페이스로 추상화하여 각 Bounded Context의 독립성을 높인 점이 인상적입니다. 또한, GlobalExceptionHandlerFactoryMapper를 사용해 재구성하고 Spring Security 설정을 강화하여 코드의 안정성과 유지보수성을 크게 향상시켰습니다. 한 가지 아키텍처 관련 제안 사항을 리뷰 코멘트로 남겼으니 확인 부탁드립니다.

Comment on lines 9 to 12
import site.holliverse.customer.persistence.entity.Product;
import site.holliverse.customer.persistence.entity.Subscription;
import site.holliverse.customer.persistence.repository.ProductRepository;
import site.holliverse.customer.persistence.repository.SubscriptionRepository;
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

high

[위반 규칙]: 아키텍처 의존성 방향

[문제 이유]:
auth 모듈에 위치한 CustomerInitialPlanAssignmentUseCasecustomer 모듈의 퍼시스턴스 계층(ProductRepository, SubscriptionRepository 등)에 직접 의존하고 있습니다.

  • 스타일 가이드(24-27행)에 명시된 admincustomer 간의 의존성 규칙처럼, auth와 같은 핵심 도메인이 다른 비즈니스 도메인(customer)에 의존하는 것은 아키텍처적으로 바람직하지 않습니다.
  • 이는 모듈 간 결합도를 높이고, 향후 customer 모듈이 auth 모듈에 의존해야 할 경우 순환 참조 문제를 야기할 수 있습니다.

InitialPlanAssignmentService 포트(Port)가 auth 도메인에 있는 것은 올바르지만, customer 도메인에 특화된 구현체(Adapter)는 customer 모듈 내에 위치하는 것이 의존성 역전 원칙(DIP)에 부합합니다.

[해결 제안]:
CustomerInitialPlanAssignmentUseCase.java 파일을 auth 모듈에서 customer 모듈로 이동하는 것을 제안합니다. 예를 들어 site.holliverse.customer.application.usecase.auth와 같은 패키지를 생성하여 관리하면, customerauth의 인터페이스에 의존하는 자연스러운 방향이 되어 모듈 간 경계가 더 명확해집니다.

References
  1. Customer와 Admin 모듈 간의 의존성 방향을 엄격히 제한하는 규칙입니다. 이 규칙의 원칙을 다른 모듈(auth, customer) 간의 관계에도 적용할 때, 현재 구현은 authcustomer에 의존하는 바람직하지 않은 방향을 가지고 있습니다. (link)

Copy link
Copy Markdown
Contributor

@rettooo rettooo left a comment

Choose a reason for hiding this comment

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

인증 예외 처리와 도메인 별로 예외 처리로 일관되게 잘 해주셨네요 ! 수고하셨습니다!

Copy link
Copy Markdown
Contributor

@YeongHyeonHeo YeongHyeonHeo left a comment

Choose a reason for hiding this comment

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

고생하셨습니다!!

tkv00 and others added 4 commits March 23, 2026 15:25
… refactor/HSC-404

# Conflicts:
#	src/main/java/site/holliverse/admin/application/usecase/ChurnCouponIssueProcessor.java
…HSC-404

# Conflicts:
#	src/main/java/site/holliverse/admin/application/usecase/ChurnCouponIssueProcessor.java
@tkv00 tkv00 merged commit 02c21e3 into dev Mar 23, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

🗂️ area: BE 백엔드 영역 Customer Team 🔥 priority: P0 즉시 처리 필요(서비스/데모 블로커) ♻️ refactor 기능 변화가 아닌 코드 리팩터링

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[HSC-404] 도메인 모델별로 예외처리 고도화

3 participants