web.xml
web.xml은 웹 애플리케이션의 사양을 명시하는 파일이다. 배포 시 war를 해석할 때 web.xml에 있는 내용을 기반으로 구동하게 된다. Spring 프로젝트에서는 DispatcherServlet과 설정 파일들을 이곳에 등록한다.
파일 전체 내용 보기
Copy <?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>
파일 상세 설명
xml 헤더
xml 문서임을 명시하는 xml 헤더 코드이다. 모든 xml 문서의 첫 번째 줄에 위치한다.
Copy <?xml version="1.0" encoding="UTF-8"?>
기본 영역 설정
web.xml에 설정을 정의하기 위한 영역 선언이다.
Copy <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">
...(내용 작성)...
</web-app>
눈여겨봐야할 것은 기본적으로 생성하면 version이 2.5로 설정되어 있다는 것이다.
현재(2019/08) 기준 서블릿 최신 스펙은 4.0이므로 버전에 맞게 수정해야 한다. 단, 이 파일만 변경하는 것이 아니라 pom.xml에 존재하는 dependency도 수정해야 한다.
web.xml 버전별 스키마
Servlet 2.5
Copy <?xml version="1.0" encoding="UTF-8"?>
<web-app 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 http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
</web-app>
Servlet 3.0
Copy <?xml version="1.0" encoding="UTF-8"?>
<web-app 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 http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
</web-app>
Servlet 3.1
Copy <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
</web-app>
Servlet 4.0
Copy <?xml version="1.0" encoding="UTF-8"?>
<web-app
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
</web-app>
전역 설정 파일 선언
context-param을 통하여 전역 설정 파일을 선언한다.
Copy <context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/root-context.xml</param-value>
</context-param>
이 설정은 /WEB-INF/spring/에 있는 root-context.xml 파일이 전역 설정파일임을 명시하는 설정이며, param-name은 변경이 불가하다. 만약 설정 파일이 여러 개라면 param-value에 열거할 수 있다.
DispatcherServlet 설정
Spring의 핵심 처리 도구인 DispatcherServlet과 설정파일인 servlet-context.xml을 등록하는 코드이다.
Copy <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>
servlet-name은 자유롭게 설정이 가능하지만 servlet, servlet-mapping에서 동일하게 작성되어야 연결이 된다. init-param 설정을 통해 설정파일(servlet-context.xml)의 위치를 알려주고 있으며, 양식은 root-context.xml과 동일하다. load-on-startup을 통해 시작 시 우선 순위를 부여한다.
url-pattern을 살펴보면 /로 설정된 것을 알 수 있다.
Copy <url-pattern>/</url-pattern>
필터의 경우 일반적으로 /를 사용하는데, /와 / 는 차이가 존재한다.
/*는 전체(All)을 의미한다. 설정을 통해서 특정 부분을 제외할 수 없다.
/는 나머지(Rest)를 의미한다. 설정을 통해서 특정 부분을 제외할 수 있다.
설정파일 연결 설정
Copy <listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
ContextLoaderListener 설정을 통해 전역 설정과 DispatcherServlet 설정을 이어지도록 한다. 이 설정으로 인하여 servlet-context.xml과 root-context.xml이 상하 관계로 연결된다.
servlet-context.xml 에서는 root-context.xml 에 등록된 내용을 사용할 수 있다.
root-context.xml 에서는 servlet-context.xml 에 등록된 내용을 사용할 수 없다.