FontController 패턴 특징
서블릿(Servlet)은 클라이언트의 요청을 처리하고 결과를 반환하는 자바 웹 프로그래밍 기술이다.
일반적으로 서블릿은 서블릿 컨테이너에서 관리한다. 서블릿 컨테이너는 서블릿 인스턴스를 생성하고 관리하는 역할을 수행하는 주체로서 톰캣은 WAS의 역할과 서블릿 컨테이너의 역할을 수행하는 대표적인 컨테이너이다. 서블릿 컨테이너의 특징은 다음과 같다
스프링에서는 DispatcherServlet 이 서블릿의 역할을 수행한다. (모든 url에 대해)
일반적으로 스프링은 톰캣을 사용한다. 그렇기 때문에 서블릿 컨테이너와 DispatcherServlet은 자동 설정된 web, xml의 설정값을 공유한다.
스프링 웹 MVC의 DispatcherServlet이 FrontController 패턴으로 구현되어 있다.
위 사진의 동작을 알아보자
ReuqestMappingHandlerMapping
어노테이션 기반 컨트롤러(@RequestMapping
)BeanNameUrlHandlerMapping
스프링 빈의 이름으로 핸들러를 찾는다.RequestMappingHandlerAdapter
애노테이션 기반의 컨트롤러인 @RequestMapping에서 사용HttpRequestHandlerAdapter
HttpRequestHandler 처리private final Map<String, Object> handlerMappingMap = Map.of(
"/members", new MemberListController(),
"/member/1", new MemberOneController()
)
private void initHandlerAdapters() {
handlerAdapters.add(new UserControllerHandlerAdapter());
handlerAdapters.add(new MemberControllerHandlerAdapter());
}
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Object handler = getHandler(request);
if (handler == null) {
response.setStatus(HttpServletResponse.SC_NOT_FOUND);
return;
}
MyHandlerAdapter adapter = getAdapter(handler);
ModelView mv = adapter.handle(request, response, handler);
MyView view = viewResolver(mv.getViewName());
view.render(mv.getModel(), request, response);
}
private Object getHandler(HttpServletRequest request) {
String requestURI = request.getRequestURI();
return handlerMappingMap.get(requestURI);
}
private MyHandlerAdapter getAdapter(Object handler) {
for (MyHandlerAdapter adapter : handlerAdapters) {
if (adapter.supports(handler)) {
return adapter;
}
}
throw new IllegalArgumentException("handler adapter를 찾을 수 없습니다.");
}
private static MyView viewResolver(String viewName) {
return new MyView("/WEB-INF/views/" + viewName + ".jsp");
}