Dispatcher Servlet

배고픈귤·2025년 9월 22일

Backend

목록 보기
9/11

전체 흐름

  1. 클라이언트로부터 Http 요청이 들어오고 스프링 부트에서 실행되는 내장 서버(톰캣)가 요청을 받고 적절한 서블릿으로 전달한다.
  2. Dispatcher Servlet(Front Controller)에서 모든 요청을 받아서 각 요청에 맞는 컨트롤러로 요청들을 분담한다.
  3. 요청들을 분담할 때는 HandlerMapping을 통해 각 url, Http 메서드를 활용하여 매핑될 컨트롤러를 찾는다.
  4. HandlerAdapter에 의해 매핑된 컨트롤러를 실행하고 메서드 파라미터 바인딩이 일어난다.
  5. 컨트롤러가 반환한 결과값을 적절한 응답의 형태로 변환한다.
    뷰-ViewResolver, 객체/데이터-HttpMessageConverter
  6. Dispather Servlet이 응답을 HttpServletResponse에 작성하면 웹 서버(톰캣)가 이를 클라이언트로 전달한다.

이처럼 Dispatcher Servlet(Front Controller)은 들어오는 요청들을 받아서 적절한 컨트롤러에 뿌려주고 컨트롤러의 결과값을 적절한 응답으로 변환하여 웹서버에 전달해준다.

Dispatcher Servlet의 장점

  1. 모든 요청이 Dispatcher Servlet으로 들어오기 때문에 공통적인 작업(로깅, 인증, 인코딩)들을 한번에 처리할 수 있다. 공통적인 작업은 Dispatcher Servlet 전후에 있는 필터/인터셉터 구조를 통해 처리한다.
  2. HandlerMapping, HandlerAdapter, ViewResolver 등등의 객체에게 업무를 분담하면서 유연한 확장이 가능하다.
  3. 과거에는 web.xml에 URL별 서블릿 매핑을 전부 등록해야 했지만, 이제는 DispatcherServlet 하나만 등록하면 되고,
    나머지 매핑은 애노테이션(@Controller, @RequestMapping) 기반으로 처리된다.

WAS의 정적 자원 처리

일반적인 상황에서 정적 자원의 경우 웹 서버(Nginx, Apache)가 담당하고 WAS(톰캣, 제티)가 동적 요청들을 담당한다. Dispatcher Servlet은 WAS안에 있는 서블릿으로 동적 요청 처리를 담당한다. 하지만Spring Boot를 단독으로 실행 시 정적/동적 요청 모두 WAS(톰캣)로 들어오게 된다. 이때 DispatcherServlet은 정적 요청에 대해 매핑된 컨트롤러가 없을 경우,
ResourceHttpRequestHandler에게 처리를 위임한다.ResourceHttpRequestHandler는 이후에 정적 파일을 경로에서 찾아서 응답을 반환한다.

0개의 댓글