Spring DispatcherServlet
스프링 프레임워크를 쓰다보면 DispatcherServlet(이하 "디스패처 서블릿")이라는 단어가 자주 보입니다. 이게 뭔데 자주 등장하는걸까요? 한 번 알아봅시다.
DispatcherServlet
디스패처 서블릿은 모든 HTTP Request/Response를 관리하는 서블릿입니다. 간단하게 다이어그램을 그려보면 아래와 같습니다.
╋───────╋ ┃HTTP Request ┃ ╋───────╋ ┃(1) ▼ ╋───╋ (2) ╋────────╋ ┃ D ┃──▶┃HandlerMapping ┃ ┃ i ┃◀──┃ ┃ ┃ s ┃ (3) ╋────────╋ ┃ p ┃ ┃ a ┃ (4) ╋────────╋ ┃ t ┃──▶┃Controller ┃ ┃ c ┃◀──┃ ┃ ┃ h ┃ (5) ╋────────╋ ┃ e ┃ ┃ r ┃ (6) ╋────────╋ ┃ S ┃──▶┃ViewResolver ┃ ┃ e ┃◀──┃ ┃ ┃ r ┃ (7) ╋────────╋ ┃ v ┃ ┃ l ┃ (8) ╋────────╋ ┃ e ┃──▶┃View ┃ ┃ t ┃◀──┃ ┃ ╋───╋ (9) ╋────────╋ ┃(10) ▼ ╋───────╋ ┃HTTP Response ┃ ╋───────╋
- (1) 클라이언트로부터 HTTP 요청을 받습니다.
- (2) 디스패처 서블릿은 Controller를 호출하기 위해 Handler Mapping을 참조합니다.
- (3) HandlerMapping에서 요청에 해당하는 Controller 정보를 반환합니다.
- (4) 디스패처 서블릿은 Handler Mapping에서 반환 받은 Controller 정보로 실제 Controller를 호출합니다.
- (5) Controller는 @RequestMapping과 GET/POST 메소드 등에 기반해서 관련 Model을 호출하고 비즈니스 로직을 처리합니다. 그리고 디스패처 서블릿한테 Model Data(또는 "ModelAndView")와 View Name을 전달합니다.
- (6) 디스패처 서블릿은 Controller에서 받은 View Name을 인자로 ViewResolver에게 넘겨줍니다.
- (7) ViewResolver는 전달 받은 View Name에 맞는 참조할 View 정보를 디스패처 서블릿에 반환합니다.
- (8) 디스패처 서블릿은 View Resolver에게 전달 받은 View 정보를 참조로 해서 View에 Model Data를 보냅니다.
- (9) View는 전달받은 Model Data를 적절하게 렌더링합니다. 그리고 완성 결과를 디스패처 서블릿에게 반환합니다.
- (10) 디스패처 서블릿은 전달받은 최종 View를 클라이언트에 응답(Response)으로 돌려줍니다.
Analyze DispatcherServlet
전체적인 부분을 알아봤으니 이번엔 개별로 하나씩 차근차근 뜯어서 확인해봅시다.
HandlerMapping
Handler Mapping(이하 "핸들러 매핑")은 디스패처 서블릿이 클라이언트에서 요청이 왔을 때 처리할 Controller를 참조할 용도로 사용합니다. 이 핸들러 매핑은 종류가 몇가지 있는데 간단하게 알아봅시다.
- SimpleUrlHandlerMapping
URL을 기반으로 합니다. "mappings"이라는 프로퍼티 데이터에 따라서 매핑합니다. - BeanNameUrlHandlerMapping
URL의 슬래시("/")부터 시작하는 이름과 동일한 이름을 가진 Bean을 매핑합니다. - DefaultAnnotationHandlerMapping
@RequestMapping 어노테이션을 통한 HTTP Path 표현식에 기반합니다.
더 많은 정보를 보시려면 HandlerMapping을 참조하세요.
ViewResovler
ViewResolver(이하 "뷰 리졸버")는 디스패처 서블릿이 실제 Model data를 렌더링할 View를 참조할 때 사용합니다. 간단하게 몇가지만 알아봅시다.
- BeanNameViewResolver
현재 어플리케이션 컨텍스트 안의 Bean 이름과 동일한 View name을 반환해 줍니다. - UrlBasedViewResolver
WEB-INF에 위치한 JSP 파일을 반환해줍니다. 해당 파일의 경로는 접두사(ex. "/WEB-INF/jsp/")와 접미사(ex. ".jsp")를 붙여 결정합니다. - InternalResourceViewResolver
UrlBasedViewResolver 인터페이스를 구현한 하위 인터페이스입니다. JstlView 같은 서브 클래스와 InternalResourceView(Servlet, JSP)를 지원합니다.
특이한 것은 UrlBasedViewResolver, InternalResourceViewResolver 같은 경우 뷰 리졸버가 여러개일 때는 제일 마지막에 위치해야 합니다. 두 리졸버는 마지막에 다른 리졸버가 처리할 수 있도록 데이터를 넘기지 않기 때문이죠. 마지막에 넣어줍시다.
순수하게 JSP만을 사용한다면 UrlBasedViewResolver을 사용해도 되지만 JSTL을 사용하고자 한다면 InternalResourceViewResolver을 사용하면 됩니다. :D
더 많은 정보를 보시려면 ViewResolver를 참조하세요.