Skip to content

[REFACTOR] 도메인별 ErrorCode enum 분리 #154

@ryuwldnjs

Description

@ryuwldnjs

현재 상황

CustomResponseStatus 하나의 enum에 모든 도메인의 에러 코드가 집중되어 있음 (90줄+)

현재 구조

common/
  enums/
    CustomResponseStatus.java    # 모든 도메인의 에러 코드가 여기에 집중 (90줄+)
  exception/
    CustomException.java         # CustomResponseStatus를 감싸는 단일 예외
    GlobalExceptionHandler.java
  dto/
    ApiResponse.java

현재 코드

// 하나의 enum에 모든 도메인 에러가 혼재
public enum CustomResponseStatus {
    // Auth
    EXPIRED_JWT(...),
    BAD_JWT(...),
    // Member
    MEMBER_NOT_FOUND(...),
    HANDLE_ALREADY_EXISTS(...),
    // Team
    TEAM_NOT_FOUND(...),
    TEAM_ACCESS_DENIED(...),
    // Recommendation
    RECOMMENDATION_NOT_FOUND(...),
    // ... 40개 이상의 상수
}

문제점:

  • team/ 코드 수정 시에도 common/을 건드려야 함 → 도메인 간 불필요한 결합
  • enum이 비대해지며 관리가 어려워짐
  • 코드 번호 충돌 관리가 어려움

개선 방안

도메인별 ErrorCode enum을 분리하고, 공통 인터페이스로 통합

변경 후 구조

common/
  exception/
    ErrorCode.java               # 인터페이스
    BusinessException.java       # ErrorCode를 받는 공통 예외
    GlobalExceptionHandler.java  # 기존 유지

member/exception/
    MemberErrorCode.java         # implements ErrorCode

team/exception/
    TeamErrorCode.java

recommendation/exception/
    RecommendationErrorCode.java

auth/exception/
    AuthErrorCode.java

ErrorCode 인터페이스

public interface ErrorCode {
    HttpStatus getHttpStatus();
    String getCode();
    String getMessage();
}

도메인별 enum 예시

public enum MemberErrorCode implements ErrorCode {
    NOT_FOUND(HttpStatus.NOT_FOUND, "M001", "해당 유저를 찾을 수 없습니다."),
    HANDLE_ALREADY_EXISTS(HttpStatus.CONFLICT, "M002", "이미 사용 중인 핸들입니다.");
    // ...
}

코드 번호 체계

prefix 도메인
C Common (서버 에러, 공통)
A Auth
M Member
T Team
R Recommendation
S SolvedAc

작업 범위

  • ErrorCode 인터페이스 생성
  • BusinessException 생성 (기존 CustomException 대체)
  • 도메인별 ErrorCode enum 분리
  • GlobalExceptionHandler에서 BusinessException 처리
  • 각 도메인 서비스에서 새 ErrorCode 사용하도록 변경
  • 기존 CustomResponseStatus, CustomException 제거
  • 테스트 수정

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions