프로젝트 내에서 예외처리를 일관성 있게 통합하기 전에, 스프링 부트에서 api 예외처리를 알아보려고 한다.
api 에러를 처리할 수 있는 방법
1. HandlerExceptionResolver를 직접 구현
HandlerExceptionResolver를 상속받은 구현체를 만들고, 이 클래스를 Exception resolver로 등록한다.
2. 스프링의 ExceptionResolver를 사용
기본적으로 ExceptionHandlerExceptionResolver, ResponseStatusExceptionResolver, DefaultHandlerExceptionResolver을 제공해준다.
⭐ 자세히 알아볼 내용은 ExceptionResolver 중 ExceptionHandlerExceptionResolver를 사용하는 방법이다.
1. @ExceptionHandler 어노테이션을 선언하고, 해당 컨트롤러에서 처리하고 싶은 예외를 지정
2. 해당 컨트롤러에서 예외가 발생하면 이 메서드 호출
3. 지정한 예외 또는 그 예외 자식 클래스를 모두 잡을 수 있다.
* @ExceptionHandler는 api 예외 처리 문제 해결을 편리하게 해주는, ExceptionHandlerExceptionResolver이다. -> 실무에서 api 예외처리는 이 기능을 사용!
전역으로 사용하기 위해서는 @RestControllerAdvice를 사용해야 한다.
* @RestControllerAdvice는 @ExceptionHandler를 전역적으로 사용할 수 있게 하주고, 에러 응답을 JSON으로 내려준다. 애노테이션을 적용해 전역적으로 에러를 핸들링하는 Class를 만들어 사용한다.
간단한 예제 코드이다.
1) ErrorCode (enum)
에러 별 상태 코드와 메시지를 정의하는 파일이다.
@Getter
@RequiredArgsConstructor
public enum ErrorCode {
DUPLICATED_EMAIL(HttpStatus.INTERNAL_SERVER_ERROR, "Duplicated email");
private final HttpStatus status;
private final String message;
}
2) ErrorResponse
클라이언트에게 전달할 에러의 응답 형태를 정의한다.
public class ErrorResponse {
String code;
String message;
public ErrorResponse(String code, String message) {
this.code = code;
this.message = message;
}
}
3) GlobalExceptionHandler
@RestControllerAdvice와 @ExceptionHandler를 사용해 전역 예외처리를 담당한다. 위 에러가 발생했을 때 이 메서드가 에러 처리를 위임한다.
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(RuntimeException.class)
public ResponseEntity<ErrorResponse> handleRuntimeExceptionHandler(RuntimeException e) {
//처리
}
}