Hyunebee

스프링 MVC - 스프링 MVC 본문

Spring/MVC

스프링 MVC - 스프링 MVC

Hyunebee 2022. 1. 15. 10:46

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

abstract method로 구현해줘야한다. 이것은 DispatherServlet에서 구현해준다.

[3]FrameworkServlet.doService() -> DispatherServlet.doService()

DispatcherServlet 관련 요청 특성을 표시하고 {@link #doDispatch}에 위임합니다.

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

invokeHandlerMethod에 handlerMethod가 들어감
여기서 ModelAndView을 얻을 수 있게됨

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