web.xml 이란
1. 정의
스프링에서 web.xml은 WEB-INF 하위에 위치하며, WAS가 최초로 구동될 때 WEB-INF/web.xml 파일을 읽어서 메모리에 올리고 Web Application(톰캣)의 설정을 적용하기 위해서 존재합니다.
DD (Deployment Descriptor: 배포 설명자)라고 불리며, Web Application의 설정파일입니다.
- Web Application의 Deployment Descriptor(환경파일 : 배포서술자, DD파일)로서 XML 형식의 파일
- 모든 Web application은 반드시 하나의 web.xm l파일을 가져야 함
- 위치 : WEB-INF 폴더 아래
- web.xml 파일의 설정들은 Web Application 시작시 메모리에 로딩됨.(수정을 할 경우 web application 재시작 필요)
2. 기본 설정
프로젝트 생성 시 web.xml 파일 내용
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee https://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<!-- The definition of the Root Spring Container shared by all Servlets and Filters -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/root-context.xml</param-value>
</context-param>
<!-- Creates the Spring Container shared by all Servlets and Filters -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- Processes application requests -->
<servlet>
<servlet-name>appServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>appServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
기본적인 세팅 후 web.xml 파일
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee https://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<!-- Root Context 경로로 서버의 주소만을 입력하여 접근헀을 때 가장 처음으로 띄워줄 경로를 설정하는 태그 -->
<!-- 순차적으로 진행하며, 페이지가 없는경우 다음 태그로 넘어감 -->
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
<welcome-file>index2.jsp</welcome-file>
<welcome-file>index3.jsp</welcome-file>
</welcome-file-list>
<!-- filter는 Request 와 servlet 사이에 위치하여 요청과 결과에대한 정보를 알맞게 변경이 가능하다. -->
<!-- filter를 여러개 설정하여 필터 체인을 구성할 수 있다. -->
<!-- 인코딩 필터 -->
<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-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/</url-pattern>
</filter-mapping>
<!-- Service, DAO, DB등 비즈니스 로직 관련설정 -->
<!-- Spring 실행과 동시에 의존주입이 필요한 설정들 -->
<!-- root-context 를 별도 경로로 지정 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:config/spring/context-*.xml</param-value>
</context-param>
<!-- Creates the Spring Container shared by all Servlets and Filters -->
<!-- 스프링 컨테이너 및 ApplicationContext(IoC) 생성 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- Servlet 관련 객체 정의 -->
<!-- Controller, 어노테이션, ViewResolver, Intercepter, MultipartResolver 등 -->
<servlet>
<servlet-name>appServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>appServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
3. 부분 설명
1) <display-name>
display-name은 web.xml(Deployment descriptor(DD, 배포설명자))의 title을 의미합니다. HTML에서의 <title> 태그와 기능이 같다고 보면 됩니다.
<display-name>web</display-name>
2) <context-param>
context-param은 같은 Web Application에 있는 Servlet들이 같이 공유해서 사용할 수 있는 전역변수다. 그래서, 아래의 코드를 보면 param-name과 param-value가 있다.
- param-name : context-param의 이름(contextConfigLocation)
- param-value : context-value의 값(/WEB-INF/conf/spring/context-*.xml)
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/conf/spring/context-*.xml
</param-value>
</context-param>
3) <listener>
listener는 어떤 이벤트가 발생했을 때, 이 이벤트에서 listener-class에 있는 객체가 호출되면 그 호출을 처리하는 객체를 말합니다. 그래서, 이 listener에는 따로 <listener-class>를 정의하여 사용합니다.
i) ContextLoaderListener
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
ii) log4j
log4j를 사용하려면 다음과 같이 설정을 고려해야 합니다.
- pom.xml에 log4j 디펜던시 추가
- log4j.xml 추가
- web.xml에 listener-class 추가
<listener>
<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>
4) <servlet>
servlet은 Client의 Request에 동적으로 작동하는 Web Application Component다. 그래서, 이 servlet은 어디서 많이 들어봤을 용어다. 스프링 프레임워크(Spring Framework)에서 Client의 요청이 들어오면 Client의 Request URL에 맞게 DispatcherServlet이 그 요청을 가로채간다고 들어본 적이 있을 것이다. 즉, 이 <servlet>에서 DispatcherServlet을 등록한다.
i) <servlet-name>
servlet-name은 servlet-class의 alias라고 볼 수 있다. servlet-name은 servlet-class와 연결이 된다. 여기서 주의해야 할 점은 <servlet-name>에서 설정한 alias는 servlet-mapping을 할 때, servlet-mapping의 servlet-name과 같아야 합니다.
ii) <servlet-class>
servlet-class는 개인이 아무렇게 정의하는 것이 아니라 패키지 경로를 정확하게 입력해야 합니다. 따라서, servlet-class는 servlet-name에 매칭이 되고, 이 servlet-name은 servlet-mapping을 할 때 사용이 됩니다.
iii) <init-param>
init-param은 위에서 사용했던 context-param과 같은 의미인데, 범위가 다르다. context-param은 같은 Web Application 안에 있는 Servlet끼리 사용할 수 있지만, init-param은 Servlet 내에서 지역변수처럼 사용합니다.
iv) <load-on-startup>
load-on-startup은 Servlet Container가 시작을 하자마자 Servlet을 생성하고, 초기화를 하고 싶을 때 사용하는 태그입니다. 이 load-on-startup 같은 경우에는 나중에 따로 포스팅을 하도록 하겠습니다. 이 load-on-startup은 0 이상의 값이 들어가면 자동으로 인스턴스가 생성되는데, 0에 가장 가까운 순서대로 실행이 됩니다. 또한, load-on-startup의 숫자가 같은 경우에는 web.xml에서 가장 먼저 선언된 순으로 실행이 됩니다.
<servlet>
<servlet-name>common</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/conf/mvc/servlet-*.xml
</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
5) servlet-mapping
servlet-mapping은 위의 servlet에서 선언한 servlet-class의 alias인 servlet-name과 맞춰서 servlet-name을 정의해야 합니다. 그래서, 이 servlet-mapping은 1개의 url-pattern에 1개의 servlet-name을 정의할 수 있는데, 이 url-pattern에 따라 어떤 servlet을 mapping할건지 여기서 설정을 할 수 있습니다.
<servlet-mapping>
<servlet-name>test1</servlet-name>
<url-pattern>*.data</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>test2</servlet-name>
<url-pattern>*.page</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>test3</servlet-name>
<url-pattern>*.rest</url-pattern>
</servlet-mapping>
6) <filter>
filter는 Client가 서버로 Request를 할 때, Servlet에서 URL-pattern에 매핑되는 Request를 가져가기 전이나 가져간 후에 필터링을 해주는 역할을 합니다. 그래서, 이 filter는 web.xml에서 설정을 하면 간편하게 사용할 수 있습니다. filter의 사용방법은 servlet과 동일하다고 볼 수 있습니다.
아래의 코드를 보면, servlet을 설정하는 방법과 동일한 것을 볼 수 있습니다. servlet 대신에 filter를 넣어주면 됩니다.
<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>
i) filter-mapping
filter-mapping도 마찬가지로, servlet-mapping과 사용법이 똑같습니다.
<filter-mapping>
<filter-name>xssEscapeServletFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
7) <session-config>
session-config는 세션을 유지할 수 있도록 시간을 설정할 수 있습니다.
<session-config>
<session-timeout>60</session-timeout>
</session-config>
8) <cookie-config>
cookie-config는 Web browser와 Web Server가 HTTPS 형태로 통신하는 경우에만 Web Browser가 Web Server에게 쿠키를 전송하는 옵션을 설정할 수 있습니다.
<session-config>
<cookie-config>
<secure>true</secure>
<http-only>false</http-only>
</cookie-config>
</session-config>
9) <welcome-file-list>
welcome-file-list는 welcome-file을 모아놓은 리스트이고, welcome-file은 서버를 구동할 때, 루트 경로로 접속을 하게 되면 가장 먼저 화면을 불러오는 것을 설정할 수 있다. 즉, localhost:8080으로 접속을 하면, index.jsp를 불러오게 된다. 거기에, index.jsp가 없으면 index.htm을 불러온다. 1가지 주의할 점은 RequestMapping에서 "/"로 설정한 것이 있으면, welcome-file-list는 먹히지 않는다.
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
<welcome-file>index.htm</welcome-file>
</welcome-file-list>
10) <resource-ref>
resource-ref는 jdbc 및 JNDI를 설정하는 곳이다.
<resource-ref>
<description>JNDI_YG</description>
<res-ref-name>jdbc/yg</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>