spring
dispatcher-servlet
#
Find similar titles
- 최초 작성자
- 최근 업데이트
Structured data
- Category
- Programming
Table of Contents
Spring DispatcherServlet #
DispatcherServlet은 서버로 들어오는 모든 요청을 받아서 처리하고 공통처리 작업을 처리한 후, 이외의 작업은 적절한 세부 Controller에게, 예외 발생 시 일괄적인 방식으로 에러를 처리해주는 프론트 컨트롤러이다.
Spring DispatcherServlet 장점 #
Spring MVC는 DispatcherServlet을 사용함에 따라 web.xml의 역할을 축소했다. 기존에는 Servlet에 대해 URL 매핑을 활용하기 위해서 web.xml에 전부 등록해주어야 했지만, DispatcherServlet이 해당 애플리케이션으로 들어오는 모든 요청을 핸들링해주어 작업을 상당히 편리하게 할 수 있게 되었다.
web.xml에 DispatcherServlet 설정하기 #
기본설정 #
<web-app>
<!-- easycompnay라는 웹 애플리케이션의 웹 요청을 DispatcherServlet이 처리한다.-->
<servlet>
<servlet-name>easycompany</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
</web-app>
servlet-name은 DispatcherServlet이 기본으로 참조할 빈 설정 파일 이름의 prefix가 되는데, (servlet-name)-servlet.xml 같은 형태이다. 위 예제와 같이 web.xml을 작성했다면 DispatcherServlet은 기본으로 /WEB-INF/easycompany-servlet.xml을 찾게 된다.
contextConfigLocation을 이용한 설정 #
빈 설정 파일을 하나 이상 또는 파일 경로를 직접 설정하고 싶다면 contextConfigLocation 라는 초기화 파라미터값에 빈 설정 파일 경로를 설정해준다.
...
<servlet>
<servlet-name>easycompany</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/config/easycompany-web.xml
</param-value>
</init-param>
</servlet>
ContextLoaderListener를 이용한 설정 #
공통빈 설정 정보는 ApplicationContext에, web layer의 빈들은 WebApplicationContext에 저장하는 아래와 같은 방법이 있다.
....
<!-- ApplicationContext 빈 설정 파일-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
<!--빈 설정 파일들간에 구분은 줄바꿈(\n), 컴마(,), 세미콜론(;) 등으로 한다.-->
/WEB-INF/config/easycompany-service.xml,/WEB-INF/config/easycompany-dao.xml
</param-value>
</context-param>
<!-- 웹 애플리케이션이 시작되는 시점에 ApplicationContext을 로딩하며, 로딩된 빈 정보는 모든 WebApplicationContext들이 참조할 수 있다.-->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>employee</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/config/easycompany-servlet.xml
</param-value>
</init-param>
</servlet>
<servlet>
<servlet-name>webservice</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/config/easycompany-webservice.xml
</param-value>
</init-param>
</servlet>
....
ApplicationContext과 WebApplicationContext과의 관계를 그림으로 보면 아래와 같다.
Spring DispatcherServlet 동작 방식 #
DispatcherServlet이 요청과 응답을 어떤 흐름으로 하는지 그림과 같이 살펴보자.
- 클라이언트의 URL 요청을 DispatcherServlet이 설정해둔 URL 패턴에 따라 우선하여 가로챈다.
- 가로챈 요청을 HandlerMapping을 통하여 요청된 작업이 가능한 Controller를 검색.
- 매핑된 컨트롤러에 처리요청.
- Controller는 해당 요청을 처리한 응답받을 View의 이름을 반환한다. (다른 핸들러 매핑 전략을 이용한다면 응답 과정이 다를 수 있음) 그때 이 이름을 ViewResolver 가 먼저 받아 해당하는 View가 존재하는지 검색.
- Controller에서 보낸 View의 이름을 검색
- ViewResolver에서 결과를 View에 송신
- 이를 DispatcherServlet에 보낸후
- 처리된 결과를 클라이언트에 전송
이러한 전략에서 직접 구현해야 할 부분은 Controller와 View입니다. 나머지 HandlerMapping 이나 ViewResolver는 추후 필요에 따라 등록시키기만 하면 된다.
이때 DispatcherServlet이 모든 요청을 처리하다 보니 이미지나 HTML,js,css 등의 파일을 로딩하는 요청마저도 가로채고 전부 Controller로 넘겨버려 제대로 자원을 불러올 수 없는 상황이 발생하게 된다. 이런 경우 프로젝트를 Spring Template Project로 생성하였다면 servlet-context.xml에서 이러한 코드를 확인할 수 있다. 이는 DispatcherServlet이 우선하여 해당 요청에 대한 Controller를 찾을 수 없다면 이차적으로 설정된 경로에서 해당 자원을 찾게 하는 것이다.