본문 바로가기
Spring Framework

[Spring Framework] web.xml 기초

by byeongoo 2019. 10. 12.

1. web.xml이란?

web.xml이란 웹 어플리케이션의 설정을 위한 배포 서술자(deployment descriptor)입니다. 다음은 web.xml의 역할입니다. 

 

 º Deploy할 때 Servlet의 정보를 설정

 º 브라우저가 Java Servlet에 접근하기 위해서는 서버에 필요한 정보를 알려주어야 해당하는 Servlet을 호출 가능

    - 배포할 Servlet이 무엇인지

    - 해당 Servlet이 어떤 URL에 매핑되는지

web.xml 예시

<web-app>

    <!-- 1. aliases 설정 -->
    <servlet>
        <servlet-name>welcome</servlet-name>
        <servlet-class>servlets.WelcomeServlet</servlet-class>
    </servlet>

    <!-- 2. 매핑 -->
    <servlet-mapping>
        <servlet-name>welcome</servlet-name>
        <url-pattern>/welcome</url-pattern>
    </servlet-mapping>

</web-app>

aliases 설정

 º 서블릿 이름을 실제 서블릿 클래스에 연결

 º servlets.WelcomeServlet은 개발자에 의해 작성된 실제 클래스 이름으로 설정

매핑 설정

 º URL을 서블릿 이름에 연결

 º  /welcome은 클라이언트(browser)의 요청 URL에서 앱(프로젝트) 이름 뒤에 오는 부분으로, 슬래시(‘/’)로 시작

2. Spring MVC 에서의 web.xml 설정

2.1 DispatcherServlet

 º Spring Container 생성. Spring Container는 Controller의 life cycle 관리

 º 클라이언트의 요청을 처음으로 받는 클래스(Spring에서 제공)

 º 클라이언트의 요청을 Handler(Controller)에 보냄

 º HandlerMapping: 어떤 url을 받을지 결정

<servlet>
  <servlet-name>salesServlet</servlet-name>
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  <!-- contextLoader가 해당 위치의 설정 파일을 읽어, 해당 파일을 dispatcher servlet으로 만든다. -->
  <init-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/salesServlet-servlet.xml</param-value>
  </init-param>
  <load-on-startup>1</load-on-startup>
</servlet>

<!-- /sales로 시작하는 url 요청을 받아 salesServlet에서 처리한다. -->
<servlet-mapping>
  <servlet-name>salesServlet</servlet-name>
  <url-pattern>/sales</url-pattern>
</servlet-mapping>

 º <init-param> 부분은 생략가능. 

     - <servlet-name>에 설정한 이름 + -servlet.xml 형식으로 설정 파일 이름을 만들고, web.xml과 같은 위치(/WEB-INF 하위) 에 있어야 contextLoader가 해당 파일을 찾아서 읽을 수 있습니다.

     - 위와 같이 설정하면 init-param으로 dispatcher xml 파일의 이름을 설정하지 않아도 자동으로 로드 됩니다.

(ex) salesServlet-servlet.xml

2.2 ContextLoaderListener

 º Controller가 공유하는 Bean들을 포함하는 Spring Container를 생성

     - 공유하는 Bean: Dao, DataSource, Service

     - 각 Bean에 대한 설정 파일을 따로 생성

       -> service-context.xml: Service 관련

       -> dao-context.xml: Dao 관련

       -> applicationContext.xml: DataSource 관련, properties 등록, SessionFactory, TransactionManager 등

       -> security-context.xml: Security 관련, BCryptPasswordEncoder 등

 º DispatcherServlet에 의해 생성된 Bean은 ContextLoaderListener에 의해 생성된 Bean을 참조할 수 있습니다.

<!-- 이렇게 등록된 설정 파일에 따라 등록된 Bean들은 모두 공유가 가능하다. -->
<context-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>
    /WEB-INF/service-context.xml
    /WEB-INF/dao-context.xml
    /WEB-INF/applicationContext.xml
    /WEB-INF/security-context.xml
  </param-value>
</context-param>

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

3. context-param

 º Servlet context의 parameter를 선언해주는 부분

 º web.xml의 전역 변수 느낌

 º <init-param>은 지역변수라고 생각하면 이해하기 쉬움

<context-param>
	<param-name>contextConfigLocation</param-name>
	<param-value>/WEB-INF/spring/root-context.xml</param-value>
</context-param>

4.listener

 ºApplication Listener Bean을 가르키기 위한 부분으로 이때 해당 Bean은 웹 어플리케이션에 등록 되어있어야함

// spring에서 contextConfigLocation을 설정하기 위한 listener bean 지정
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

5. encodingFilter

 º 인코딩을 UTF-8로 설정하여 필터링 

<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>

<!-- /의 형식으로 시작하는 url에 대하여 UTF-8로 인코딩 -->
<filter-mapping>
    <filter-name>encodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

References

 º https://gmlwjd9405.github.io/2018/10/29/web-application-structure.html