(그림 출처 - (인프런) 스프링 MVC 1편 - 김영한)
요청 흐름
- 핸들러 조회
- 핸들러를 처리할 수 있는 핸들러 어댑터 조회
- handle(handler)
- 핸들러어댑터에서 handler 호출
- 핸들러(컨트롤러)가 ModelAndView 반환
- ViewResolver 호출
- ViewResolver가 View 반환
- render(model) 호출
DispatcherServlet 등록하는 법
<servlet>
<servlet-name>appServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/classes/servlet-context.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
- Spring Boot
- Spring Boot에서는 DispatcherServlet을 자동으로 등록해주기 때문에 수동으로 등록해주지 않아도 됨
- `DispatcherServletConfiguration` 에서 `DispatcherServlet`을 bean으로 등록
→ dependency에서 해당 configuration을 갖고 있는 것으로 확인
코드를 통해 알아보는 DispatcherServlet 요청 Flow
- 핸들러 조회 (1036 Line) → 요청을 처리할 Controller 조회
- 핸들러 어댑터 조회 (1043 Line)
- HandlerAdapter 리스트를 순회하며 파라미터로 넘어온 handler를 지원하는지 확인
- RequestMappingHandlerAdapter가 조회됨
- handle(handler)
- 핸들러 어댑터를 통해 핸들러 호출
- 핸들러(컨트롤러)가 ModelAndView 반환
- viewResolver 호출
- View 반환
- render(model) 호출
→ 여기까지 DispatcherServlet의 요청흐름에 대해서 알아보았다.
이제부터 HandlerMapping과 HandlerAdapter에 대해서 더 알아보자.
DispatcherServlet.properties
를 확인하면 스프링에서 디폴트로 사용하는 HandlerMapping, HandlerAdapter 종류를 확인할 수 있다.
HandlerMapping
HTTP 요청정보를 이용해서 컨트롤러를 찾아주는 역할
- 스프링에서 사용하는 default HandlerMapping
- BeanNameUrlHandlerMapping : URL과 일치하는 이름을 갖는 빈과 매핑시켜주는 HandlerMapping 구현체
- RequestMappingHandlerMapping : @RequestMapping 애노테이션을 토대로 - RequestMappingInfo 인스턴스를 만드는 HandlerMapping 구현체
- RouterFunctionMapping : RouterFunction을 지원하는 HandlerMapping 구현체
HandlerAdapter
handler를 실행시켜주는 역할
- `supports` : 파라미터로 넘어온 Handler를 지원하는 지 여부를 판단하는 메서드
- `handle` : handler 호출하는 메서드
- 스프링에서 사용하는 default HandlerAdapter
- HttpRequestHandlerAdapter : HttpRequestHandler를 구현한 컨트롤러를 처리하는 HandlerAdapter 구현체
- SimpleControllerHandlerAdapter : Controller 인터페이스를 구현하여 만든 컨트롤러에 요청을 보낼 때 사용하는 HandlerAdapter 구현체
- RequestMappingHandlerAdapter : @Controller 클래스 내 @RequestMapping 어노테이션 핸들러 매핑을 처리하는 HandlerAdapter 구현체
- HandlerFunctionAdapter : RouterFunctionMapping를 처리하기 위한 - HandlerFunctions를 지원하는 HandlerAdapter 구현체