Hyunebee
스프링 MVC - 스프링 MVC 본문
frontController -> SpringMVC
1.FrontController -> Dispatcher Servlet
2.handlerMappingMap -> handlerMapping
3.ModelView -> ModelandView
4.MyHandlerAdapter -> HandlerAdapter
5.MyvView -> View
Spring MVC도 FrontController패턴으로 구성되었다.
Spring에서 FrontController를 담다아는게 Dispatcher Servlet이다.
Dispatcher Servlet은 HttpServlet를 상속받고 있고 Servlet으로 동작한다.
DispatcherServlet > FrameworkServlet > HttpServletBean >HttpServlet 으로 상속되고 있다.
스프링 부트는 DispacherServlet 을 서블릿으로 자동으로 등록하면서 모든 경로( urlPatterns="/" )에 대해서 매핑한다.
DispatcherServlet.doDispatch(HttpServletRequest request, HttpServletResponse response)에 대해 알아보자
[1]HttpServlet에서 상속받은 service
[2]service -> processRequest
[3]processRequest - > doService
[3]FrameworkServlet.doService() -> DispatherServlet.doService()
doDispatch가 존재한다.
doDispatch의 역할(그림을 보면서)
1. 핸들러 조회
현재 요청에 대한 Handler를 확인합니다.
// Determine handler for the current request.
mappedHandler = getHandler(processedRequest);
protected HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception {
if (this.handlerMappings != null) {
for (HandlerMapping mapping : this.handlerMappings) {
HandlerExecutionChain handler = mapping.getHandler(request);
if (handler != null) {
return handler;
}
}
}
return null;
}
Dispather에 있는 handlerMapping중에서 해당 request를 처리할 수있는 HandlerExecutionChain 객체를 찾는다.
HandlerExecutionChain 리턴
2.핸들러를 처리할 수 있는 핸들러 어댑터 조회
HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
protected HandlerAdapter getHandlerAdapter(Object handler) throws ServletException {
if (this.handlerAdapters != null) {
for (HandlerAdapter adapter : this.handlerAdapters) {
if (adapter.supports(handler)) {
return adapter;
}
}
}
throw new ServletException("No adapter for handler [" + handler +
"]: The DispatcherServlet configuration needs to include a HandlerAdapter that supports this handler");
}
boolean supports(Object handler);
해당 supports는 5개의 클래스를 구현해준다.
3.핸들러 어댑터에 요청,
mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
4.핸들러 호출
ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception;
5개의 방식으로 ModelView를 반환해주고 있다.
5.ModelandView반환
1.AbstractHandlerMethodAdapter
6. 뷰 리졸버를 통해서 뷰 찾기, 7. View 반환
protected View resolveViewName(String viewName, @Nullable Map<String, Object> model,
Locale locale, HttpServletRequest request) throws Exception {
if (this.viewResolvers != null) {
for (ViewResolver viewResolver : this.viewResolvers) {
View view = viewResolver.resolveViewName(viewName, locale);
if (view != null) {
return view;
}
}
}
return null;
}
8. 뷰 렌더링
view.render(mv.getModelInternal(), request, response)
'Spring > MVC' 카테고리의 다른 글
스프링 MVC - 로깅 (0) | 2022.01.17 |
---|---|
스프링 MVC - 스프링 MVC(2) (0) | 2022.01.15 |
스프링MVC - frontController(4) (0) | 2022.01.14 |
스프링MVC - frontController(3) (0) | 2022.01.14 |
스프링MVC - frontController(2) (0) | 2022.01.14 |