Skip to content

4.4. 예외 처리

4.4.1. 글로벌 예외 처리

@RestControllerAdvice를 사용하여 애플리케이션 전체의 예외를 일관되게 처리합니다.

java
@RestControllerAdvice
public class GlobalExceptionHandler {

  @ExceptionHandler(BusinessException.class)
  public ResponseEntity<ErrorResponse> handleBusinessException(BusinessException e) {
    ErrorCode errorCode = e.getErrorCode();
    return ResponseEntity
        .status(errorCode.getHttpStatus())
        .body(ErrorResponse.of(errorCode));
  }

  @ExceptionHandler(MethodArgumentNotValidException.class)
  public ResponseEntity<ErrorResponse> handleValidationException(
      MethodArgumentNotValidException e) {
    return ResponseEntity
        .status(HttpStatus.BAD_REQUEST)
        .body(ErrorResponse.of(ErrorCode.INVALID_INPUT, e.getBindingResult()));
  }
}

4.4.2. 에러 코드 정의

에러 코드는 Enum으로 중앙 관리합니다.

java
@Getter
@RequiredArgsConstructor
public enum ErrorCode {

  // 공통
  INVALID_INPUT(HttpStatus.BAD_REQUEST, "C001", "잘못된 입력값입니다."),
  INTERNAL_SERVER_ERROR(HttpStatus.INTERNAL_SERVER_ERROR, "C002", "서버 내부 오류가 발생했습니다."),
  RESOURCE_NOT_FOUND(HttpStatus.NOT_FOUND, "C003", "요청한 리소스를 찾을 수 없습니다."),

  // 사용자
  USER_NOT_FOUND(HttpStatus.NOT_FOUND, "U001", "사용자를 찾을 수 없습니다."),
  DUPLICATE_EMAIL(HttpStatus.CONFLICT, "U002", "이미 사용 중인 이메일입니다.");

  private final HttpStatus httpStatus;
  private final String code;
  private final String message;
}

4.4.3. 표준 에러 응답 형식

json
{
  "code": "U001",
  "message": "사용자를 찾을 수 없습니다.",
  "timestamp": "2026-02-28T10:30:00"
}

TIENIPIA QUALIFIED STANDARD