DispatcherServlet 의 Dispatcher 는 "보내다" 라는 뜻을 가지고 있다. 이러한 뜻에 따라
DispatcherServlet 은 HTTP 프로토콜로 들어오는 모든 요청을 맨 앞쪽에서 받아 요청에 맞는
적절한 Controller 를 찾아 전달하는 Front Controller 라고 정의할 수 있다.
여기서 Front Controller 는 서블릿 컨테이너의 제일 앞쪽에서 모든 요청을 받아 처리하는
Controller 로써 MVC 구조에서 사용되는 디자인 패턴입니다.
위 이미지를 보면서 자세하게 설명을 하게 되면 클라이언트로부터 요청이 들어오게 되면
Tomcat 과 같은 서블릿 컨테이너가 요청을 받게 됩니다. 서블릿 컨테이너에서 Filter 를 통해
인증 및 인가 등 처리한 후 Dispatcher Servlet 이 모든 요청을 받는다.
Dispathcer Servlet 장점
Spring MVC 에서 DispatcherServlet 이 등장하기 전에는 모든 서블릿에 대한 정보와
서블릿에 대한 URL 매핑을 위해 web.xml 파일에 모드 등록해줘야 했다.
아래 이미지를 보면 <servlet></servlet> 태그를 통해 서블릿을 등록하고
<servlet-mapping></servlet-mapping> 태그를 통해 name 에 해당하는 서블릿의 URL 매핑작업을 한다.
해당 URL 로 요청이 들어올 경우 mapping 된 서블릿으로 요청 처리 작업을 진행한다.
위 이미지와 같이 모든 서블릿에 대한 정보와 Mapping 정보를 적어줘야 하는 불편함이 있다.
DispatcherServlet 은 해당 어플리케이션으로 들어오는 모든 요청을 핸들링하여
공통작업을 처리하면서 편리하게 이용할 수 있게 되었습니다.
DispatcherServlet 동작 원리
DispatcherServlet 은 모든 요청을 받아 적절한 Controller 를 찾아 클라이언트의 요청을 처리합니다.
DispatcherServlet 의 동작 원리 및 처리 과정을 보면 아래와 같습니다.
1. 클라이언트의 HTTP 요청이 들어온다.
2. 요청을 받은 DispatcherServlet 은 HandlerMapping 을 통해 적절한 Controller 를 찾는다.
* HandlerMapping
HandlerMapping 은 Spring 어플리케이션이 실행될 때 RequestMappingHandlerMapping 클래스를 통해
@Controller, @RequestMapping 어노테이션이 있는 곳의 URL(Handler)을 찾아
Mapping 시켜놓은게 HandlerMapping 이다.
HandlerMapping 은 HashMap<요청 정보, 처리할 대상> 으로 Handler 들을 관리하며,
요청이 오면 (Http Method, URI) 등을 사용해 요청 정보를 만들고, HashMap 에서 요청을
처리할 대상을 찾아 HandlerExecutionChain 으로 반환한다.
3. HandlerMapping 을 통해 직접적으로 Controller 에게 전달하는게 아닌 HandlerAdapter 를 통해
적절한 Controller 를 찾는다.
HandlerMapping 은 적절한 HandlerAdapter 를 통해 비즈니스 로직을 수행할 Controller 를 찾는다.
이때 HandlerAdapter 는 클라이언트로부터 들어온 요청정보 중 Controller 에게 전달할 데이터를
적절한 형식으로 파싱하여 전달한다.
HandlerAdpater 는 데이터를 HttpMessageConverter 클래스 타입의 구현체 중 알맞는 클래스 와
넘어온 Header 의 Content Type 을 비교하여 데이터를 파싱한다.
4. HandlerAdapter 는 적절한 Controller 에게 요청을 위임한다.
5. 전달받은 Controller 는 클라이언트의 요청에 맞게 비즈니스 로직을 통해 데이터를 처리하여
반환값을 Return 한다.
응답데이터가 필요한 경우 @RestControler 또는 @Controller 에 @ResponseBody 어노테이션을
사용하여 @ResponseEntity 를 반환하고, 응답 데이터를 보여주려면 String Return의
View 이름을 반환할 수 있다.
6. 반환받은 HandlerAdapter 는 DispatcherServlet 에게 반환한다.
반환값이 ResponseEntity 일 경우 HttpEntityMethodProcessor 가 MessageConverter 를 사용해
응답 객체를 적절하게 직렬화하고 응답 상태(Http Status)를 설정한다.
또한 반환값이 View 이름일 경우 ViewResolver 를 통해 적절한 View 를 찾아 Rendering 한 후
반환한다.
7. 응답값을 클라이언트에게 데이터 또는 View 를 통해 적절한 화면을 보여준다.
상세요약
1. Dispatcher Servlet(Front Controller) 클래스가 클라이언트의 요청을 받는다.
2. getHandler() 메서드를 통해 HandlerMapping 리스트 중 요청에 맞는 Handler 를 가져온다.
HandlerMapping 이란? @Controller 의 @RequestMapping 이 존재하는 모든 URL 값을 HashMap<요청정보, 처리할 대상> 으로 Handler 를 만들어 매핑 시켜놓은 값이다. 각각의 @RequestMapping 값들이 Handler 가 되며, 이러한 Handler 를 매핑 시켜놓은게 Handler Mapping 이다.
3. Handler 를 찾아 로직을 실행시킬 HandlerAdapter 를 찾기 위해 getHandlerAdapter() 메서드를 호출한다.
4. HandlerAdapter 는 handler() 메서드를 호출하여 Controller 의 요청 처리를 수행한다.
5. 반환된 ModelAndView 객체를 받는다.
반환된 ModelAndView 객체에서 Controller 의 View Name 을 applyDefaultViewName() 메서드를 통해
설정한다.
6~8. processDispatcherResult(), render() 메서드를 호출하여 View 객체 생성 후 HTML 반환한다.