2. DispatcherServlet 서블릿 등록 - DispatcherServlet도 부모 클래스에서 HttpServlet을 상속 받아서 사용 - DispatcherServlet -> FrameworkServlet -> HttpServletBean -> HttpServlet - 스프링 부트는 DispatcherServlet을 자동으로 등록하면서 모든경로(urpPatterns = "/")에 대해서 매핑
3. 요청 흐름 - 서블릿이 호출되면 HttpServlet이 제공하는 service()가 호출 - 스프링 MVC는 DispatcherServlet의 부모인 FrameworkServlet에서 service()를 오버라이드 해두었다. - FrameworkServlet의 service()를 시작으로 여러 메서드가 호출 - DispatcherServlet의 doDispatch()가 호출
3. 동작 순서 - 핸들러 조회 : 핸들러 매핑을 통해 요청 URL에 매핑된 핸들러(컨트롤러)를 조회 - 핸들러 어댑터 조회 : 핸들러를 실행할 수 있는 핸들러 어댑터를 조회 - 핸들러 어댑터 실행 : 핸들러 어댑터를 실행, 파라미터로 핸들러를 받는다. - 핸들러 실행 : 핸들러 어댑터는 파라미터로 전달받은 핸들러를 실행 - ModelAndView 반환 : 핸들러 어댑터는 핸들러가 반환하는 정보를 ModelAndView 객체에 담아 반환 - viewResolver : 뷰 리졸버를 찾아 실행 - View 반환 : 뷰 리졸버는 뷰의 논리 이름을 물리 이름으로 바꾸고, 렌더링 역할을 담당하는 뷰 객체로 반환 - 뷰 렌더링 : 뷰를 통해서 뷰를 렌더링
■ 핸들러 매핑과 핸들러 어댑터
스프링 부트가 자동으로 등록한 핸들러 매핑과 핸들러 어댑터(일부분)
1) 핸들러 매핑(handlerMapping) 0 = RequestMappingHandlerMapping : 어노테이션 기반의 컨트롤러인 @RequestMapping에서 사용 1 = BeanNameUrlHandlerMapping : 스프링 빈의 이름으로 핸들러를 찾는다.
※ RequestMappingHandlerMapping은 스프링 빈 중에서 @RequestMapping 또는 @Controller 어노테이션이 클래스 레벨에 붙어 있는 경우에 매핑 정보로 인식을 한다.
2) 핸들러 어댑터(handlerAdapter) 0 = RequestMappingHandlerAdapter : 어노테이션 기반의 컨트롤러인 @RequestMapping에서 사용 1 = HttpRequestHandlerAdapter : HttpRequestHandler 처리 2 = SimpleControllerHandlerAdapter : Controller 인터페이스(어노테이션 X, 과거에 사용)
3) @RequestMapping - 가장 우선순위가 높은 핸들러 매핑과 핸들러 어댑터는 RequestMappingHandlerMapping, RequestMappingHandlerAdapter 이다. - 지금 스프링에서 주로 사용하는 @RequestMapping 어노테이션 기반의 컨트롤러를 지원하는 핸들러 매핑과 어댑터이다.
■ 뷰 리졸버
1. 스트링 부트가 자동 등록하는 뷰 리졸버 1= BeanNameViewResolver : 빈 이름으로 뷰를 찾아서 반환 2 = InternalResourceViewResolver : JSP를 처리할 수 있는 뷰를 반환