•
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가 적절한 화면을 내려줍니다.