위 이미지를 보게 되면 DispatcherServlet 은 Servlet 인터페이스를 구현하여 아래와 같은 순서이다.
Servlet.class > GenericServlet.class > HttpServlet.class > FrameworkServlet.class > DispathcerServlet.class 의 doService() 메서드 실행
아래 내용을 보기전 알아두어야 할 점은 스프링 어플리케이션이 실행될 때 DispatcherServlet 을 자동으로 등록하고
@ComponentScan 어노테이션에 의해 @RequestMapping 어노테이션이 존재하는 Handler 들을 모두 매핑시킨다.
이러한 Handler 들을 매핑시킨게 DispatcherServlet 에 의해 적절한 Controller 를 찾는 HandlerMapping 이다.
스프링에서 따로 설정하지 않는 이상 기본 HandlerMapping 클래스는
RequestMappingHandlerMapping 클래스 이다.
실제로 아래 이미지는 RequestMappingHandlerMapping 클래스가 아래와 같이 Map 형식의
RequestMapping 어노테이션의URL을 매핑시킨 내용이다.
HashMap<Key, Value>(Key : 요청정보, Value : 처리할 대상)
Spring Boot 의 @ComponentScan 어노테이션은 main 메소드가 존재하는 클래스의
@SpringBootApplication 어노테이션에 존재한다.
Servlet.class(인터페이스)
GenericServlet.class(추상클래스)
HttpServlet.class
FrameworkServlet.class
DispatcherServlet.class
클라이언트 요청에 의해 Servlet 의 doService() 가 호출되는데 doService() 메서드는 아래 내용과 같이 doDispatcher에게
위임한다고 설명되어 있다.
"Exposes the DispatcherServlet-specific request attributes and delegates to {@link #doDispatch}"
doDispatch() 메서드에서는 getHandler(HttpServletRequest) 메서드를 통해 적절한 Handler 를 찾는다.
적절한 Handler 는 @ComponentScan 어노테이션에 의해 매핑된 @RequestMapping 의 HanlderMapping 에서 찾습니다.
알맞는 HandlerMapping 을 이용해 적절한 HandlerAdapter 를 찾는다.
적절한 HandlerAdapter 의 handler() 메서드를 호출하면 실제 Controller를 통한 비즈니스 로직이 수행된다.
수행된 비즈니스 로직은 ModelAndView 객체를 반환하는데 View 이름과 가공된 데이터가 들어있다.
ModelAndView 객체인 가공된 데이터와 View 이름을 가지고 ViewResolver 에게 넘겨 실제 View 를 리턴받는다.
ModelAndView mv 에 대한 내용 처리 후 render() 메서드를 통해 실제 View 를 처리한다.
View 클래스의 render() 메서드를 통해 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 반환한다.