DispatcherServlet 없이 순수 서블릿일 때의 실행 흐름을 간소화해보면

  1. web.xml 또는 @webServlet의 URL 패턴을 기준으로 HttpServlet 인스턴스를 선택
  2. 컨테이너가 선택된 서블릿의 service()를 호출하고, 내부 HTTP 메서드의 따라 분기(doGet, doPost...)
  3. JSON or getWrite(), getOutputStream() 그리고 JSP라면 그에 맞게 응답을 직접 작성
  4. 2번 전, 3번 후 필터 체인

으로 정리해 볼 수 있다

 

핵심은 모든 걸 직접 해야 한다는 것인데 단순한 기능이 늘수록 반복 코드가 증가하는 단점이 있는데 이를 보안해주는 기술이 DispatcherServlet이다.

 

DispatcherServlet의 동작 흐름


  1. 핸들러 선택
    • 핸들러 검색(HandlerMapping)
      • URL, HTTP 메서드 등 조건에 맞는 컨트롤러(핸들러)를 찾는다
      • 매칭된 핸들러에 연결된 인터셉터( preHandle() )가 호출된다
  2. 핸들러 실행(HandlerAdapter -> 인자 바인딩 -> 컨트롤러 메서드)
    • 핸들러 타입(@controller, 레거시 컨트롤러, @webServlet 등)에 맞는 핸들러 어댑터를 선택한다
    • @RequestParam, @PathVariable, @RequestHeader, @RequestBody, @ModelAttribute 등 파라미터가 각 애노테이션에 맞게 자동 주입
      • @RequestBody의 경우 HttpMessageConverter가 HTTP 바디(JSON/XML 등)를 객체로 역직렬화
    • 컨트롤러 메서드 실행
  3. 반환값 처리(body 직렬화, 뷰 렌더링)
    1. @ResponseBody, @RestController의 경우 HttpMessageConverter를 통해 객체를 바디에 직렬화
    2. @Controller의 경우 문자열/ ModelAndView/ 모델 객체를 반환하면 논리 뷰 이름을 만들고 ModelAndView 객체를 반환
      • 문자열의 경우 ViewResolver가 미리 정해 둔 prefix / suffix를 붙여 물리 뷰로 바꿔 준다
        • ex) jsp의 경우 prefix = "WEB-INF/views/"
          suffix = ".jsp"

    3. produces, Accept 헤더 조건을 고려해 적절한 메세지 컨버터(JSON, XML 등)를 고른다
    4. 뷰 렌더링(ViewResolver) ModelAndView가 있다면 DispatcherServlet이 ViewResolver 체인으로 논리뷰 이름으로 실제 뷰를 찾아 렌더링한다(Thymeleaf/ JSP 등)

 

'CS > Spring' 카테고리의 다른 글

JPA  (1) 2025.08.27
Servlet? ServletContainer?  (5) 2025.08.18
AOP 정리  (5) 2025.08.13

+ Recent posts