1. INTRO
Spring MVC의 구조를 공부하던 도중 HandlerMapping과 HandlerAdapter의 동작방식이 잘 이해되지 않아 따로 정리해보게 되었다.
2. 주요 객체
Spring MVC에는 다양한 객체들이 있지만 이 글에선 DispatcherServlet, HandlerMapping, HandlerAdapter 위주로 적고자한다.
DispatcherServlet
- Spring MVC 구조의 핵심 객체는 DispatcherServlet이라고 할 수 있다.
- HttpServlet을 상속받아 서블릿으로 동작한다.
- Spring boot는 DispatcherServlet 을 서블릿으로 자동으로 등록하면서 모든 경로에 대해서 매핑한다.
- doDispatch()를 호출함으로써 클라이언트의 요청을 처리한다.
HandlerMapping
- Handler들에 대한 매핑정보를 갖고 있는 객체
- 요청에 알맞은 Handler를 찾아 반환시켜준다.
HandlerAdapter
- HandlerMapping에서 받아온 Handler를 처리해주는 객체
3. 동작 방식(DispatcherServlet & HandlerMapping & HandlerAdapter)
모든 과정은 DispatcherServlet의 doDispatch()메서드를 통해 동작한다.
1. getHandler()
- 요청정보를 가지고 모든 HandlerMapping들을 하나씩 대조해가면서 사용해 적절한 Handler를 반환시켜준다.
mappedHandler = getHandler(processedRequest);
//////////
//////////
//getHandler() 로직
for (HandlerMapping mapping : this.handlerMappings) {
HandlerExecutionChain handler = mapping.getHandler(request); // HandlerMapping.getHandler
if (handler != null) {
return handler;
}
}
※ getHandler() 메서드 내에 getHandler()메서드가 하나 더 호출되는데 이는 HandlerMapping의 getHandler()이며 요청정보를 통해 Handler를 실제로 받아오는 서로 다른 메서드이다.
2. getHandlerAdapter()
- 모든 HandlerAdpater들을 뒤져서 앞서 찾아온 Handler를 처리해줄 수 있는 HandlerAdapter를 찾아 반환시켜준다.
HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
3. HandlerAdapter.handle()
- 찾아온 HandlerAdapter를 통해 Handler의 로직을 실행시켜 ModelAndView객체를 반환시켜준다.
mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
그림으로 이해하기 쉽게 정리해봤다.
4. 마치며
SpringMvc는 스프링부트의 핵심 구조이므로 확실하게 이해하고 넘어가면 좋을거 같다고 생각해 한번 정리해보았다.
정리해보니 생각보다 간단한 구조였다.
'Spring > Spring MVC' 카테고리의 다른 글
Spring Boot의 Validation 동작 방식 - Binding Result (0) | 2024.03.25 |
---|