minOS

API 예외 처리 - DefaultHandlerExceptionResolver 본문

TIL/김영한의 스프링 MVC 2편 - 백엔드 웹 개발 핵심 기술

API 예외 처리 - DefaultHandlerExceptionResolver

minOE 2024. 10. 9. 17:03
728x90

API 예외 처리 - DefaultHandlerExceptionResolver

DefaultHandlerExceptionResolver` 는 스프링 내부에서 발생하는 스프링 예외를 해결한다. 대표적으로 파라미터 바인딩 시점에 타입이 맞지 않으면 내부에서 `TypeMismatchException` 이 발생하는데, 이 경우 예외가 발생했기 때문에 그냥 두면 서블릿 컨테이너까지 오류가 올라가고, 결과적으로 500 오류가 발생한다. 그런데 파라미터 바인딩은 대부분 클라이언트가 HTTP 요청 정보를 잘못 호출해서 발생하는 문제이다. HTTP 에서는이런 경우 HTTP 상태 코드 400을 사용하도록 되어 있다.
`DefaultHandlerExceptionResolver` 는 이것을 500 오류가 아니라 HTTP 상태 코드 400 오류로 변경한다.

public class DefaultHandlerExceptionResolver extends AbstractHandlerExceptionResolver {

    @Override
    protected ModelAndView doResolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
        try {
            if (ex instanceof TypeMismatchException) {
                return handleTypeMismatch((TypeMismatchException) ex, request, response, handler);
            }
            // 다른 예외 처리
        } catch (Exception handlerException) {
            logger.warn("Handling of [" + ex.getClass().getName() + "] resulted in Exception", handlerException);
        }
        return null;
    }

    protected ModelAndView handleTypeMismatch(TypeMismatchException ex, HttpServletRequest request, HttpServletResponse response, Object handler) throws IOException {
        response.sendError(HttpServletResponse.SC_BAD_REQUEST);
        return new ModelAndView();
    }
}​


DefaultHandlerExceptionResolver.handleTypeMismatch` 를 보면 다음과 같은 코드를 확인할 수 있다.response.sendError(HttpServletResponse.SC_BAD_REQUEST)` (400)결국 `response.sendError()` 를 통해서 문제를 해결한다.
sendError(400) 를 호출했기 때문에 WAS에서 다시 오류 페이지(`/error` )를 내부 요청한다.


ApiExceptionController - 추가
  @GetMapping("/api/default-handler-ex")
    public String defaultException(@RequestParam Integer data){
        return "ok";
    }

 

`Integer data` 문자를 입력하면 내부에서 `TypeMismatchException` 발생한다.


- 정상요청 


Integer data에 문자를 입력하면 내부에서 TypeMismatchException이 발생
.
실행 결과를 보면 HTTP 상태 코드가 400인 것을 확인할 수 있다.

728x90