Spring DispatcherServlet
DispatcherServlet은 Spring MVC
프레임워크에서 Front Controller
역할을 담당한다.
MVC(Model-View-Controller) 패턴
MVC 패턴은 비즈니스 로직과 프레젠테이션 로직이 분리되어 코드의 가독성이 향상되고 유지보수가 용이하다.
MVC로 시스템을 개발하다보면 안전성, 유지보수성을 향상시키기 위해서 공통으로 수행되는 로직을 어느 한 곳에 몰아둘 필요가 생긴다. 중복 코드를 피하기 위함이다.
Front Controller 패턴
- 웹 사이트의 모든 요청을 처리하는 컨트롤러(A controller that handles all requests for a Web site)
- 인증, 보안, 국제화, 뷰 제공 등의
공통 작업
을 수행
Front Controller 구조
Front Controller 구현 예제
After Spring MVC
DispatcherServlet
Spring MVC Framework의 중심이 되는 Servlet
Controller로 향하는 모든 웹 요청의 진입점
Front Controller 디자인 패턴의 표현
Request processing workflow of DispatcherServlet
Spring MVC Components
- HandlerMapping
- HandlerAdapter
- HandlerExceptionResolver
- ViewResolver
- LocaleResolver
- ...
HandlerMapping
서버로 들어온 요청을 어느 핸들러로 전달할 지 결정하는 역할
// MemberListController.class이 컨트롤러에 클라이언트 요청을 Mapping 한다면?
- BeanNameUrlHandlerMapping
- Bean Name + Url + HandlerMapping<!-- servlet-context.xml -->
- Bean Name + Url + HandlerMapping
SimpleUrlHandlerMapping
Simple Url + HandlerMapping
<!-- servlet-context.xml -->memberListController
- RequestMappingHandlerMapping
- @RequestMapping + HandlerMapping// MemberListController.class@Controller
- @RequestMapping + HandlerMapping
- BeanNameUrlHandlerMapping
HandlerAdapter
DispatcherServlet과 실제 핸들러 구현체 사이를 이어주는 Object Adapter 역할. DispatcherServlet은 실제 핸들러의 인터페이스를 몰라 핸들러로 요청을 전달하려면 HandlerAdapter를 통해 전달해야 한다.
- HttpRequestHandlerAdapter
- HttpRequestHandler + HandlerAdapter
- SimpleControllerHandlerAdapter
- Simple Controller + HandlerAdapter
- AnnotationMethodHandlerAdapter
- (deprecated)
- RequestMappingHandlerAdapter
- @RequestMapping + HandlerAdapter
- HttpRequestHandlerAdapter
Spring MVC에서의 Handler란
클라이언트의 요청을 처리(핸들링)하는 주체. 스프링에서는 Controller나 HttpRequestHandler 등을 Handler로 간주한다.
- Controller는 웹 리퀘스트를 처리하고 뷰를 반환하는 핸들러. 도움말 링크
HandlerExceptionResolver
- 요청 처리 과정에서 발생하는 예외를 제어하고자 할 때 사용 DefaultHandlerExceptionResolver
ViewResolver
- 문자열 기반의 view 이름을 토대로 실제 View 구현체를 결정하는 역할
- InternalResourceViewResolver
- VelocityViewResolver
- FreemarkerViewResolver
LocaleResolver / LocaleContextResolver
- view 렌더링 시 국제화 지원을 위한 Locale과 Timezone을 결정하는 역할
- AcceptHeaderLocaleResolver
- CookieLocaleResolver
- SessionLocaleResolver
MVC 어노테이션
<mvc:annotation-driven /> 또는 @EnableWebMvc
- HandlerMapping - RequestMappingHandlerMapping
- HandlerAdapter - RequestMappingHandlerAdapter
DispatcherServlet의 요청 처리 프로세스
DispatcherServlet Class Hierarchy
- HttpServletBean : HttpServlet을 Spring이 관리하는 Bean으로 등록
- FrameworkServlet : ApplicationContext 초기화, HTTP 요청을 모음.
- DispatcherServlet : HandlerExecutionChain 실행, 뷰 렌더링, 요청 처리.
BeanFactory / ApplicationContext / WebApplicationContext
- ApplicationContext = BeanFactory + (..) : cf) BeanFactory vs ApplicationContext
- WebApplicationContext = ApplicationContext + ServletContext
DispatcherServlet의 요청 처리
Handler Execution Chain
- Handler Execution Chain = Controller + Interceptors
1. 요청 선처리 작업
- FrameworkServlet.service() -> HttpServlet.doGet()/doPost()/... -> FrameworkServlet.processRequest()
- FrameworkServlet.processRequest()
- DispatcherSevlet.doService()
2. HandlerExecutionChain 결정 및 실행
- DispatcherServlet.doDispatch()
3. 뷰 렌더링 / 예외 처리
- DispatcherServlet.processDispatchResult()
- DispatcherServlet.processHandlerException()
- DispatcherServlet.render()
4. 요청 처리 종료
- DispatcherServlet.processRequest().finally https://github.com/spring-projects/spring-framework/blob/master/spring-webmvc/src/main/java/org/springframework/web/servlet/FrameworkServlet.java#L979
DispatcherServlet 팁
1. DispatcherServlet 초기화에 이용하는 Default 전략
2. jackson2 message converter 라이브러리를 pom.xml에 추가만 하면 따로 설정을 잡지 않아도 스프링 MVC에서 자동으로 메시지 변환에 이용.
References
- MVC 패턴의 이해 : http://wiki.gurubee.net/pages/viewpage.action?pageId=26740980
- Front controller : https://en.wikipedia.org/wiki/Front_controller
- Spring 요청 처리 과정 정리 : http://duco777.blog.me/220605479481
- NHN Entertainment 신동민 수석님 강의 - DispatcherServlet
'Spring' 카테고리의 다른 글
[Spring, JPA] junit test 돌릴 때 hibernate query가 노출되지 않는 경우 (0) | 2019.11.06 |
---|---|
[Spring] ModelAndView에서 Json 리턴 (0) | 2017.08.08 |
[Spring Security] 기본 응답 헤더 (0) | 2017.04.04 |
[Spring] AOP CGLIB 프록시 강제 적용 (0) | 2017.03.14 |
스프링에서 한글 처리하기 (0) | 2016.09.26 |