Dispatcher Servlet
- 모든 Controller의 앞에서 프론트엔드에게 온 요청을 분석하여
올바른 Controller 에게 전달해주는 역할을 한다. ( FrontController )
- HttpServlet을 상속받는다.
DispatcherServlet
→ FrameworkServlet
→ HttpServletBean
→ HttpServlet
- 스프링 부트는 Dispatcher Servlet을 자동으로 등록하고, 모든 경로(
urlPatterns=”/”
)에 대해서 매핑한다.
Dispatcher Servlet 구조
- Handler 조회
- Handler Adapter 조회
- Handler Adapter에서 조회된 Handler( Controller )의
handler()
호출
- ModelAndView 반환
- viewResolver 호출 후 View 객체 반환
- render(model) 호출하여 그에 맞는 View를 클라이언트에게 응답
HttpMessageConverter
Argument Resolver
public interface HandlerMethodArgumentResolver {
boolean supportsParameter(MethodParameter parameter);
@Nullable
Object resolveArgument(
MethodParameter parameter,
@Nullable ModelAndViewContainer mavContainer,
NativeWebRequest webRequest,
@Nullable WebDataBinderFactory binderFactory
) throws Exception;
}
- 핸들러( 컨트롤러 )에서 필요한 인자를 동적으로 생성
- 스프링은 30개가 넘는
ArgumentResolver
를 기본으로 제공한다. (링크)
Return Value Handler
- 컨트롤러의 반환 값을 변환
- 스프링은 10개가 넘는 ReturnValueHandler를 지원한다.
- ModelAndView, ResponseBody, HttpEntity, String, …
HttpMessageConverter
- 요청의 경우
- 다양한 인자를 처리해주는 ArgumentResolver가 있다.
- 이 ArgumentResolver들이
HttpMessageConverter
를 사용해서 필요한 객체를 생성하는 것이다.
- 응답의 경우
@ResponseBody
와 HttpEntity
를 처리하는 ReturnValueHandler가 있다.
- 그리고 여기에서
HttpMessageConverter
를 호출해서 응답 결과를 만든다.
- 스프링 MVC
@RequestBody
, @ResponseBody
=> RequestResponseBodyMethodProcesser
HttpEntity
=> HttpEntityMethodProcesser