여기서 말하는 프론트 컨트롤러 패턴은 서블릿 하나로 클라이언트의 모든 HTTP 요청을 받는다는 의미이다. 입구가 하나라는 것이다. 프론트 컨트롤러가 요청에 맞는 컨트롤러를 찾아서 호출한다.
DispathcerServlet
도 부모클래에서 HttpServlet
을 상속 받아서 사용하고, 서블릿으로 동작한다. 스프링부트는 DispathcerServlet을 자동으로 빈으로 등록하며 모든경로를 urlPatterns="/"
에 대해서 매핑한다.(여기서 우리가 만든 서블릿이 있다면 자세한 경로가 우선순위가 높다.
DispatcherServlet -> FrameworkServlet -> HttpServletBean -> HttpServlet
요청 흐름
DispatcherServlet이 호출되면 HttpServlet
이 제공하는 service()
가 호출된다. 스프링MVC는 이때 DispathcerServlet
의 부모인 FrameworkServlet
에서 service()
를 오버라이드 했으며
FrameworkServlet의 service()
FrameworkServlet
의 service()
를 시작으로 여러 메소드가 호출되면서 DispathcerServlet.doDispatch()
가 호출된다.
DispatcherServlet.doDispatch()
핵심은 다음과 같은 순으로 실행된다.
1. mappedHandler = getHandler(processedRequest);
에서 핸들러(컨트롤러) 조회
2.HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
핸들러를 처리할 수 있는 어뎁터를 조회
3.mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
핸들러 어뎁터를 통해 핸들러를 실행하고 ModelandView를 반환한다.
4.최종적으로 processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
가 실행된다.
5.processDispatchRequest
에 있는 render()
가 호출된다.
6.view = resolveViewName(viewName, mv.getModelInternal(), locale, request);
뷰의 논리이름을 가지고 뷰를 찾고 View
를 반환한다.
7.view.render
뷰를 렌더링한다.
동작 순서
1. 핸들러 조회 : 핸들러 매핑을 통해 요청된 URL에 매핑된 핸들러(컨트롤러)를 조회한다.
2 핸들러 어뎁터 조회 : 핸들러를 실행할 수 있는 어뎁터를 조회
3.핸들러 어뎁터 실행: 핸들러 어뎁터를 실행
4.핸들러 실행: 핸들러 어뎁터가 실제 핸들러를 호출한다.
5.ModelAndView 반환: 핸들러 어뎁터는 핸들러가 반환하는 정보를 ModelAndView로 변환해서 반환한다.
6.viewResolver 호출: 뷰 리졸버는 뷰의 논리 이름을 물리 이름으로 바꾸고,랜더링 역할을 하는 View객체를 반환한다.
7.View 반환
8.View.render : 뷰를 통해서 뷰를 랜더링한다.