스프링 부트가 기본으로 제공하는 ExceptionResolver
- HandlerExceptionResolverComposite에 다음 순서로 등록
- ExceptionHandlerExceptionResolver
- ResponseStatusExceptionResolver
- DefaultHandlerExceptionResolver
ResponseStatusExceptionResolver
- 예외에 따라서 HTTP 상태 코드를 지정해주는 역할
- @ResponseStatus가 달려있는 예외를 처리
- ResponseStatusException 예외를 처리
1. @ResponseStauts
- Excepiton 정의
@ResponseStatus(code = HttpStatus.BAD_REQUEST, reason = "잘못된 요청 오류")
public class BadRequestException extends RuntimeException{
}
- 컨트롤러
@Slf4j
@RestController
public class ApiExceptionController {
@GetMapping("/api/response-status-ex1")
public String responseStatusEx1(){
throw new BadRequestException();
}
}
- 결과
2. ResponseStatusException
- @ResponseStatus는 개발자가 직접 변경할 수 없는 예외(라이브러리 예외 등)에는 적용 불가
- 또한 조건에 따라 동적으로 변경하는 것이 어려움
- 이때 사용하는 것이 ResponseStatusException
- 컨트롤러
@Slf4j
@RestController
public class ApiExceptionController {
@GetMapping("/api/response-status-ex2")
public String responseStatusEx2(){
throw new ResponseStatusException(HttpStatus.NOT_FOUND, "잘못된 요청 오류", new IllegalArgumentException());
}
}
- 결과
DefaultHandlerExceptionResolver
- 스프링 내부에서 발생하는 스프링 예외를 해결
- 예를들어 클라이언트의 잘못된 HTTP 요청으로 TypeMismatchException이 발생하는 경우 결과적으로 500 error가 발생
- 하지만 실질적인 오류는 클라이언트의 잘못된 HTTP 요청으로 인한 400 error
- 이런 경우 500 error가 아닌 400 error로 변경할 때 사용
- 컨트롤러
@Slf4j
@RestController
public class ApiExceptionController {
@GetMapping("/api/default-handler-ex")
public String defaultException(@RequestParam Integer data){
return "ok";
}
}
- 결과