Dispatcher Servlet

Dispatcher Servlet를 확인하여Spring Web MVC 과정을 살펴보자

Dispatcher Servlet이란 무엇인가

Dispatcher Servlet이란 외부의 요청을 특정 컨트롤러로 매핑하기 위해 Front Controller 패턴을 적용한 Servlet이다.

circle-info

Q1. 그렇다면 Front Controller 패턴이란 무엇인가?

Front Controller는 주로 서블릿 컨테이너의 제일 앞에서 서버로 들어오는 클라이언트의 모든 요청을 받아서 처리해주는 컨트롤러인데, MVC 구조에서 함께 사용되는 패턴이다. 이전에는 서블릿을 컨트롤러 당 하나씩 두고 있어서 컨트롤러가 추가될 때마다 서블릿 설정도 추가해주어야 했다. 그러나 dispatcher servlet을 두면서 컨트롤러 추가시 별도의 servlet 설정을 할 필요가 없었다. 그리고 dispatcher servlet을 통해서 Tracking이나 Security를 적용할 때 편하게 구현이 가능하고, URL 구성이 간편해졌다.

Dispatcher Servlet 동작 순서

  • 클라이언트가 해당 어플리케이션에 접근하면 DispatcherServlet이 가로챈다.

circle-info

Q2. 어떻게 dispatcherServlet이 외부의 요청을 가로채는가?

web.xml에 등록된 dispatcherServlet의 <url-pattern>이 '/'와 같이 해당 어플을 통과하는 모든 URL로 등록했기 때문이다. 특정 URL만 적용하고 싶다면 <url-pattern>의 내용을 변경해주면 된다.

스프링은 web.xml 파일에 아래와 같이 dispatcher servlet적용 url pattern을 적용할 수 있다.

circle-info

Q3. 스프링 부트는 url pattern을 어떻게 설정할 수 있을까? appliation.yml , application.properties파일에 server.servlet.context-path 옵션으로 지정할 수 있다.

  • DispatcherServlet은 가로챈 정보를 HandlerMapping 에게 보내 해당 요청을 처리할 수 있는 Controller를 찾아낸다. HandlerMapping이 컨트롤러를 찾아내는 전략은 BeanNamUrlHandlerMapping과 DefaultAnnotationHandlerMapping이 기본 전략이다.

circle-info

Q4. HandlerMapping이 컨트롤러를 찾는 다른 전략은 무엇이 있는가?

  1. DefaultAnnotationHandlerMapping : @RequestMapping 이라는 애노테이션을 컨트롤러 클래스나 메소드에 직접 부여하고 이를 이용해 매핑하는 전략이다.

  2. BeanNameUrlHandlerMapping : 빈정의 태그에서 name attribute에 선언된 URL과 class attribute에 정의된 Controller를 매핑하는 방식으로 동작한다.

  3. ControllerClassNameHandlerMapping : Controller의 클래스 이름중 suffix인 Controller를 제거한 나머지 이름의 소문자로 url mapping한다.

  4. SimpleUrlHandlerMapping : Ant-Style 패턴 매칭을 지원하며, 하나의 Controller에 여러 URL을 mapping 할 수 있다.

  • HandlerMapping을 통해 선택된 컨트롤러 객체를 DispatcherServlet에게 전달하면 DispatcherServlet은 HandlerAdapter에게 타겟 컨트롤러에게 작업을 요청한다

  • 요청 받은 컨트롤러는 비즈니스 로직을 수행한다

  • 컨트롤러는 요청을 응답받을 ModelAndView 객체를 변환해서 DispatcherServlet에게 리턴하게 된다. 그때 View를 찾기 위해 DispatcherServlet은 ViewResolver에게 요청하여 View를 검색한다.

  • 컨트롤러에서 보내온 View 이름을 토대로 처리 View를 검색한다.

  • 이 결과를 다시 DispatcherServlet 에게 보낸다.

  • DispatcherServlet은 최종 결과를 클라이언트에 전송한다.

filter와 interceptor, aop의 수행 시점을 dispatcherServlet를 기준으로 알아보

  • filter : dispatcherServlet 이전과 이후에 동작

  • interceptor : dispatcherServlet과 컨트롤러 사이에 동작

  • aop : interceptor와 컨트롤러 사이에 동작

참고

Last updated

Was this helpful?