본문 바로가기

백엔드 스터디

디스패처 서블릿이란?

1. 디스패처 서블릿( DispatcherServlet )이란?

Spring MVC에서 DispatcherServlet은 클라이언트의 요청을 받아 적절한 컨트롤러로 전달하는 역할을 합니다.

Spring MVC에서 가장 중요한 서블릿 중 하나인 DispatcherServlet은 클라이언트 요청을 받아 컨트롤러로 전달하고, 응답을 생성하여 반환하는 역할을 수행합니다.


2. DispatcherServlet 서블릿 등록

DispatcherServlet → FrameworkServlet → HttpServletBean → HttpServlet

 스프링 부트에서의 서블릿 등록

  • 스프링 부트는 DispatcherServlet을 서블릿으로 자동 등록하며, 모든 경로(/ URL 패턴)에 대해 매핑합니다.
  • 더 자세한 경로가 우선순위가 높기 때문에 기존에 등록된 서블릿도 함께 동작할 수 있습니다.

 3. 요청 흐름

  1. 서블릿이 호출되면 HttpServlet이 제공하는 service() 메서드가 실행됩니다.
  2. Spring MVC에서는 DispatcherServlet의 부모 클래스인 FrameworkServlet에서 service() 메서드를 오버라이드하여 동작합니다.
  3. 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);
}
  1. 핸들러 조회
    • getHandler(request)를 호출하여 요청 URL에 매핑된 핸들러(컨트롤러)를 조회합니다.
    • 해당 요청을 처리할 핸들러가 없다면 noHandlerFound(request, response)를 호출하여 404 응답을 반환합니다.
  2. 핸들러 어댑터 조회
    • getHandlerAdapter(handler)를 호출하여 해당 핸들러를 실행할 수 있는 HandlerAdapter를 찾습니다.
  3. 핸들러 어댑터 실행
    • 조회된 핸들러 어댑터를 실행합니다.
  4. 핸들러 실행
    • 핸들러 어댑터가 실제 핸들러(컨트롤러)를 실행합니다.
  5. ModelAndView 반환
    • 핸들러 어댑터는 핸들러가 반환하는 정보를 ModelAndView로 변환하여 반환합니다.
  6. 뷰 리졸버 호출
    • ViewResolver를 찾아 실행합니다.
    • JSP의 경우 InternalResourceViewResolver가 자동 등록되어 사용됩니다.
  7. View 반환
    • 뷰 리졸버는 논리적인 뷰 이름을 물리적인 뷰 이름으로 변환하고, 렌더링을 담당하는 뷰 객체를 반환합니다.
    • JSP의 경우 InternalResourceView(JstlView)가 반환되며, 내부적으로 forward() 로직을 수행합니다.
  8. 뷰 렌더링
    • 뷰를 통해 최종적으로 화면을 렌더링합니다.

전체적인 Spring MVC 구조

 

 

다음에는 핸들러 매핑, 핸들러 어댑터, 뷰리졸버에 대해 정리해보도록 하겠습니다.

'백엔드 스터디' 카테고리의 다른 글

스프링 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