web.xml 설정

web.xml에 대한 개념과 설정방법에 대한 페이지

web.xml?

  • 배포서술자라고 불리며 WAS에 의해 어플리케이션이 구동될때 가장 처음으로 읽는 문서이다. 어플리케이션 구동에 필요한 전반적인 정보를 포함하고 있다.

  • 서블릿설정, 필터설정, 리스너설정, 세션타임아웃설정, 에러페이지 설정등 다양한 설정정보를 기술할 수 있다.

web.xml의 태그들

web.xml

web.xml태그들

web-app태그

  • web.xml의 기본 시작태그. 기본생성시 2.5버전으로 등록되어있으며 호환되는 Servlet을 이용하기 위해서는version정보를 3.0으로 수정해줘야한다.

  • 톰캣에서 servlet 3버전을 구현했다면 3버전을, 톰캣에서 servlet4버전이상(jakarata)를 구현했다면 servlet4버전으로 변경해줘야 한다.

<?xml version="1.0" encoding="UTF-8"?> <!-- xml형식의 문서에 붙는 시작태그-->
<web-app version="3.0" 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_3_0.xsd">
	
</web-app>

context-param

  • 웹 어플리케이션(context)에서 사용할 변수를 등록하는 영역이다.

  • 이 곳에 등록된 변수는 어플리케이션 전역에서 사용되며 초기 변수인 contextConfigLocation의 경우 스프링의 ContextLoaderListener에 의해 읽혀져 root-context.xml 파일을 읽는다.

<context-param>
	<param-name>contextConfigLocation</param-name>
	<param-value>
		/WEB-INF/spring/root-context.xml
	</param-value>
</context-param>
<!-- 필요하다면  여러 변수 추가가능. -->
<context-param>
	<param-name>dbInfo</param-name>
	<param-value>Mysql</param-value>
</context-param>
// 전역 파람 사용방법
ServletContext context = getServletContext();				
String dbUrl = context.getInitParameter("dbInfo"); //Mysql

listener

  • 어플리케이션에 특정 이벤트가 발생했을때 자동으로 호출되는 클래스. 서블릿이 생성/소멸될때 , 세션이 생성/소멸될때, 컨텍스트가 생성/소멸될때등 다양한 이벤트를 감지하는 리스터가 존재한다.

  • MVC프로젝트 생성시 기본으로 추가되어있는 ContextLoaderListener는 전역객체인 Root ApplicationContext를 생성하는 역할을 한다.

  • Root ApplicationContext는 Spring의 IOC Container의 역할을 하며, contextConfigLocation에 정의된 root-context.xml파일을 읽어서 bean객체들을 생성한다.

  • Root ApplicationContext는 전역 서비스용 Bean객체(DB, Service, Repository)를 저장 및 관리한다.

<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

servlet - DispatcherServlet

  • 스프링 핵심객체인 DispatcherServlet 등록영역.

  • DispatcherServler은 클라이언트의 요청을 모두 첫 번째로 받아내는 Servlet으로 Front Controller라고도 불린다.

  • DispatcherServlet은 Web Application Context를 생성하며 DispacterServlet이 사용하는 단독 IOC Conatiner이다.

    • 웹과 관련된 Bean객체(Controller, ViewResolver)를 저장 및 관리한다.

  • <servlet>

    • <init-param>에서는 Web Application Context에서 사용할 bean객체를 초기화 시키는 servlet-context.xml파일의 경로가 들어가 있다

    • <load-on-startup>속성은 서버 시작과 동시에 초기화 시킬 서블릿의 순서를 지정하는 속성.

  • <servlet-mapping>

    • <url-pattern>/</url-pattern> 는 모든 요청을 서블릿으로 매핑하기 위한 속성으로 "기본 서블릿패턴" 혹은 "기타url 패턴"으로 불린다.

    • /로 설정하게 되면 특정 URL패턴과 일치하지 않는 "나머지" 요청을 해당 서블릿이 처리하게 된다.

<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으로 작성한 서블릿명과 동일해야함 -->
	<servlet-name>appServlet</servlet-name> 
	<url-pattern>/</url-pattern>
</servlet-mapping>

디폴트 서블릿 패턴( /)은 /*패턴과 다르다.

  • /* 패턴은 와일드카드 패턴으로 불리며, CSS 파일, JPG 파일, JS 파일 등 정적인 리소스 패턴과 동적 리소스 패턴 모두를 포함한다. 예) /spring/resources/test.jpg (정적 리소스패턴) /spring/member/login (동적 리소스패턴)

  • 위 두코드를 분리하여 정적인 자원을 제외하고 동적 리소스패턴만 처리받고 싶다고 할때 /*은 특정부분을 제외 할 수 없다.

  • / 패턴은 별도의 설정을 통해 정적 리소스 패턴을 제외한 "나머지" 동적 리소스 패턴에 대해 처리하겠다고 설정할 수 있다.

  • servlet-context.xml 내부 정적자원에 대한 핸들러코드

    <resources mapping="/resources/**" location="/resources/" />

Filter

  • 어플리케이션에 적용할 filter등록 영역.

  • Filter는 IOC Container와 별개의 객체로, 컨테이너에 의해 관리되지 않는다.

    • 단, 버전에 따라 Bean객체로 등록도 가능하나, 현재 버전에서는 아님.

    • Spring Container가 관리하는 Bean객체 형태의 Filter 등록은 @WebFilter 혹은 @Configuration + @Bean조합으로 가능하다.

  • Filter는 DispatcherServlet으로 요청이 전달 되기 전 이를 가로채고 특정 코드를 실행할 수 있는 중간처리기(Middleware)의 역할을 수행한다.

  • 보통 웹 어플리케이션에 추가되는 공통로직,공통작업을 정의하기 위해 사용한다

    • 인코딩설정, 로그인체크필터, 권한체크필터, 로깅 , 캐싱 등

  • encodingFilter는 프로젝트에서 사용하는 인코딩작업을 대신 처리해줄 수 있는 필터.

<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>
	
	<init-param>
		<param-name>forceEncoding</param-name>
		<param-value>true</param-value> <!-- 인코딩 충돌시 강제 인코딩 설정 -->
	</init-param>
</filter>

<filter-mapping>
	<filter-name>encodingFilter</filter-name>
	<!-- filter-name은 filter로 등록한 filter-name과 동일해야한다.    -->
	<url-pattern>/*</url-pattern> 
	<!-- 인코딩을 적용할 url패턴 설정 -->
</filter-mapping>
public class MyFilter implements Filter {

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {

        // 요청 전 처리 (전처리)
        System.out.println("요청이 들어왔습니다.");

        // 다음 필터 or DispatcherServlet으로 넘김
        chain.doFilter(request, response);

        // 응답 후 처리 (후처리)
        System.out.println("응답이 완료되었습니다.");
    }
}

Last updated