[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 요청을 받은
DispatcherServlet
은HandlerMapping
에게 요청 정보(URI, HTTP 메서드 등)를 전달하면서 핸들러(컨트롤러의 메서드)를 찾아달라고 요청한다.
- 2. 핸들러 어댑터 조회
- 요청을 처리할 핸들러를 찾은 뒤,
DispatcherServlet
은 해당 핸들러를 실행할 수 있는HandlerAdapter
를 조회한다.
예를 들어,@RequestMapping
어노테이션으로 만든 핸들러는RequestMappingHandlerAdapter
가 처리한다.
- 3. 핸들러 어댑터 실행
DispatcherServlet
은 찾아낸HandlerAdapter
에게 핸들러의 실행을 위임한다.
- 4. 핸들러(컨트롤러) 실행
HandlerAdapter
는 실제 핸들러(컨트롤러)의 메서드를 실행하고, 이 과정에서 비즈니스 로직이 처리된다.
- 5. ModelAndView 반환
- 컨트롤러는 처리 결과 데이터(Model)와 보여줄 뷰(View)의 논리적인 이름을 담은
ModelAndView
객체를 생성하여DispatcherServlet
에 반환한다.
(RESTful :@RestController
의 경우 뷰 이름 없이 데이터만 반환되며, 다른 처리 과정을 거친다.)
- 6. 뷰 리졸버 호출
DispatcherServlet
은ModelAndView
로부터 뷰의 논리적인 이름을 얻어,ViewResolver
에게 전달하여 실제 뷰 객체를 찾아달라고 요청한다.
- 7. View 반환
ViewResolver
는 뷰의 논리적인 이름에 맞는View
객체를 찾아DispatcherServlet
에 반환한다.
- 8. 뷰 렌더링 및 응답
DispatcherServlet
은View
객체에 모델 데이터를 전달하여 렌더링(render)을 요청한다.
렌더링된 최종 결과물(HTML)이 클라이언트에게 HTTP 응답으로 전달된다.
This post is licensed under CC BY 4.0 by the author.