DispatcherServlet
HandlerMapping
HandlerAdapter
ViewResolver
View
컨트롤러 : 클라이언트의 요청을 실제로 처리한다.
HandlerMapping : DispatcherServlet이 요청을 처리할 컨트롤러의 검색을 위임한다.
스프링 MVC는 웹 요청을 처리하는 객체를 핸들러라고 표현하고 @Controller 적용 객체나 Controller 인터페이스를 구현한 객체 모두는 스프링 MVc입장에서 핸들러 객체가 된다.
따라서 특정 요청 경로를 처리해주는 핸들러를 찾아주는 객체를 HandlerMapping 이라고 부른다.
HandlerApater : DispatcherServlet은 핸들러 객체의 타입과는 상관없이 결과를 ModelAndView타입으로 받기만 하면된다. 핸들러에 따라 리턴타입은 다를 수가 있다. 이 때 HandlerAdapter가 핸들러의 결과를 ModelAndView타입으로 변환 처리해준다.
DispatcherServlet은 HandlerAdapter 빈에게 요청 처리를 위임하면, HandlerAdapter가 알맞은 메서드를 호출해서 요청을 처리하고 결과를 DispatcherServlet에 반환한다.
web.xml 파일에서
DispatcherServlet는 contextConfiguration 초기화 파라미터에 전달받은 스프링 설정 클래스 목록으로 스프링 컨테이너를 생성한다.
이 컨테이너 내부에 HandlerMapping, HandlerAdapter,컨트롤러 빈, ViewResolver의 빈에 대한 정의가 포함되어야한다.
위 설정은 다양한 스프링 빈을 추가한다.
그 중
두번째 RequestMappingHandlerAdapter 클래스가 Model 객체를 생성해서 인자로 전달해주는 것이다.
만약 컨트롤러 메서드 반환 값이 String이면 해당 값을 뷰 이름으로 갖는 ModelAndView객체를 생성해서 전달한다. 이 때 Model 객체 내의 값도 ModelAndView에 함께 전달된다.
@EnableWebMvc 사용하면 WebMvcConfigurer 타입의 빈을 이용해서 MVC 설정을 추가 생성한다.
매핑 경로가 '/'인 경우, .jsp로 끝나느 요청을 제외한 모든 요청을 DispatcherServlet이 처리한다.
이때 @EnableWebMvc애노테이션이 등록하는 HandlerMapping은 @Controller 애노테이션을 적용한 빈 객체가 처리할 수 있는 요청 경로만 대응할 수 있다.
따라서 @Controller에 대응하지 않는 요청에 대응하기 위한 컨트롤러 객체를 직접 구현할 수도 있지만 WebMvcConfigurer 인터페이스의 configureDefaultServletHandling() 메서드를 이용하면 편리하다
DefaultServletHandlerConfigurer.enable()메서드는 두가지 빈 객체를 구체한다.
DefaultServletHttpRequestHandler:
클라이언트의 모든 요청을 WAS가 제공하는 디폴트 서블릿에 전달
SimpleUrlHandlerMapping:
모든 경로를 DefaultServletHttp RequestHandler를 이용해서 처리하도록 한다.