이 문서를 통해 아래 질문들에 답할 수 있게 됩니다.

  • Spring MVC에서 HTTP 요청의 중앙 진입점은 왜 Controller가 아니라 DispatcherServlet인가?
  • Front Controller 패턴은 공통 웹 흐름을 어떻게 단순화하는가?
  • DispatcherServlet은 어떤 일을 직접 하고 어떤 일을 전략 객체에 위임하는가?

개요

Spring MVC 공식 문서는 DispatcherServlet을 Front Controller 패턴을 따르는 중심 Servlet으로 설명한다. DispatcherServlet은 요청 처리를 위한 공통 알고리즘을 제공하고, 실제 작업은 설정 가능한 delegate component에 위임한다.

기존 MVC 문서의 “모든 HTTP 요청의 중앙 수신 및 분산 처리” 내용은 이 공식 구조와 연결된다. 모든 요청이 중앙으로 들어오지만 중앙 객체가 모든 일을 직접 처리하지 않고 역할별 전략 객체에게 분산한다.

원리

요청 흐름은 단순화하면 다음과 같다.

Client
  -> Servlet Container
  -> Filter Chain
  -> DispatcherServlet
  -> HandlerMapping
  -> HandlerExecutionChain
  -> HandlerAdapter
  -> Controller
  -> Service
  -> ReturnValue 처리
  -> ViewResolver 또는 HttpMessageConverter
  -> Response

DispatcherServlet은 Servlet Container에 등록된 Servlet이다. 요청이 들어오면 Servlet Container와 Filter Chain을 거친 뒤 해당 요청이 DispatcherServlet으로 전달된다. DispatcherServlet은 요청을 처리할 HandlerExecutionChain을 찾고 실행하고 결과를 응답으로 바꾸는 전체 흐름을 조율한다.

Front Controller 패턴

Front Controller 패턴의 핵심은 웹 요청의 공통 진입점을 하나로 모으는 것이다. 인증, 로케일, multipart 처리, handler mapping, 예외 처리, view rendering 같은 공통 흐름을 요청마다 개별 컨트롤러에 흩뿌리지 않는다.

Spring MVC는 이 중앙화 덕분에 Controller를 단순한 handler method로 유지할 수 있다. Controller는 요청 데이터를 받고, Service를 호출하고, 응답 모델이나 body를 반환하는 데 집중한다.

DispatcherServlet의 위임 구조

DispatcherServlet은 다음 컴포넌트와 협력한다.

  • HandlerMapping: 요청에 맞는 Handler와 Interceptor가 포함된 실행 체인을 찾는다.
  • HandlerAdapter: Handler를 실행한다.
  • HandlerExceptionResolver: 예외를 처리 가능한 응답으로 바꾼다.
  • ViewResolver: view name을 View로 해석한다.
  • LocaleResolver, ThemeResolver, MultipartResolver: 부가 웹 기능을 처리한다.

이 구조는 Spring MVC가 확장 가능한 이유다. DispatcherServlet의 큰 흐름은 유지하면서 각 전략 컴포넌트를 교체하거나 추가할 수 있다.

실전 팁

  • Controller가 호출되지 않는 문제를 만나면 Controller 코드보다 먼저 Filter, DispatcherServlet mapping, HandlerMapping 조건, Interceptor preHandle 결과를 확인한다.
  • 404는 HandlerMapping이 못 찾은 문제일 수 있고, 405는 URL은 맞지만 HTTP method 조건이 맞지 않는 문제일 수 있다.
  • DispatcherServlet 안에서 발생한 예외는 HandlerExceptionResolver와 @ControllerAdvice 경로로 처리될 수 있지만, Filter Chain이나 Servlet Container 레벨에서 난 예외는 MVC 예외 처리 흐름을 타지 않을 수 있다.
  • REST API와 서버 렌더링 MVC는 같은 DispatcherServlet 위에서 반환값 처리 경로가 달라지는 것이다.
  • DispatcherServlet 로그를 켜면 mapping과 adapter 선택 흐름을 추적하는 데 도움이 된다.

위험 신호!

  • Controller가 요청의 최초 진입점이라고 설명한다.
  • Filter, Interceptor, Controller, AOP의 위치를 구분하지 못한다.
  • Controller에 인증, 인가, 요청 로깅, 비즈니스 로직이 모두 섞인다.
  • 404, 405, 415, 406을 모두 Controller 내부 문제로만 본다.
  • ViewResolver와 MessageConverter의 응답 경로를 혼동한다.

확인 질문

확인 질문

  • DispatcherServlet은 무엇인가?
    • Spring MVC의 Front Controller로서 요청 처리 흐름을 중앙에서 조율하는 Servlet이다.
  • DispatcherServlet은 Handler를 직접 실행하는가?
    • 직접 실행하지 않고 해당 Handler를 지원하는 HandlerAdapter에게 실행을 위임한다.
  • Controller가 호출되지 않을 때 먼저 볼 지점은 무엇인가?
    • Filter Chain, DispatcherServlet mapping, HandlerMapping 조건을 먼저 확인한다.

참고 문서