콘텐츠로 이동

예외 처리 시스템

단일 BusinessException + 도메인별 ErrorCode ENUM만으로 모든 비즈니스 예외를 관리. 새 예외 클래스를 만들지 않는다.

1. 구성

  • BusinessException — 모든 비즈니스 예외가 사용하는 단일 클래스
  • ErrorCode (interface) — status(HTTP) + message 제공
  • 도메인별 ErrorCode ENUMCommonErrorCode, AuthErrorCode, MemberErrorCode, StudyRoomErrorCode
  • ErrorAdvice (@ControllerAdvice) — 예외를 일관된 JSON으로 변환

2. 에러 코드 추가

ENUM에 한 줄 추가:

public enum AuthErrorCode implements ErrorCode {
    INVALID_CREDENTIALS(401, "아이디 또는 비밀번호가 올바르지 않습니다."),
    MEMBER_ALREADY_EXISTS(409, "이미 존재하는 회원입니다.");
}

3. 예외 발생

throw new BusinessException(AuthErrorCode.INVALID_CREDENTIALS);
throw new BusinessException(AuthErrorCode.LOGIN_ERROR, causeException); // 원인 포함

4. 응답 포맷 (항상 동일)

{ "status": 401, "message": "아이디 또는 비밀번호가 올바르지 않습니다." }

ErrorAdvice가 일관 가공하므로 호출부는 신경 쓸 필요 없음.

5. Swagger 에러 명세 자동화

common/swagger/의 메타 어노테이션으로 컨트롤러별 에러 응답을 Swagger에 자동 노출.

@ApiMemberErrorResponses({ MemberErrorCode.MEMBER_NOT_EXIST,
                           MemberErrorCode.INCORRECT_CURRENT_PASSWORD })
@PutMapping("/api/members/password")
public SuccessResponse<Void> changePassword(...) { }
  • @ErrorResponseAnnotation이 붙은 어노테이션을 자동 탐지 → 리플렉션으로 ErrorCode[] 추출 → HTTP 상태별 그룹화 → Swagger ApiResponse + Example 생성
  • 새 도메인은 Api{Domain}ErrorResponses.java 한 개만 만들면 됨

6. 유의

  • 반드시 도메인별로 ENUM 분리
  • message/status는 사용자가 이해 가능하게

7. 관련