Search
Duplicate
🕹️

DispatcherServlet

Spring MVC는 대다수의 웹 프레임워크와 마찬가지로 중앙 Servlet, DispatcherServlet이 요청 처리를 위한 공유 알고리즘을 제공하는 프론트 컨트롤러 패턴을 중심으로 설계되었다.
실제 작업은 구성가능한 대리 구성요소로 처리된다. 이런 모델은 유연하고 다양한 워크플로우에서 지원된다.
DispctcherSerlvet은 다른 Servlet들과 마찬가지로 Java 설정을 사용하거나 web.xml에서 선언되고 매핑되어야 한다.
DispatcherServlet은 요청 매핑, 뷰 해석, 예외 처리 등이 필요한 대리 구성 요소를 찾기 위해 Spring 구성을 사용합니다.

DispatcherServlet이란?

Servlet의 일종으로 Dispatcher라는 의미는 다음과 같은 뉘앙스를 가지고 있다.
a person whose job is to receive messages and organize the movement of people or vehicles, especially in the emergency services.
차량이나 사람을 필요한 곳으로 보내는 작업
즉 Dispathcer 역할을 하는 Servlet이다.
서블릿은 웹 요청, 응답의 흐름을 메소드 호출만으로도 체계적으로 다룰 수 있게 해주는 기술이다.
웹 요청, 응답의 흐름을 제어하기 위해 적절히 메소드를 호출하기 위한 서블릿인것 같다.
상속구조

동작구조

1.
클라이언트의 요청을 DispatcherServle이 받는다.
2.
어느 컨트롤러가 요청을 처리할 수 있는지 식별하기 위해 HandlerMapping을 호출한다.
@RequestMapping 관련 요청을 처리하는 RequestMappingHandlerMapping, WebSocket 관련 요청을 식별하기 위한 WebSocketHandlerMapping등이 있다.
이는 @Controller로 작성된 모든 컨트롤러를 찾고 파시앟여 HashMap으로 <요청 정보, 처리할 대상>을 관리한다.
여기서 처리할 대상은 HandlerMethod 객체로 Controller, Method 등을 갖고 있는데, 이때 스프링이 리플렉션을 이용해 요청을 위임하기 대문이다.
요청이 오면 Http Method, URI 등을 이용해 요청 정보를 만들고 HashMap에서 요청을 처리할 대상인 HandlerMethod를 찾은 후 HandlerExecutionChain으로 감싸서 반환한다.
이때 HandlerExecutionChain을 보면 interceptor 리스트가 있는 것을 확인할 수 있다.
3.
요청을 컨트롤러로 위임할 핸들러 어댑터를 찾아서 전달한다.
컨트롤러를 찾았으니 이를 해당 컨트롤러에게 위임해주어야 한다.
이때 컨트롤러로 직접 위임하는 것이 아니라 HandlerAdater를 통해 위임한다. 이는 컨트롤러의 구현 방식이 다양하기 때문이다.
4.
핸들러 어댑터가 컨트롤러에게 요청을 위임한다.
이때 핸들러 어댑터가 컨트롤러로 요청을 위임한 전/후에 공통적인 처리 과정이 필요하다.
전처리 과정의 경우, 인터셉터, 요청 시 @RequestParam, @ReuquestBody 등을 처리하기 위한 ArgumentResolver 등이 있다.
후처리 과정의 경우, ResponseEntity의 Body를 Json으로 직렬화하는 등의 처리를 하는 ReturnValueHandler 등이 있다.
전처리 과정이 끝나면 Reflection API를 이용해 컨트롤러에게 요청의 처리를 위임한다.
요청을 처리할 대상의 정보인 HandlerMethod 객체에는 컨트롤러와 메소드 객체가 존재하므로 리플렉션의 메소드 객체를 invoke하게 된다.
실제로는 HandlerMethod에 컨트롤러의 Bean 이름과 메소드, 빈 팩토리가 존재하여 빈 팩토리에서 컨트롤러를 찾는다.
5.
컨트롤러가 요청을 처리한 후, 핸들러 어댑터가 반환값을 처리한다.
HandlerAdapter는 컨트롤러로부터 받은 응답을 응답 처리기인 ReturnValueHandler가 후처리한 후에 DispatcherServlet으로 돌려준다.
컨트롤러가 ResponseEntity를 반환하면 HttpEntityMethodProcessor가 MessageConverter를 사용해 응답 객체를 직렬화하고 응답 상태를 설정한다.
컨트롤러가 View 이름을 반환하면 ViewResolver를 통해 View를 반환한다.
6.
서버의 응답을 클라이언트로 반환한다.
DispatcherServlet을 통해 반환되는 응답은 다시 필터들을 거쳐 클라이언트에게 반환된다.
이때 응답이 데이터라면 그대로 반환되지만, 응답이 화면이라면 View의 이름에 맞는 View를 찾아서 반환해주는 ViewResolver가 적절한 화면을 내려줍니다.