[SpringMVC] DispatcherServlet
업데이트:
Dispatcher Servlet
Dispatcher Servlet은 웹으로 부터 받은 모든 요청을 가장 먼저 받아 결과를 되돌려주는 창구와 같은 역할을 한다.
개발 업무에 따라 파일처리, view 처리, 요청과 응답 등 반복적인 코드를 작성해야하는데 Dispatcher Servlet은 이를 템플릿 형태로 만들어 비즈니스 로직을 짜는데 집중하게 도와준다.
Dispatcher Servlet은 가장 먼저 요청을 받고 처리하게 동작하기 위해서 Front Controller 패턴이 사용되었고 그 덕분에 개발자는 URL 구성이나 Tracking, Security를 쉽게 적용할 수 있다.
전체적으로 봤을 때, Dispatcher Servlet은 Spring MVC에서 아래와 같이 작동한다.
FrontController
Front Controller는 모든 리소스의 요청을 처리하는 하나의 대표적인 컨트롤러를 두는 패턴으로써 모든 요청에 대해 앞단에 있는 Front Controller가 어떤 컨트롤러에게 요청을 위임해야 할지 결정하고 어떤 VIEW를 만들어야할지 결정하게된다. 그 과정은 아래와 같다.
- 요청을 받은 Dispatcher Servlet은 Spring Container 내의 어떤 컨트롤러에게 요청을 위임할지 결정하고 위임한다. 또 예외처리를 맡는다.
- 위임 받은 컨트롤러는 모델을 만들거나 특정 서비스를 호출하게 된다. 또한 작업을 마치고 Controller에게 결과를 전달한다.
- Controller는 결과를 통해 view에 전달할 model을 만든다.
- model이 view에 전달된다.
- view와 model은 다시 Dispatcher Servlet에 전달된다.
- dispatcher servlet은 전달받은 model과 view를 토대로 적절한 응답을 만들어낸다.
- 만들어진 응답을 client에게 전달한다.
Dispatcher Servlet은 요청된 URL을 통해 어떤 컨트롤러에게 작업을 위임할지 결정한다. 이 때 URL
뿐만이 아니라 파라미터 정보
, Http 메서드
등 의 정보를 함께 참고하게 된다.
controller가 호출되어질 때 컨트롤러가 가지고 있는 메서드 파라미터에 맞는 정보로 변경해주는 handler adapter를 통해 어떤 핸들러를 호출할지 결정 하게 된다.
스프링은 핸들러 어댑터를 통해 다양한 종류의 컨트롤러 타입을 지원해준다.
디스패쳐 서블릿은 모든 요청의 정보가 담긴 http서블릿 리퀘스트 타입의 오브젝트를 핸들러 어답터에 전달해주면 어댑터가 적절히 변환해 컨트롤러의 메서드가 받을 수 있는 파라미터로 변환해서 전달하게 된다. 어떤 어댑터를 사용할지는 핸들러 어댑터 전략에 따라서 정해지게 된다.
핸들러 어댑터에는 아래와 같은 종류가 있다.
AbstractHandlerMethodAdapter
HandlerFunctionAdapter
HttpRequestHandlerAdapter
RequestMappingHandlerAdapter
SimpleControllerHandlerAdapter
SimpleServletHandlerAdapter
RequestMappingHandlerAdapter
위 핸들러 어댑터 중에서 RequestMappingHandlerAdapter 가 기본적으로 이용 되며 흔히 사용하는 @RequestMapping
으로 적용된다.
View Resolver
ViewResolver는 DispatcherServlet 내에 등록되어 있으며 어떠한 view를 만들지 결정한다.
View Resolver의 안은 DispatcherServlet 내에 체인의 형태로 여러 개가 등록되어있는데, 첫번째 View Resolver에서 이름에 해당하는 view를 찾지 못한 경우 두번째, 그리고 세번째와 같이 이름과 매칭되는 뷰를 찾아 결정한다.
이렇게 결정되고 반환된 뷰는 모델이 적용되어 dispatcher servlet에 의해 response body에 담겨 client에게 전달된다.
결국 위의 내용들을 따라 아래의 과정을 거쳐 client로 부터 들어온 요청에 응답을 반환되며 아래의 그림을 통해 그 모습을 한 눈에 볼 수 있다.
댓글남기기