Skip to content

4.4. Exception Handling

4.4.1. Global Exception Handling

Use @RestControllerAdvice to handle exceptions consistently across the entire application.

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. Error Code Definition

Error codes must be centrally managed as an Enum.

java
@Getter
@RequiredArgsConstructor
public enum ErrorCode {

  // Common
  INVALID_INPUT(HttpStatus.BAD_REQUEST, "C001", "Invalid input value."),
  INTERNAL_SERVER_ERROR(HttpStatus.INTERNAL_SERVER_ERROR, "C002", "An internal server error has occurred."),
  RESOURCE_NOT_FOUND(HttpStatus.NOT_FOUND, "C003", "The requested resource was not found."),

  // User
  USER_NOT_FOUND(HttpStatus.NOT_FOUND, "U001", "User not found."),
  DUPLICATE_EMAIL(HttpStatus.CONFLICT, "U002", "Email is already in use.");

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

4.4.3. Standard Error Response Format

json
{
  "code": "U001",
  "message": "User not found.",
  "timestamp": "2026-02-28T10:30:00"
}

TIENIPIA QUALIFIED STANDARD