Spring MVC 요청 처리 과정
Spring MVC 는 어떻게 Client 의 요청을 처리하는지에 대해 정리한다.
DispatcherServlet
DispatchServlet 은 Client 의 요청에 대해 실제 처리하는 메서드를 호출해주는 Front Controller 역할을 하는 클래스이다.
계층 구조는 다음과 같다.
이제, DispatchServlet 이 Client 의 요청을 받은 뒤에, 어떻게 요청을 처리할 Controller 를 찾고 응답하는지 알아보자.
Client 요청 처리 흐름
전체 흐름은 다음과 같다.
- Application 이 구동될 때, Spring Boot Auto Configure 로 Spring MVC 의 Bean 들이 자동 등록된다.
- 사용자의 요청이 들어오면, DispatcherServlet 의 doService() 가 실행된다.
- doService() 에서 여러 설정을 한 뒤, doDispatch() 가 실행이 된다.
- HandlerMapping 이 요청을 처리할 Handler 를 찾는다.
- 등록되어 있는 HandlerAdapter 중에 해당 Handler 를 실행할 Adapter 를 찾는다.
- HandlerAdapter 는 Handler 의 응답을 처리한다.
- 최종적으로 응답을 보낸다.
디버거를 이용해서, 위 흐름을 코드로 상세히 살펴보자.
Client 가 GET 요청을 하면, FrameworkServlet 의 doGet() 이 실행된다.
processRequest() 의 doService() 에 들어가자.
DispatcherServlet 의 doService 메서드임을 알 수 있다.
여기서, handlerMappings 나 hadnlerAdapterts 클래스들은 아래와 같이 주입된 것이 확인된다.이 클래스들은, Spring Boot Auto Configure 로 인해서, WebMvcAutoConfiguration 에서 Bean 으로 등록된다.
다음과 같이 WebMvcAutoConfiguration 에서 여러 Bean 들이 등록되는 것을 알 수 있다.이제 다시, doSerivce() 에서 doDispatch() 에 들어가보자.
다음과 같이,
- 요청을 처리할 핸들러를 찾고 (by HandlerMappings)
- 해당 핸드러를 실행할 수 있는 HandlerAdapter 를 찾는다.
- 찾아낸 HandlerAdapter 를 이용해서 handle 한다.