org.springframework.web.servlet.DispatcherServlet
스프링 MVC ➡️ 프론트 컨트롤러 패턴으로 구현
스프링 MVC의 프론트 컨트롤러 ➡️ DispatcherServlet
SpringBoot는 DispatcherServlet을 서블릿으로 자동 등록 + 모든 경로에 대해서 매핑
- 요청 흐름
DispatcherServlet도 HttpServlet을 상속 받아서 사용하고 서블릿으로 동작함
DispatcherServlet의 부모는 FrameworkServlet, FrameworkServlet에서 service()를 오버라이드 해둠
서블릿이 호출되면 HttpServlet이 제공하는 service()가 호출됨
FrameworkServlet.service()를 시작으로 여러 메서드가 호출되면서 DispatcherServlet.doDispatch()가 호출됨
DispatcherServlet.doDispatch(HttpServletRequest request, HttpServletResponse response)
{
1. 핸들러 조회 : 핸들러 매핑을 통해 요청 URL에 매핑된 핸들러를 조회
2. 핸들러 어댑터 조회 : 핸들러를 실행할 수 있는 핸들러 어댑터 조회
3. 핸들러 어댑터 실행
4. (핸들러 어댑터를 통해)핸들러 실행 : 핸들러 어댑터가 실제 핸들러 실행
5. ModelAndView 반환 : 핸들러 어댑터는 핸들러가 반환하는 정보를 ModelAndView로 변환해서 반환
6. viewResolver를 통해 뷰 찾음
7. View 반환 : viewResolver는 뷰의 논리 이름을 물리 이름으로 바꾸고, 렌더링 역할을 담당하는 뷰 객체를 반환
8. View 렌더링 : 뷰를 통해 뷰를 렌더링
}
특정 컨트롤러가 호출되려면 HandlerMapping과 HandlerAdapter가 필요
HandlerMapping
0순위 : RequestMappingHandlerMapping
-> 어노테이션 기반의 컨트롤러인 @RequestMapping에서 사용
1순위 : BeanNameUrlHandlerMapping
-> 스프링 빈의 이름으로 핸들러를 찾음
HandlerAdapter
0순위 : RequestMappingHandlerAdapter
-> 어노테이션 기반의 컨트롤러인 @RequestMapping에서 사용
1순위 : HttpRequestHandlerAdapter
-> HttpRequestHandler 처리
2순위 : SimpleControllerHandlerAdapter
-> Controller 인터페이스 처리(@Controller X)
View를 어떤 것을 사용할지 설정하는 역할을 하는 것
SpringBoot는 InternalResourceViewResolver라는 View Resolver를 자동으로 등록
application.properties에 등록된 spring.mvc.view.prfix, spring.mvc.view.suffix 설정 정보를 사용해서 등록
1순위 : BeanNameViewResolver
->Spring Bean 이름으로 View를 찾아서 반환
2순위 : InternalResourceViewResolver
-> JSP를 처리할 수 있는 View 반환
인프런 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 (김영한) 참조