Dispatcher Servlet
Dispatcher Servlet를 확인하여Spring Web MVC 과정을 살펴보자
Last updated
Dispatcher Servlet를 확인하여Spring Web MVC 과정을 살펴보자
Last updated
Dispatcher Servlet이란 외부의 요청을 특정 컨트롤러로 매핑하기 위해 Front Controller 패턴을 적용한 Servlet이다.
Front Controller는 주로 서블릿 컨테이너의 제일 앞에서 서버로 들어오는 클라이언트의 모든 요청을 받아서 처리해주는 컨트롤러인데, MVC 구조에서 함께 사용되는 패턴이다. 이전에는 서블릿을 컨트롤러 당 하나씩 두고 있어서 컨트롤러가 추가될 때마다 서블릿 설정도 추가해주어야 했다. 그러나 dispatcher servlet을 두면서 컨트롤러 추가시 별도의 servlet 설정을 할 필요가 없었다. 그리고 dispatcher servlet을 통해서 Tracking이나 Security를 적용할 때 편하게 구현이 가능하고, URL 구성이 간편해졌다.
클라이언트가 해당 어플리케이션에 접근하면 DispatcherServlet이 가로챈다.
Q2. 어떻게 dispatcherServlet이 외부의 요청을 가로채는가?
web.xml에 등록된 dispatcherServlet의 <url-pattern>이 '/'와 같이 해당 어플을 통과하는 모든 URL로 등록했기 때문이다. 특정 URL만 적용하고 싶다면 <url-pattern>의 내용을 변경해주면 된다.
스프링은 web.xml 파일에 아래와 같이 dispatcher servlet적용 url pattern을 적용할 수 있다.
Q3. 스프링 부트는 url pattern을 어떻게 설정할 수 있을까? appliation.yml , application.properties파일에 server.servlet.context-path 옵션으로 지정할 수 있다.
DispatcherServlet은 가로챈 정보를 HandlerMapping 에게 보내 해당 요청을 처리할 수 있는 Controller를 찾아낸다. HandlerMapping이 컨트롤러를 찾아내는 전략은 BeanNamUrlHandlerMapping과 DefaultAnnotationHandlerMapping이 기본 전략이다.
Q4. HandlerMapping이 컨트롤러를 찾는 다른 전략은 무엇이 있는가?
DefaultAnnotationHandlerMapping : @RequestMapping 이라는 애노테이션을 컨트롤러 클래스나 메소드에 직접 부여하고 이를 이용해 매핑하는 전략이다.
BeanNameUrlHandlerMapping : 빈정의 태그에서 name attribute에 선언된 URL과 class attribute에 정의된 Controller를 매핑하는 방식으로 동작한다.
ControllerClassNameHandlerMapping : Controller의 클래스 이름중 suffix인 Controller를 제거한 나머지 이름의 소문자로 url mapping한다.
SimpleUrlHandlerMapping : Ant-Style 패턴 매칭을 지원하며, 하나의 Controller에 여러 URL을 mapping 할 수 있다.
HandlerMapping을 통해 선택된 컨트롤러 객체를 DispatcherServlet에게 전달하면 DispatcherServlet은 HandlerAdapter에게 타겟 컨트롤러에게 작업을 요청한다
요청 받은 컨트롤러는 비즈니스 로직을 수행한다
컨트롤러는 요청을 응답받을 ModelAndView 객체를 변환해서 DispatcherServlet에게 리턴하게 된다. 그때 View를 찾기 위해 DispatcherServlet은 ViewResolver에게 요청하여 View를 검색한다.
컨트롤러에서 보내온 View 이름을 토대로 처리 View를 검색한다.
이 결과를 다시 DispatcherServlet 에게 보낸다.
DispatcherServlet은 최종 결과를 클라이언트에 전송한다.
filter : dispatcherServlet 이전과 이후에 동작
interceptor : dispatcherServlet과 컨트롤러 사이에 동작
aop : interceptor와 컨트롤러 사이에 동작