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);
}
'WEB > spring' 카테고리의 다른 글
[Spring] HTTP요청 처리, @RequestParam, @ModelAttribute, @RequestBody, @ResponseBody (0) | 2021.05.30 |
---|---|
[Spring] 스프링 부트 로깅, slf4j, logback (0) | 2021.05.30 |
[Spring] 스프링 빈 생명주기와 콜백 메서드, @PostConstruct, @PreDestroy (0) | 2021.04.18 |
[Spring] 자동 빈 등록(@Component) vs 수동 빈 등록(@Bean) (0) | 2021.04.18 |
[Spring] @AutoWired 조회 빈 2개 이상, @Qualifier, @Primary (0) | 2021.04.18 |