스프링 MVC에서의 프론트 컨트롤러를 DispatcherServlet이라고 부른다.
프론트 컨트롤러의 역할을 다시 한번 생각해보면 이랬다.
DispatcherServlet의 상속 관계를 보면 HttpServlet을 상속받고 있음을 확인할 수 있다.
스프링부트는 DispatcherServlet을 서블릿으로 자동으로 등록하면서 모든 경로에 대해서(urlPatterns="/")맵핑한다. 왜냐하면 DispatcherServlet에 WebServlet 애노테이션이 안보인다!
따라서, DispatcherServlet의 호출 흐름은 아래와 같다.
1) 서블릿이 호출되면 HttpServlet이 제공하는 service()가 호출된다.
2) DispatcherServlet은 service를 오버라이드하고 있다.
3) 결과적으로 doDispatcher에서 컨트롤러(핸들러)조회하고 핸들러 어댑터 조회하고, 어댑터 실행해서 modelandView를 반환한다.
참고) 아래와 같이 코드를 작성하면 스프링빈의 이름이 Component의 value값이 된다.
@Component("/springmvc/old-controller")
public class OldController implements Controller {
스프링 MVC에서는 아래와 같이 HandlerMapping이 수행된다.
0(우선순위) = RequestMappingHandlerMapping : 애노테이션 기반의 컨트롤러인 @RequestMapping에서 사용하는 컨트롤러를 맵핑함
1(우선순위) = BeanNameUrlHandlerMapping : 스프링 빈의 이름으로 핸들러(컨트롤러)를 찾아 맵핑함.
HandlerAdapter는 아래와 같이 조회한다.
0 = RequestMappingHandlerAdapter : 애노테이션 기반의 컨트롤러인 @RequestMapping에서 사용하는 컨트롤러를 실행하는 HandlerAdapter 조회
1 = HttpRequestHandlerAdapter : HttpRequestHandler를 처리하는 HandlerAdapter 조회
2 = simpleControllerHandlerAdapter : Controller(애노테이션X, 과거에 사용하던것) 인터페이스를 처리하는 HandlerAdapter를 조회
따라서 현재는 RequestMapping 애노테이션 기반으로 동작하는 핸들러와 핸들러어댑터의 우선순위가 가장 높다.
스프링부트는 InternalREsourceViewResolver라는 뷰 리졸버를 자동으로 등록해준다고 한다.
까먹었을 수 도 있지만, 뷰 리졸버는 논리적 뷰의 경로로 물리적인 뷰로 반환해주는 역할하는 오브젝트(객체가 될수도있고, 함수가 될수도있고)이다.
여기서 말하는 물리적인 뷰는 논리적 주소를 물리적 주소로 변환해 갖고 있는 뷰 객체이다.
뷰 객체는 render 함수를 실행해서 실제 jsp와 같은 파일로 제어권을 넘긴다.
이떄, application.properties 파일에 설정 정보를 사용해서 등록한다고 한다.
// application.properties
spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp
일반적으로 스프링부트는 자동으로 뷰 리졸버를 등록해주는데 아래와 같다.
1 = BeanNameViewResolver : 빈 이름으로 뷰를 찾아서 반환한다.
2 = InternalResourceViewResolver : JSP를 처리할 수 있는 뷰를 반환한다.
Thymeleaf 뷰 템플릿을 사용하면 ThmeleafViewResolver를 등록하지만 라이브러리를 추가하면 스프링부트가 자동으로 등록해준다.(autoconfiguration이겠지?)
해당 포스팅은 아래의 강의를 학습 한 후 정리한 내용입니다.
김영한님의 스프링MVC