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"
}