1. ExceptionHandlerExceptionResolver
예외가 나면 자동으로 호출되어 예외를 처리할 수 있다.
// 유효성 검사하다가 에러가 터지면 호출되는 예외 처리 메서드
@ExceptionHandler//(MethodArgumentNotValidException.class)
public ApiUtils.ApiResult<Map<String, String>> handleValidationExceptions(MethodArgumentNotValidException errors) {
Map<String, String> errorMessages = new HashMap<>();
for (FieldError error : errors.getFieldErrors()) {
String errorField = error.getField();
String errorMessage = error.getDefaultMessage();
errorMessages.put(errorField, errorMessage);
}
return error(errorMessages, HttpStatus.BAD_REQUEST);
}
전역 예외 처리
@RestControllerAdvice(혹은 @ControllerAdvice)와 함께 사용하여
모든 컨트롤러에서 전역으로 예외를 처리할 수 있는 클래스를 만들 수 있다.
@RestControllerAdvice
public class GlobalExceptionHandler {
// 유효성 검사하다가 에러가 터지면 호출되는 예외 처리 메서드
@ExceptionHandler//(MethodArgumentNotValidException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
public ApiUtils.ApiResult<Map<String, String>> handleValidationExceptions(MethodArgumentNotValidException errors) {
...
}
}
2. ResponseStatusExceptionResolver
상태 코드를 적용하여 예외를 처리할 수 있다.
@ResponseStatus(HttpStatus.BAD_REQUEST)
3. DefaultHandlerExceptionResolver
스프링 내부적으로 기본 예외 처리
ex. JSON → DTO 타입이 안맞아서 TypeMismatchException 가 발생하는 경우
해당 예외가 서블릿 컨테이너까지 예외가 올라가고, 결과적으로 500 오류가 발생한다.
그런데 파라미터 바인딩은 대부분 클라이언트가 HTTP 요청 정보를 잘못 호출해서 발생하는 문제라 HTTP 상태 코드를 400으로 변경해야 하한다.
이 때 DefaultHandlerExceptionResolver가 500 오류가 아닌 HTTP 상태 코드 400 오류로 변경해준다
참고
String MVC - API 예외처리(ExceptionHandlerExceptionResolver, ResponseStatusExceptionResolver, DeFaultHandlerExceptionResolve
ResponseStatusExceptionResolver DefaultHandlerExceptionResolver ExceptionHandlerExceptionResolver @ControllerAdvice, @RestControllerAdvice API 예외처리 스프링 부트가 기본으로 제공하는 ExceptionResolver는 다음과 같다. ExceptionResolv
jddng.tistory.com
RestControllerAdvice, ExceptionHandler를 이용한 전역 예외 처리
이전 포스팅에서 프로젝트 애플리케이션이 동작 시 발생하는 다양한 상황에 대해서 메세지를 클라이언트로 전달해주기 위해 Custom Exception을 이용한 사용자 예외 처리를 다뤘다. 이렇게 Custom Exce
zayson.tistory.com
'프레임워크 > Spring Boot' 카테고리의 다른 글
[Spring Boot] 프로젝트 초기 설정하기 (Spring Boot, DB, Git) (0) | 2024.07.25 |
---|---|
[Spring Boot] 멀티 모듈 프로젝트에 BeanDefinitionOverrideException 에러 해결 (0) | 2024.06.19 |
[Spring Boot] 유효성 검사 with @Valid, @Validated (0) | 2024.05.17 |
[Spring] DO(Entity), DTO (0) | 2024.05.16 |
[Spring Boot] HttpMediaTypeNotAcceptableException 에러 해결 (0) | 2024.05.14 |