![](https://velog.velcdn.com/images/soso_ok9/post/b88ce756-1ec0-487b-8257-1ab6dd29d0e5/image.png)
(그림 출처 - (인프런) 스프링 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을 자동으로 등록해주기 때문에 수동으로 등록해주지 않아도 됨
![](https://velog.velcdn.com/images/soso_ok9/post/cea3b8a4-1383-4451-afd5-496a774e1864/image.png)
- `DispatcherServletConfiguration` 에서 `DispatcherServlet`을 bean으로 등록
→ dependency에서 해당 configuration을 갖고 있는 것으로 확인
![](https://velog.velcdn.com/images/soso_ok9/post/b9123001-4ae5-44e3-862f-10f8663c8c1d/image.png)
코드를 통해 알아보는 DispatcherServlet 요청 Flow
- 핸들러 조회 (1036 Line) → 요청을 처리할 Controller 조회
![](https://velog.velcdn.com/images/soso_ok9/post/643bac03-8d76-47f3-b4b9-d75bc5c195cf/image.png)
- 핸들러 어댑터 조회 (1043 Line)
![](https://velog.velcdn.com/images/soso_ok9/post/01c7eaa8-1d2d-4e52-9e06-619c239df27b/image.png)
- HandlerAdapter 리스트를 순회하며 파라미터로 넘어온 handler를 지원하는지 확인
- RequestMappingHandlerAdapter가 조회됨
![](https://velog.velcdn.com/images/soso_ok9/post/a30780de-aeb1-40dd-9911-a23e1c30431d/image.png)
- handle(handler)
- 핸들러 어댑터를 통해 핸들러 호출
- 핸들러(컨트롤러)가 ModelAndView 반환
![](https://velog.velcdn.com/images/soso_ok9/post/bae0cd2f-4b43-4c21-a614-054569e27661/image.png)
- viewResolver 호출
- View 반환
![](https://velog.velcdn.com/images/soso_ok9/post/0e3093a9-800e-43c9-8f38-2925c1506e30/image.png)
![](https://velog.velcdn.com/images/soso_ok9/post/40ecb0a5-314f-4eba-afaf-18f2530c1193/image.png)
![](https://velog.velcdn.com/images/soso_ok9/post/f2016489-ea10-4327-a1f9-3693c8e86038/image.png)
![](https://velog.velcdn.com/images/soso_ok9/post/b016f078-da04-4c69-9c6e-0a1f65d0c39d/image.png)
- render(model) 호출
![](https://velog.velcdn.com/images/soso_ok9/post/2e383b03-408d-4451-adad-6da1b14f85d8/image.png)
![](https://velog.velcdn.com/images/soso_ok9/post/24334557-81da-49a7-9a98-5e25a65edd07/image.png)
![](https://velog.velcdn.com/images/soso_ok9/post/7a9912fa-df73-43b3-b863-7910dd6d6c7b/image.png)
→ 여기까지 DispatcherServlet의 요청흐름에 대해서 알아보았다.
이제부터 HandlerMapping과 HandlerAdapter에 대해서 더 알아보자.
DispatcherServlet.properties
를 확인하면 스프링에서 디폴트로 사용하는 HandlerMapping, HandlerAdapter 종류를 확인할 수 있다.
HandlerMapping
HTTP 요청정보를 이용해서 컨트롤러를 찾아주는 역할
![](https://velog.velcdn.com/images/soso_ok9/post/df75d5bd-b404-4b6c-aeb4-13d0c9e55187/image.png)
- 스프링에서 사용하는 default HandlerMapping
![](https://velog.velcdn.com/images/soso_ok9/post/8a824c20-1fa5-4b39-ae75-5e1e55cdf2a2/image.png)
- BeanNameUrlHandlerMapping : URL과 일치하는 이름을 갖는 빈과 매핑시켜주는 HandlerMapping 구현체
- RequestMappingHandlerMapping : @RequestMapping 애노테이션을 토대로 - RequestMappingInfo 인스턴스를 만드는 HandlerMapping 구현체
- RouterFunctionMapping : RouterFunction을 지원하는 HandlerMapping 구현체
HandlerAdapter
handler를 실행시켜주는 역할
![](https://velog.velcdn.com/images/soso_ok9/post/189fe5a4-f191-4e45-897b-3b968fd0b229/image.png)
- `supports` : 파라미터로 넘어온 Handler를 지원하는 지 여부를 판단하는 메서드
- `handle` : handler 호출하는 메서드
- 스프링에서 사용하는 default HandlerAdapter
![](https://velog.velcdn.com/images/soso_ok9/post/3cb8ad4a-fd69-43b6-9dd5-2ffe1beadcfa/image.png)
- HttpRequestHandlerAdapter : HttpRequestHandler를 구현한 컨트롤러를 처리하는 HandlerAdapter 구현체
- SimpleControllerHandlerAdapter : Controller 인터페이스를 구현하여 만든 컨트롤러에 요청을 보낼 때 사용하는 HandlerAdapter 구현체
- RequestMappingHandlerAdapter : @Controller 클래스 내 @RequestMapping 어노테이션 핸들러 매핑을 처리하는 HandlerAdapter 구현체
- HandlerFunctionAdapter : RouterFunctionMapping를 처리하기 위한 - HandlerFunctions를 지원하는 HandlerAdapter 구현체