web.xml
일하고 있는 도중, 선배가 갑자기 질문을 했다.
선배 : 민우씨 web application의 시작이라고 할 수 있는 web.xml에 대해서 설명해줄 수 있어요?
나 : 당연하죠ㅎㅎ web.xml은 . . . . .
라고 아무말도 못했다.. web.xml을 듣자마자는 당연히 설명할 수 있을 것 같아서 자신있게 알고있다고 말한 내 자신이 부끄러워지는 순간이였다.
여러분들은 web.xml에 대해서 정확하게 알고 계신가여..?
web.xml
web.xml은 web application의 설정파일 이라고 보면된다.
web ContextLoderListener 이 실행될 때 메모리에 로드되는 web.xml은 크게 3가지 역할을 수행한다.
web.xml 의 대표적인 3가지 역할
DispatcherServlet, ContextLoderListener, Filter의 역할을 수행하는 web.xml
DispatcherServlet
클라이언트의 요청을 수행하는 DispatcherServlet
Web Application의 모든 Controller를 찾아서 DispatcherServlet 에게 전달하는 Mapping handler
Web Application의 Controller에서 실행된 비즈니스 로직을 통해 응답 데이터와 VIEW를 반환해주는 Mapping Adapter
Mapping Adapter가 반환해준 VIEW를 실제로 찾아서 응답 데이터와 함께 클라이언트에게 제공하는 View Resolver
( Mapping Adapter 가 반환해주는 VIEW는 단순한 VIEW의 "이름" 값이라고 보면된다 실제로 VIEW를 찾는건 View Resolver의 역할 )
이렇게 DispatcherServlet 는 Mapping handler, Mapping Adapter, View Resolver 을 통해서 클라이언트의 요청을 수행하고 있다.
ContextLoderListener
앞서 DispatcherServlet 는 클라이언트의 요청을 수행한다고 설명했다.
Web Application의 규모가 커질수록 클라이언트의 요청은 다양해질 수 밖에 없다.
다양해진 클라이언트의 요청을 DispatcherServlet 가 혼자서 처리할 수 없기 때문에 다양한 유형의 servlet이 생성 되어야 하는 것은 필수적이며, 이에 따라 여러 servlet이 각각의 설정을 갖게될 수 밖에 없다.
하지만 모든 servlet이 공통적으로 가져야하는 설정이 있는데 (Application Context 단위의 설정) 이를 ContextLoderListener 객체가 담당한다.
Filter
DispatcherServlet가 클라이언트의 요청을 받기 전 거치는 부분이 존재하는데 바로 Filter 객체이다.
Filter 객체를 통해 인가 및 인증 처리를 거친 필터링된 데이터가 DispatcherServlet에 전달된다고 보면 된다.
이렇게 공부를 하고 실제로 회사 web.xml 파일 코드를 살펴보니, 개념을 정확히 모르고 봤을 때랑 다른 느낌이였다.
맘 같아선 회사코드를 그대로 복사해서 하나하나 같이 분석하고 싶지만, 보안상 그러지 못해 임의로 예시코드를 작성해 봤다.
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>
org.springframework.web.filter.CharacterEncodingFilter
</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-name>encodingFilter</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>
-> spring에서 제공하는 encodingFilter를 적용한 web.xml 코드
위에서 정리한 개념들을 살펴보면 <filter> 에서 필터링된 데이터가 DispatcherServlet 객체로 이동한다고 보면 되겠죠?
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/config/egovframework/springmvc/dispatcher-servlet.xml,
/WEB-INF/config/egovframework/springmvc/urlfilename-servlet.xml,
/WEB-INF/config/egovframework/springmvc/egov-com-*.xml
</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
- > DispatcherServlet 객체를 action이라는 name으로 생성하고, 해당 객체의 설정을 <param-value> 내부의 xml 파일을 통해 설정하겠다는 코드. 이후, action이라는 name을 가진 DispatcherServlet 객체를 *.do 의 url로 요청되는 모든 것을 처리한다는 코드.
<!-- web application context -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/config/application-context.xml
</param-value>
</context-param>
-> Application Context 의 단위의 설정파일로 application-context.xml을 설정한다.