12-3. DispatcherServlet → ExceptionHandler: MethodArgumentNotValidException 처리
검증 오류가 발생하면, DispatcherServlet은 정상 컨트롤러 흐름 대신 예외 처리 체인으로 분기합니다.
이번 단계의 역할 — 검증 실패를 표준 예외 처리 경로로 넘겨 일관된 오류 응답을 만든다
검증 실패를 표준 예외 처리 경로로 넘겨, 일관된 400 응답 또는 오류 응답을 만들게 하는 단계입니다.
호출 흐름 요약 — processHandlerException()이 HandlerExceptionResolver 체인을 순회한다
MethodArgumentNotValidException이 발생합니다.- DispatcherServlet이
processHandlerException(...)를 호출합니다. HandlerExceptionResolver체인이 순차적으로 예외를 처리합니다.@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