Deep Dive /Java Web /12-3

12-3. DispatcherServlet → ExceptionHandler: MethodArgumentNotValidException 처리

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


이번 단계의 역할 — 검증 실패를 표준 예외 처리 경로로 넘겨 일관된 오류 응답을 만든다

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


호출 흐름 요약 — processHandlerException()이 HandlerExceptionResolver 체인을 순회한다

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

호출 흐름 다이어그램 — ExceptionHandlerExceptionResolver가 @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

핵심 코드 — resolveException()이 처음 응답한 리졸버에서 루프가 멈춘다

// 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번 정상 경로에서 컨트롤러 메서드가 호출되는 과정으로 이어진다

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

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