Spring MVC에 대해서 공부하던 중 DispatcherServlet에서 Handler를 매핑하는건 알겠는데 언제 url까지 매핑해서 해당 method를 실행하는거지? 라고 궁금증이 들어서 알아보게 되었습니다!
위의 과정을 이해하려면 먼저 FrontController의 역할을 하는 먼저 DispatcherServlet의 doDispatch()를 보겠습니다.
(1) DispatcherServlet의 doDispatch()
위의 파란줄을 보면 getHandler() 를 통해 request에 맞는 handler를 가져오는 것 같은데 한번 확인해보겠습니다.
(2) DispatcherServlet의 getHandler()
우선 HandlerExecutionChain을 return하며
HandlerMapping의 getHandler()에 request를 전달하여 요청을 처리할 수 있는 handler를 가져오는 로직이 있습니다.
HanlderExecutionChain은 어떻게 생겼는지 확인해보겠습니다.
handler를 내부에 가지고 있고 다른 속성들을 가지고 있습니다.
HandlerMapping을 한번 확인해보겠습니다.
(3) HandlerMapping 인터페이스의 getHandler()
HttpServletRequest에 맞게 handler를 반환해주는 역할을 합니다.
그러면 이 HandlerMapping의 구현중 하나인 AbstractHandlerMapping을 확인해보겠습니다.
(4) AbstractHandlerMapping의 getHandler(), getHandlerInternal()
보면 AbstractHandlerMapping의 getHandlerInternal()을 실행해서 handler를 받네요.
그러면 getHandlerInternal()을 확인해보겠습니다.
Object를 반환하는 abstract 메서드네요 AbstractHandlerMapping 클래스를 상속받은 AbstractHandlerMethodMapping 클래스를 확인해보겠습니다.
(5) AbstractHandlerMethodMapping getHandlerInternal()
먼저 주석을 보면 주어진 요청으로 handler method를 찾는다고 하네요?
lookupHandlerMethod()를 통해서 HandlerMethod 객체를 찾아서 반환하고 있습니다.
(6) AbstractHandlerMethodMapping lookupHandlerMethod()
주석에서 볼 수 있듯이 현재 요청에 가장 잘 매칭되는 handler method를 찾는다고 하네요.
matches라는 List에 여러 매칭되는 메서드들을 저장하는 것 같습니다.
하나의 요청 url이 여러 Http Method와 연결될 수 있으므로 List로 관리하는 것 같네요.
그리고 결국에는 가장 bestMatch 잘 맞는 method를 반환하네요.
결국 이것을 AbstractHandlerMethodMapping의 getHandlerInternal()에서 반환하게 되고
마지막으로 결국에 DispatcherServlet의 getHandler()에서 mapping.getHandler를 통해 method를 얻게 되고
doDispatch()에서 getHandler()를 호출함으로써 HandlerExecutionChain에 method를 담습니다.
이렇게해서 Handler를 매핑하는 과정에서 요청 url과 http method에 매칭되는 호출될 method를 받게 된다는 것을 알게 되었습니다.
어렵지만 재밌네요!
'🌐 Backend > 🍃 Spring' 카테고리의 다른 글
Spring Cloud #1 (0) | 2023.05.28 |
---|---|
파일 업로드 하는 방법(Form, Spring) (0) | 2022.09.12 |
Path Variable VS Query Parameter (0) | 2022.07.29 |
서블릿(Servlet)이 무엇인지 같이 알아보자! (0) | 2022.07.18 |
Bean Scope가 뭘까? (0) | 2022.07.13 |