Skip to content

[Feat] ErrorCode 도메인별 세분화#190

Merged
noeyoseel merged 4 commits into
mainfrom
feat/185-error-code-domain
Jun 23, 2026
Merged

[Feat] ErrorCode 도메인별 세분화#190
noeyoseel merged 4 commits into
mainfrom
feat/185-error-code-domain

Conversation

@noeyoseel

@noeyoseel noeyoseel commented Jun 23, 2026

Copy link
Copy Markdown
Collaborator

User description

🔎 What

  • ErrorCode 11개 → 26개 (Auth/Garden/AI/Collection 도메인 추가)
  • CustomException.of(ErrorCode) 팩토리 메서드 추가
  • 12개 서비스 파일에서 문자열 방식 예외를 ErrorCode 기반으로 교체

🔗 Issue

✅ 체크리스트

  • 브랜치 base가 적절한가요?
  • 제목이 이슈 제목과 동일한가요?
  • 최소 1명의 리뷰를 받았나요?

PR Type

Enhancement


Description

이 PR은 기존의 부족했던 에러 코드를 도메인별로 세분화하고, 서비스 전반의 예외 처리 방식을 통일하여 시스템의 안정성과 디버깅 효율성을 크게 향상시킵니다.

  • 도메인별(Auth, Garden, AI, Collection) ErrorCode 26개로 확장

  • CustomException.of(ErrorCode) 팩토리 메서드 도입으로 예외 처리 간소화

  • 12개 서비스 파일에서 문자열 기반 예외를 ErrorCode 기반으로 교체

  • GlobalExceptionHandler에 5가지 시스템 예외 처리 로직 추가


Diagram Walkthrough

flowchart LR
  A[기존 서비스 로직] -- "문자열 기반 예외" --> B(CustomException.notFound/forbidden);
  subgraph New Exception Flow
    C[서비스 로직] -- "ErrorCode 기반 예외 발생" --> D(CustomException.of(ErrorCode));
    D -- "세분화된 에러 코드 사용" --> E[ErrorCode Enum];
    E -- "Auth, Garden, AI, Collection 등 도메인별 코드 추가" --> F[확장된 ErrorCode 목록];
  end
  G[GlobalExceptionHandler] -- "새로운 시스템 예외 처리" --> H[MissingRequestHeaderException, DataIntegrityViolationException 등];
  A --> C;
  B -- "제거" --> D;
  D -- "처리" --> G;
  H -- "처리" --> G;
Loading

File Walkthrough

Relevant files
Enhancement
15 files
AiResultService.java
AI 결과 서비스 예외 처리 ErrorCode로 변경                                                       
+7/-6     
AiService.java
AI 서비스 예외 처리 ErrorCode로 변경                                                             
+7/-6     
AuthService.java
인증 서비스 예외 처리 ErrorCode로 변경                                                             
+4/-3     
ExperienceService.java
경험치 서비스 예외 처리 ErrorCode로 변경                                                           
+3/-2     
GardenDashboardService.java
대시보드 서비스 예외 처리 ErrorCode로 변경                                                         
+5/-4     
GardenService.java
정원 서비스 예외 처리 ErrorCode로 변경                                                             
+2/-1     
HarvestService.java
수확 서비스 예외 처리 ErrorCode로 변경                                                             
+5/-4     
PotPlantService.java
화분 식물 서비스 예외 처리 ErrorCode로 변경                                                       
+8/-7     
PotService.java
화분 서비스 예외 처리 ErrorCode로 변경                                                             
+10/-9   
SeedAssignmentService.java
씨앗 배정 서비스 예외 처리 ErrorCode로 변경                                                       
+3/-2     
TilService.java
TIL 서비스 예외 처리 ErrorCode로 변경                                                           
+4/-3     
UserService.java
사용자 서비스 예외 처리 ErrorCode로 변경                                                           
+4/-3     
CustomException.java
ErrorCode 기반 팩토리 메서드 `of()` 추가                                                     
+4/-0     
ErrorCode.java
Auth, Garden, AI, Collection 도메인별 ErrorCode 추가 및 확장           
+22/-0   
GlobalExceptionHandler.java
다양한 시스템 예외 처리 핸들러 추가                                                                         
+45/-0   

@github-actions

Copy link
Copy Markdown

PR Reviewer Guide 🔍

Here are some key observations to aid the review process:

🎫 Ticket compliance analysis 🔶

185 - Partially compliant

Compliant requirements:

  • Garden 관련 에러 코드 추가 및 적용
  • Auth 관련 에러 코드 추가 및 적용
  • AI 관련 에러 코드 추가 및 적용
  • CustomException.of(ErrorCode) 팩토리 메서드 추가
  • GlobalExceptionHandler에 5가지 시스템 예외 처리 로직 추가

Non-compliant requirements:

  • COLLECTION_EMPTY ErrorCode가 추가되었으나, SeedAssignmentService에서 해당 ErrorCode를 사용하도록 교체되지 않음.
  • USER_NOT_FOUND ErrorCode가 이미 존재함에도 불구하고, TilServiceUserService에서 CustomException.notFound("사용자를 찾을 수 없습니다.") 문자열 방식이 여전히 사용되고 있음.

Requires further human verification:

  • 없음
⏱️ Estimated effort to review: 2 🔵🔵⚪⚪⚪
🧪 No relevant tests
🔒 No security concerns identified
⚡ Recommended focus areas for review

일관성 없는 에러 코드 사용

SeedAssignmentServiceselectFromCollection 메서드에서 CustomException.notFound("해금된 씨앗이 없습니다.")를 사용하고 있습니다. PR의 목표는 도메인별 ErrorCode를 세분화하고 이를 통해 예외 처리를 통일하는 것이므로, 새로 추가된 ErrorCode.COLLECTION_EMPTY를 사용하도록 변경해야 합니다. 이는 에러 처리의 일관성을 저해하고, 향후 에러 메시지 관리 및 디버깅을 어렵게 만들 수 있습니다.

throw CustomException.notFound("해금된 씨앗이 없습니다.");
기존 ErrorCode 미사용

TilServicecreatesaveDraft 메서드에서 CustomException.notFound("사용자를 찾을 수 없습니다.")를 사용하고 있습니다. ErrorCode enum에는 이미 USER_NOT_FOUND가 정의되어 있으므로, 이를 활용하여 예외 처리를 통일하는 것이 좋습니다. 이는 에러 처리의 일관성을 유지하고, 중복된 에러 메시지 정의를 피하는 데 도움이 됩니다.

User user = userRepository.findById(userId)
        .orElseThrow(() -> CustomException.notFound("사용자를 찾을 수 없습니다."));
기존 ErrorCode 미사용

UserServicechangePasswordupdateUserMe 메서드에서 CustomException.notFound("사용자를 찾을 수 없습니다.")를 사용하고 있습니다. ErrorCode enum에는 이미 USER_NOT_FOUND가 정의되어 있으므로, 이를 활용하여 예외 처리를 통일하는 것이 좋습니다. 이는 에러 처리의 일관성을 유지하고, 중복된 에러 메시지 정의를 피하는 데 도움이 됩니다.

User user = userRepository.findById(userId)
        .orElseThrow(() -> CustomException.notFound("사용자를 찾을 수 없습니다."));

@github-actions

Copy link
Copy Markdown

PR Code Suggestions ✨

Explore these optional code suggestions:

CategorySuggestion                                                                                                                                    Impact
General
CustomException 팩토리 메서드 사용 일관성 유지

CustomException 클래스에 정의된 정적 팩토리 메서드 of()를 사용하여 예외를 생성하는 것이 좋습니다. 이는 코드의 일관성을 높이고, 예외
생성 로직을 중앙 집중화하여 유지보수를 용이하게 합니다.

src/main/java/com/Rootin/domain/garden/service/GardenService.java [205]

-throw new CustomException(ErrorCode.POT_NOT_FOUND);
+throw CustomException.of(ErrorCode.POT_NOT_FOUND);
Suggestion importance[1-10]: 6

__

Why: The suggestion correctly identifies an instance where the CustomException.of() static factory method, introduced in the PR, could be used for consistency. This improves code readability and adherence to the new error handling pattern.

Low

noeyoseel and others added 2 commits June 23, 2026 11:28
ALREADY_WATERED_TODAY ErrorCode의 HTTP 상태가 BAD_REQUEST에서 CONFLICT로 변경됨에 따라
테스트의 기대 상태 코드를 일치하도록 수정합니다.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@noeyoseel noeyoseel force-pushed the feat/185-error-code-domain branch from 8d37671 to 14c1b06 Compare June 23, 2026 02:29
@gyu98-mun

Copy link
Copy Markdown
Collaborator

코드 리뷰

전체 방향은 좋습니다. 다만 머지 전 확인이 필요한 포인트 몇 가지 남깁니다.


🔴 문제 1 — DUPLICATE_EMAIL 의미 손실 (사용자 노출 버그)

AuthService.googleLogin()에서 기존 메시지는 "이미 다른 방식으로 가입된 이메일입니다." 였는데, ErrorCode.DUPLICATE_EMAIL의 메시지는 "이미 사용 중인 이메일입니다."로 다릅니다.

두 케이스는 의미가 다릅니다.

  • 일반 회원가입 중복 → DUPLICATE_EMAIL
  • Google 로그인인데 일반 이메일로 이미 가입된 경우 → EMAIL_PROVIDER_MISMATCH 같은 별도 코드 필요

지금은 Google로 로그인 시도 시 "이미 사용 중인 이메일입니다." 로 표시되어, 사용자가 원인을 파악하기 어렵습니다.


🟡 문제 2 — 리팩토링 누락 2곳

AiResultService.delete()forbidden 호출이 변경되지 않음:

// 아직 변경 안 됨
throw CustomException.forbidden("본인의 AI 결과만 삭제할 수 있습니다.");

AI_RESULT_FORBIDDEN 에러코드가 없어 못 바꾼 것으로 보임. 이 PR에서 추가하거나 후속 PR로 처리 부탁드립니다.

TilService.saveDraft()USER_NOT_FOUND 누락:

// 아직 변경 안 됨
.orElseThrow(() -> CustomException.notFound("사용자를 찾을 수 없습니다."));

이미 ErrorCode.USER_NOT_FOUND가 존재하므로 통일 가능합니다.


🟢 문제 3 — 생성자 혼용 (minor)

GardenService만 팩토리 메서드 대신 생성자를 직접 사용합니다:

// GardenService (다른 곳과 다름)
throw new CustomException(ErrorCode.POT_NOT_FOUND);

// 나머지 전부
throw CustomException.of(ErrorCode.POT_NOT_FOUND);

통일하면 좋겠습니다.


1번은 사용자에게 노출되는 메시지가 달라지는 버그라 수정이 필요합니다. 2, 3번은 완성도 이슈입니다.

@gyu98-mun gyu98-mun left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

LGTM
고생하셨습니다 👍

@noeyoseel noeyoseel merged commit 3cb6a8a into main Jun 23, 2026
2 checks passed
@noeyoseel noeyoseel deleted the feat/185-error-code-domain branch June 23, 2026 05:01
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Feat] ErrorCode 도메인별 세분화

2 participants