4.2 DispatcherServlet과 요청 라이프사이클
스프링 MVC 아키텍처의 중심에는 프론트 컨트롤러(Front Controller) 패턴을 구현한 DispatcherServlet이 있습니다. 애플리케이션으로 들어오는 모든 HTTP 요청은 가장 먼저 DispatcherServlet을 거칩니다.
1. 프론트 컨트롤러 패턴 (Front Controller Pattern)
모든 클라이언트의 요청을 공통된 진입점(Servlet)에서 받아 공통적인 처리(라우팅, 파라미터 검증, 인코딩 통일 등)를 수행한 후, 알맞은 컨트롤러(Controller) 로직으로 분배하는 아키텍처 패턴입니다.
2. DispatcherServlet의 동작 과정
클라이언트가 URL을 호출하면 아래와 같은 순서로 요청이 처리됩니다.
- 클라이언트 요청 수신: 톰캣(Tomcat) 등의 서블릿 컨테이너가 HTTP 요청을 받아
DispatcherServlet으로 넘깁니다. - HandlerMapping 조회:
DispatcherServlet은 이 요청을 처리할 수 있는 컨트롤러(Handler)를 찾습니다. (주로@GetMapping이 붙은 메서드를 색인합니다). - HandlerAdapter 찾기: 해당 컨트롤러 메서드를 구동할 수 있는 실행 장치인
HandlerAdapter를 탐색합니다. - 핸들러 실행: 어댑터가 실제 컨트롤러의 비즈니스 코드를 실행합니다.
- ModelAndView 반환: 컨트롤러는 처리 결과를 뷰 모델인
ModelAndView에 담아 반환합니다. REST API의 경우 뷰를 렌더링하지 않고 HttpMessageConverter를 통해 JSON으로 직접 응답합니다. - ViewResolver 처리: 만약 일반 화면 SSR이라면 뷰 이름(예: "home")을 이용해
ViewResolver가 물리적 템플릿 경로를 찾아냅니다. - HTTP 응답: 렌더링된 결과를 브라우저에 최종 전송합니다.
// Spring 구동 시 등록되는 DispatcherServlet의 핵심 구조 의사 코드
protected void doDispatch(HttpServletRequest request, HttpServletResponse response) {
// 1. 핸들러(Controller) 찾기
HandlerExecutionChain mappedHandler = getHandler(request);
// 2. 어댑터 찾기
HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
// 3. 컨트롤러 실제 동작
ModelAndView mv = ha.handle(request, response, mappedHandler.getHandler());
// 4. 화면 렌더링
processDispatchResult(request, response, mappedHandler, mv, dispatchException);
}