1. 전체 구조
1편 마지막에 소개했던 FrontController → DispatcherServlet으로 변경
스프링 MVC도 프론트 컨트롤러 패턴으로 구현되어 있다. FrontController가 바로 DispatcherServlet이다. DispatcherServlet도 서블릿의 일종으로, HttpServlet을 상속받는다.
DispatcherServlet.doDispatch()
- (정의) HTTP프로토콜로 들어오는 모든 요청을 가장 먼저 받아 적합한 컨트롤러에 위임하는 프론트 컨트롤러
- 서블릿이 호출되면,
HttpServlet의 service() 메서드 호출. 스프링에서는 이 service() 메서드를 FrameworkServlet에 오버라이드 해둠(FrameworkServlet은 DispatcherServlet과 HttpServlet 사이에 있는 인터페이스)
그러면 이 FrameworkServlet.service()를 시작으로 여러 메서드가 실행되면서 DispactherServlet.doDispatch()가 실행되는데, 이 메서드가 핵심!!
이 메서드가 MVC패턴에서 필요한 모든 명령을 다 수행한다.
1) 핸들러 조회
- 핸들러 매핑을 통해 요청 URL에 매핑된 핸들러를 조회한다.
2) 핸들러 어댑터 조회
3~5) 핸들러 어댑터 실행 , 핸들러 실행, ModelAndView 반환
6~7) ViewReslover를 통해 View 찾기 , View 반환
8) 뷰 랜더링
1-1. 핸들러 매핑과 핸들러 어댑터
특정 컨트롤러(핸들러)가 호출되려면 아래와 같은 과정을 거친다.
HandlerMapping
- 핸들러 매핑을 통해 호출하고자하는 컨트롤러를 찾을 수 있어야한다.
HandlerAdaptor
핸들러 매핑을 통해 찾은 컨트롤러를 실행할 수 있는 핸들러 어댑터가 있어야한다.
핸들러의 실제 로직을 수행하는 역할
단순한 과정이지만, 이과정에서 우선순위가 있다. 어떤 핸들러냐, 어떤 어댑터냐에 따라 호출되는 우선순위가 다르다. 0순위에 해당하는게 없으면 1순위, 1순위에 해당하는게 없으면 2순위,,,이런 식으로 순서대로 찾는다.
- BeanNameUrlHandlerMapping 을 사용하려면, @Component(””)에 작성할 url을 빈에 등록된 클래스 이름과 동일하게 해줘야한다.
1-2.View Reslover
- (정의) 반환된 View 이름을 실제 View 객체로 변환하는 역할
- 이렇게 Thymeleaf가 view 파일을 찾아주기 때문에, 타임리프를 의존성추가하지 않은 상태에서 뷰를 반환하려면 에러가 발생하는 것