Post

[Spring] 6. Dispatcher Servlet

사용자가 브라우저 주소창에 https://.../users/1을 입력하는 순간, 그 요청은 과연 어떤 과정을 거쳐 수많은 컨트롤러 중에서 정확한 메서드를 찾아가는 걸까?
스프링 MVC는 이 복잡한 과정을 관리하기 위해 모든 요청을 단 하나의 관문인 디스패처 서블릿(Dispatcher Servlet)에서 처리한다.


디스패처 서블릿이란?


  • 모든 HTTP 요청을 가장 먼저 받아 적절한 컨트롤러에 위임해주는 ‘프론트 컨트롤러(Front Controller)’
  • ‘프론트 컨트롤러 패턴’은 모든 클라이언트의 요청을 단일 진입점(서블릿)에서 처리하는 디자인 패턴이다.
  • 만약 이 패턴이 없다면, /users, /products 등 각각의 URL마다 별도의 서블릿을 만들어야 하는 비효율적인 상황이 발생한다.


디스패처 서블릿은 애플리케이션의 ‘중앙 관제 센터’ 또는 ‘총괄 매니저’ 역할인 셈이다.
들어온 요청을 분석하여 가장 적절한 담당자(핸들러)에게 작업을 분배한다.
이 덕분에 개발자는 일관된 방식으로 웹 요청을 처리하고, 공통 기능을 쉽게 적용할 수 있다.


서블릿이란?
서버(Server)에서 실행되는 작은 프로그램(Applet)이라는 의미의 합성어
클라이언트의 요청을 받아 동적인 웹 페이지를 생성하고 응답을 보내주는 역할을 하는 자바(Java) 기술



웹 요청의 처리 과정


디스패처 서블릿은 요청을 직접 처리하지 않는다. 대신 여러 전문 컴포넌트들에게 작업을 위임하며 전체 흐름을 조율한다.


웹 요청 처리 과정


이 예시는 RESTful API가 아닌, 완성된 HTML 페이지를 응답하는 전통적인 MVC 방식이다.


0. 요청 접수
클라이언트가 요청을 보내면, 내장 웹 서버(Tomcat)를 거쳐 디스패처 서블릿이 가장 먼저 요청을 받는다.


1. 핸들러 조회
클라이언트의 HTTP 요청을 받은 DispatcherServletHandlerMapping에게 요청 정보(URI, HTTP 메서드 등)를 전달하면서 핸들러(컨트롤러의 메서드)를 찾아달라고 요청한다.


2. 핸들러 어댑터 조회
요청을 처리할 핸들러를 찾은 뒤, DispatcherServlet은 해당 핸들러를 실행할 수 있는 HandlerAdapter를 조회한다.
예를 들어, @RequestMapping 어노테이션으로 만든 핸들러는 RequestMappingHandlerAdapter가 처리한다.


3. 핸들러 어댑터 실행
DispatcherServlet은 찾아낸 HandlerAdapter에게 핸들러의 실행을 위임한다.


4. 핸들러(컨트롤러) 실행
HandlerAdapter는 실제 핸들러(컨트롤러)의 메서드를 실행하고, 이 과정에서 비즈니스 로직이 처리된다.


5. ModelAndView 반환
컨트롤러는 처리 결과 데이터(Model)와 보여줄 뷰(View)의 논리적인 이름을 담은 ModelAndView 객체를 생성하여 DispatcherServlet에 반환한다.
(RESTful : @RestController의 경우 뷰 이름 없이 데이터만 반환되며, 다른 처리 과정을 거친다.)


6. 뷰 리졸버 호출
DispatcherServletModelAndView로부터 뷰의 논리적인 이름을 얻어, ViewResolver에게 전달하여 실제 뷰 객체를 찾아달라고 요청한다.


7. View 반환
ViewResolver는 뷰의 논리적인 이름에 맞는 View 객체를 찾아 DispatcherServlet에 반환한다.


8. 뷰 렌더링 및 응답
DispatcherServletView 객체에 모델 데이터를 전달하여 렌더링(render)을 요청한다.
렌더링된 최종 결과물(HTML)이 클라이언트에게 HTTP 응답으로 전달된다.
This post is licensed under CC BY 4.0 by the author.