Deep Dive /Java Web /12-3

12-3. DispatcherServlet → ExceptionHandler: MethodArgumentNotValidException 처리

검증 오류가 발생하면, DispatcherServlet은 정상 컨트롤러 흐름 대신 예외 처리 체인으로 분기합니다.


이번 단계의 역할

검증 실패를 표준 예외 처리 경로로 넘겨, 일관된 400 응답 또는 오류 응답을 만들게 하는 단계입니다.


호출 흐름 요약

  1. MethodArgumentNotValidException이 발생합니다.
  2. DispatcherServlet이 processHandlerException(...)를 호출합니다.
  3. HandlerExceptionResolver 체인이 순차적으로 예외를 처리합니다.
  4. @ExceptionHandler 또는 @ControllerAdvice가 매칭되면 응답이 만들어집니다.

호출 흐름 다이어그램

sequenceDiagram participant DS as DispatcherServlet participant ResolverChain as HandlerExceptionResolver[] participant EHER as ExceptionHandlerExceptionResolver participant EH as @ExceptionHandler / @ControllerAdvice DS->>ResolverChain: processHandlerException(...) ResolverChain->>EHER: resolveException(...) EHER->>EH: invokeAndHandle(...) EH-->>DS: error response

핵심 코드

// DispatcherServlet.java
for (HandlerExceptionResolver resolver : this.handlerExceptionResolvers) {
    exMv = resolver.resolveException(request, response, handler, ex);
    if (exMv != null) {
        break;
    }
}
// ExceptionHandlerExceptionResolver.java
ServletInvocableHandlerMethod exceptionHandlerMethod =
        getExceptionHandlerMethod(handlerMethod, exception, webRequest);
exceptionHandlerMethod.invokeAndHandle(webRequest, mavContainer, arguments);

코드 해설

예외 처리도 핸들러 매핑처럼 “리졸버 체인” 구조를 갖습니다. 즉 첫 번째로 처리 가능한 리졸버가 예외를 가져가고, 그 결과가 최종 응답이 됩니다.


설계 의도

예외 처리 전략을 체인 구조로 만들어, 전역 처리기와 컨트롤러별 처리기를 유연하게 조합하기 위한 구조입니다.


다음 단계 연결

다음 문서 13번에서는 정상 경로에서 실제 컨트롤러 메서드가 호출되는 과정을 봅니다.

← 이전: 12-2. WebDataBinder → SmartValidator | 다음: 13. DispatcherServlet → Controller