Spring MVC 구조

1. 핸들러 조회 : request객체에 담긴 클라이언트의 HTTP 요청 URL을 활용하여 요청을 처리할 핸들러를 찾음 (@RequestMapping <= RequestMappingHandlerMapping)

mappedHandler = getHandler(processedRequest);

2. 핸들러 어답터 조회 : 찾은 핸들러를 실행할 수 있는 핸들러 어답터를 찾음 (@RequestMapping <= RequestMappingHandlerAdapter), HandlerAdapter의 supports메서드 활용

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 HandleAdapter that supports this handler");
}

3. 핸들러 어답터 실행 : 찾은 핸들러 어답터를 실행함

4. 핸들러 실행 : 핸들러 어답터가 핸들러를 실행함 (request → paramMap, Model 만들어서 넘김) => 핸들러의 로직 수행

5. ModelAndView 반환 : 핸들러의 리턴 값인 논리뷰명, 로직 처리결과 Model를 가지고 ModelAndView로 변환하여 DispatherServlet에 반환

mv = ha.handle(processedRequset, response, mapperdHandler.getHandler()); //ha = HandlerAdater

6. viewResolver 호출 : 뷰 리졸버를 실행함, ModelAndView에 있던 논리뷰명을 가져와서 물리뷰명을 구함, View객체를 반환함 (InternalResourceViewResolver(JSP처리) <= application.properties : spring.mvc.views.prefix/suffix)

7. View 반환 : vireResolver는 물리뷰명을 활용하여 렌더링을 하는 View객체를 반환

view = resolverViewName(viewName, mv.getModelInternal(), locale, request);

8. 뷰 렌더링 : View를 활용하여 렌더링

view.render(mv.getModelInternal(), request, response)

 

=> SprignMVC의 모든 동작은 DispatcherServlet에서 실행됨

- DispatcherServlet은 Front-Controller역할을 수행함

- DispatcherServlet은 HttpServlet을 상속받아서 Servlet으로 등록됨

 

 

 

HandlerAdapter 인터페이스

public interface HandlerAdapter {

	boolean supports(Object handler);
	
	@Nullable
	ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception;
	
	......

}
@Override
public final boolean supports(Object handler) {
	return (handler instanceof HandlerMethod && supportsInternal((HandlerMethod) handler));
}
@Override
@Nullable
public final ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
	return handleInternal(request, response, (HandlerMethod) handler);
}