-
frontController의 역할을 하는 것은 스프링에서는 DispatcherServlet이라고 이름을 잡는다.
DispatcherServlet
스프링 MVC도 frontController패턴으로 구현되어 있다.
DispacherServlet 서블릿 등록 DispacherServlet 도 부모 클래스에서 HttpServlet 을 상속 받아서 사용하고, 서블릿으로 동작한다.
DispacherServlet은 @WebServlet과 같은 어노테이션이 없기 때문에 누군가가 서블릿 등록을 해야한다. 스프링 부트가 내장 톰캣을 띄울때 DispacherServlet을 등록하면서 내장톰캣을 띄운다. 이때 모든 경로에 대해서 매핑한다.
urlPatterns = "/"
흐름
- 서블릿이 호출되면 HttpServlet 이 제공하는 serivce() 가 호출된다.
- 스프링 MVC는 DispatcherServlet 의 부모인 FrameworkServlet 에서 service() 를 오버라이드 해두었다.
- FrameworkServlet.service() 를 시작으로 여러 메서드가 호출되면서
- DispacherServlet.doDispatch() 가 호출된다.
protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception { HttpServletRequest processedRequest = request; HandlerExecutionChain mappedHandler = null; boolean multipartRequestParsed = false; WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request); try { ModelAndView mv = null; Exception dispatchException = null; try { processedRequest = checkMultipart(request); multipartRequestParsed = (processedRequest != request); // Determine handler for the current request. mappedHandler = getHandler(processedRequest); if (mappedHandler == null) { noHandlerFound(processedRequest, response); return; } ...
dispatch 뒤에 핸들러를 찾거나 호출해주는 역할을 모두 한다.
getHandler를 통하여 맞는 핸들러를 꺼내고 이후에 getHanlderAdapter로 어댑터를 찾는다.
핸들러 어댑터로 실제 호출을 한 후 , ModelAndView를 받아서 적용한다.
스프링 MVC의 큰 장점은 DispathcerServlet 코드의 변경없이 원하는 기능을 변경하거나 확장할 수 있다. 인터페이스만 구현해서 DispatcherServlet에 등록하면 원하는 컨트롤러를 만들 수 있다.
728x90'스프링' 카테고리의 다른 글
스프링 MVC의 사용 (0) 2022.12.26 핸들러 매핑, 핸들러 어댑터, 뷰 리졸버 (0) 2022.12.26 MVC 만들어보기 (0) 2022.12.25 MVC 이해해보자 (0) 2022.12.24 로깅 (0) 2022.12.23