1. 디스패처 서블릿( DispatcherServlet )이란?
Spring MVC에서 DispatcherServlet은 클라이언트의 요청을 받아 적절한 컨트롤러로 전달하는 역할을 합니다.
Spring MVC에서 가장 중요한 서블릿 중 하나인 DispatcherServlet은 클라이언트 요청을 받아 컨트롤러로 전달하고, 응답을 생성하여 반환하는 역할을 수행합니다.
2. DispatcherServlet 서블릿 등록
DispatcherServlet → FrameworkServlet → HttpServletBean → HttpServlet
스프링 부트에서의 서블릿 등록
- 스프링 부트는 DispatcherServlet을 서블릿으로 자동 등록하며, 모든 경로(/ URL 패턴)에 대해 매핑합니다.
- 더 자세한 경로가 우선순위가 높기 때문에 기존에 등록된 서블릿도 함께 동작할 수 있습니다.
3. 요청 흐름
- 서블릿이 호출되면 HttpServlet이 제공하는 service() 메서드가 실행됩니다.
- Spring MVC에서는 DispatcherServlet의 부모 클래스인 FrameworkServlet에서 service() 메서드를 오버라이드하여 동작합니다.
- FrameworkServlet.service()를 시작으로 여러 메서드가 호출되면서 최종적으로 DispatcherServlet의 핵심인DispatcherServlet.doDispatch()가 실행됩니다.
DispatcherServlet은 FrameworkServlet을 상속받아 서블릿으로 동작하며, 최상위 부모 클래스는 HttpServlet입니다.
4. DispatcherServlet 동작 순서
DispatcherServlet.doDispatch()
protected void doDispatch(HttpServletRequest request, HttpServletResponse
response) throws Exception {
HttpServletRequest processedRequest = request;
HandlerExecutionChain mappedHandler = null;
ModelAndView mv = null;
// 1. 핸들러 조회
mappedHandler = getHandler(processedRequest);
if (mappedHandler == null) {
noHandlerFound(processedRequest, response);
return;
}
// 2. 핸들러 어댑터 조회 - 핸들러를 처리할 수 있는 어댑터
HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
// 3. 핸들러 어댑터 실행 -> 4. 핸들러 어댑터를 통해 핸들러 실행 -> 5. ModelAndView 반환
mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
processDispatchResult(processedRequest, response, mappedHandler, mv,
dispatchException);
}
private void processDispatchResult(HttpServletRequest request,
HttpServletResponse response, HandlerExecutionChain mappedHandler, ModelAndView
mv, Exception exception) throws Exception {// 뷰 렌더링 호출
render(mv, request, response);
}
protected void render(ModelAndView mv, HttpServletRequest request,
HttpServletResponse response) throws Exception {
View view;
String viewName = mv.getViewName();
// 6. 뷰 리졸버를 통해서 뷰 찾기, 7. View 반환
view = resolveViewName(viewName, mv.getModelInternal(), locale, request);
// 8. 뷰 렌더링
view.render(mv.getModelInternal(), request, response);
}
- 핸들러 조회
- getHandler(request)를 호출하여 요청 URL에 매핑된 핸들러(컨트롤러)를 조회합니다.
- 해당 요청을 처리할 핸들러가 없다면 noHandlerFound(request, response)를 호출하여 404 응답을 반환합니다.
- 핸들러 어댑터 조회
- getHandlerAdapter(handler)를 호출하여 해당 핸들러를 실행할 수 있는 HandlerAdapter를 찾습니다.
- 핸들러 어댑터 실행
- 조회된 핸들러 어댑터를 실행합니다.
- 핸들러 실행
- 핸들러 어댑터가 실제 핸들러(컨트롤러)를 실행합니다.
- ModelAndView 반환
- 핸들러 어댑터는 핸들러가 반환하는 정보를 ModelAndView로 변환하여 반환합니다.
- 뷰 리졸버 호출
- ViewResolver를 찾아 실행합니다.
- JSP의 경우 InternalResourceViewResolver가 자동 등록되어 사용됩니다.
- View 반환
- 뷰 리졸버는 논리적인 뷰 이름을 물리적인 뷰 이름으로 변환하고, 렌더링을 담당하는 뷰 객체를 반환합니다.
- JSP의 경우 InternalResourceView(JstlView)가 반환되며, 내부적으로 forward() 로직을 수행합니다.
- 뷰 렌더링
- 뷰를 통해 최종적으로 화면을 렌더링합니다.

다음에는 핸들러 매핑, 핸들러 어댑터, 뷰리졸버에 대해 정리해보도록 하겠습니다.
'백엔드 스터디' 카테고리의 다른 글
| 스프링 OAuth2 로그인 구현하기 2 (4) | 2025.08.09 |
|---|---|
| 스프링 OAuth2 로그인 구현하기 1 (2) | 2025.08.04 |
| 서블릿이란? (0) | 2025.04.01 |
| 엔티티(Entity) 개념과 설계, 연관관계 (0) | 2025.03.26 |
| RESTful API 란 (0) | 2025.03.25 |