오늘은 저번 AOP 공부 때 약간 공부가 부족하다고 느꼈던 Dispatcher Servlet에 대해 알아보았다.
참고 사이트: mangkyu
서블릿 컨테이너 가장 앞단에서 클라이언트에게서 들어온 모든 HTTP 요청을 알맞은 컨트롤러에게 위임해주는 프론트 컨트롤러
클라이언트에게서 요청이 오면 톰캣과 같은 서블릿 컨테이너에서 요청을 먼저 받게 되는데, 여기서 디스패처 서블릿이 가장 먼저 받아서 공통적인 작업을 처리한 후 해당 요청을 처리해야하는 컨트롤러에게 위임하는 구조이다.
Front Controller : 프론트 컨트롤러 패턴. 주로 MVC 패턴에서 함께 사용되며, 서블릿 컨테이너 가장 앞에서 클라이언트의 모든 요청을 받아 처리해주는 컨트롤러다. 모든 서블릿을 web.xml에 URL 매핑하지 않아도 되게 해준다.
Dispatcher Servlet은 HttpServlet을 상속한다.
(DispatcherServlet -> FrameworkServlet -> HttpServletBean -> HttpServlet의 상속구조)
in Spring
web.xml에 등록된 dispatcherServlet의 <url-pattern>에서 /
경로 즉, 모든 요청을 적용하도록 등록되어있다. 이를 수정하면 특정 URL에서 오는 요청만 이를 거치도록 할 수 있다.
in Spring Boot
application.properties 혹은 application.yml 파일에 server.servlet.context-path 옵션으로 지정이 가능하다.
정적 자원 처리
Dispatcher Servlet이 모든 요청을 처리하면서 이미지나 HTML/CSS/JS와 같은 정적 자원(Static Resources)도 함께 처리하는 문제도 생겼다.
이 문제는 Dispatcher Servlet이 요청을 처리할 컨트롤러를 찾지 못하면 2차적으로 정적 자원의 경로를 탐색해 자원을 찾는 방식으로 해결하게 되었다.
필터 이후 인터셉터 이전에 적용된다.
- 요청이 Dispatcher Servelet으로 온다.
- Handler Mappring을 통해 알맞은 컨트롤러를 찾는다.
- Handler Adapter를 통해 해당 컨트롤러의 매서드를 실행시킨다.
- 해당 컨트롤러는 요청을 처리하고난 결과(Model and View)를 다시 Dispatcher Servlet으로 전달한다.
- Dispatcher Servlet은 전달 받은 정보로 View Resolver를 통해 View를 찾아 Response를 전달한다.