web.xml 작성법

Dev StoryTeller·2021년 2월 12일
0

이번 편에서는 web.xml 파일의 작성법에 대해 알아볼 것이다.
context.xmlBean과 Annotation을 작성하는 파일이므로, 특별한 것이 없다.
따라서 건너 뛰도록 하겠다.


1. web.xml 작성 순서

web.xml을 작성할 때는 올바른 순서대로 작성해야 한다.
그렇지 않으면 XML parsing 에러가 나게된다.

다음은 그 작성 순서이다

  • icon?
  • display-name?
  • description?
  • distributable?
  • context-param
  • filter
  • filter-mapping
  • listener
  • servlet
  • servlet-mapping
  • session-config?
  • mime-mapping*
  • welcome-file-list?
  • error-page
  • taglib
  • resource-env-ref
  • resource-ref
  • security-constraint
  • login-config?
  • security-role
  • env-entry
  • ejb-ref
  • ejb-local-ref

우리가 이번 기본틀 작성에 필요한 것들context-param~servlet-mapping 까지이다.

나머지는 필요에 맞게 적절히 추가해주면 된다.


2. 기본틀 작성

우리가 작성할 부분은 크게 ROOT/Servlet Context, Listener, Filter 이렇게 4가지이다.
작성 순서대로 차근차근 알아보자.

1. ROOT Context

ROOT던 Servlet이던 Context 설정을 로딩하는 방법에는 2가지가 있다.

  • 자바 Class로 설정
  • XML 파일로 설정

위 방법들에 대해 하나씩 알아보자!


  • XML 파일로 설정
    이 방법은 contextConfigLocation이란 파라미터를 쓴다.
<!-- web.xml 파일 -->
<context-param>
    <param-name>contextConfigLocation<\param-name>
    <param-value>classpath*:ROOT-context.xml<\param-value>
<\context-param>

param-value 부분에다 xml 파일의 위치를 적어주면 된다.
(classpath란? - 메이븐 구조에서 프로젝트 컴파일을 진행하면 target 폴더가 생성되는데, 여기의 classes 폴더의 경로를 말한다. 즉 classpath = target/classes/이다.

여기서 메이븐의 java 폴더resources 폴더 파일들classes 폴더에 합쳐지게 되는데, 이 때문에 resources 폴더 속의 XML 파일이 바로 인식될 수 있는 것이다!!)


  • 자바 Class로 설정
    하지만 자바 Class를 설정 파일로 등록하려면 contextClass라는 추가 파라미터가 필요하다.
<!-- web.xml 파일 -->
<context-param>
    <param-name>contextConfigLocation<\param-name>
    <param-value>ROOTConfig<\param-value>
</context-param>
<context-param>
    <param-name>contextClass</param-name>
    <param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value>
<\context-param>

contextClass는 설정 파일을 Class로 사용하겠다는 의미가 아니다.
리스너에서 생성할 Context를 어떤 클래스로 할 것이냐를 말하는 것인데,
이 값은 Default로 XmlWebApplicationContext가 설정되어 있다.
때문에 XML 방식은 설정없이 사용할 수 있는 것이다.

하지만 클래스 방식은 각종 어노테이션이 적용된 클래스가 사용되므로,
이 값을 AnnotationConfigWebApplicationContext로 변경하는 것이다.


2. Filter

Filter말 그대로 걸러주는 역할이다.
이 부분은 각자 모듈에 맞게 필요한 필터를 추가하면 된다.
(스프링 시큐리티를 사용한다면 시큐리티 필터를 적용 등)

여기서는 가장 기본인 인코딩 필터를 적용해 볼 것이다.

<filter>
    <filter-name>encodeFilter</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>encodeFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

필터의 등록 방법은 서블릿과 거의 동일하다.
모든 웹 페이지에 적용되야 하니 mapping URL은 /*로 하고,
인코딩 방식utf-8로 지정한다.


3. Listener

리스너는 이벤트를 처리하기 위한 요소이다.
ApplicationListener를 구현하여 만든 리스너를 등록하며,
여러가지 리스너를 만들어서 등록할 수 있다.

여기서는 앞서 배운대로 ROOT Context를 등록하기 위한 ContextLoaderListener를 등록해 볼 것이다.

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

4. Servlet Context

대망의 서블릿 컨텍스트! 이건 따로 설명하진 않겠다.
보통 DispatcherServlet을 등록한다.

<servlet>
    <servlet-name>dispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>servlet-context.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>dispatcherServlet</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

위에 대한 자세한 내용MVC 파트에서 다룰 것이다.
여튼 ROOT(/)에 매핑되는 Servlet을 등록했다! 라는 것만 알아두자.


3. 전체 코드

전체 코드를 한번 쭉 써보자면 다음과 같다.

<!-- web.xml 파일 -->
<!-- ROOT Context 등록 -->
<context-param>
    <param-name>contextConfigLocation<\param-name>
    <param-value>classpath*:ROOT-context.xml<\param-value>
<\context-param>

<!-- 필터 등록 -->
<filter>
    <filter-name>encodeFilter</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>

<!-- 리스너 등록 -->
<listener>
    <listner-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>


<!-- Servlet Context 등록 -->
<servlet>
    <servlet-name>dispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>servlet-context.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>dispatcherServlet</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

4. 결론

이로써 Spring의 Container 모듈에 대한 글을 모두 마쳤다.
중간중간 까먹은 부분도 있었고, 다시 공부하면서 새로이 알게된 부분도 많아서, 되돌아 보기에 좋은 시간이었다.

비록 아직 부족하지만, 그런 부분들은 그때그때 추가해나갈 예정이다.

이 뒤로는 아마 Container 관련 오류들이나, 궁금한 점들 위주로 작성해나갈 것 같다.

그럼 다음 파트인 MVC를 기약하며 글을 마치겠다 : )

profile
개발을 이야기하는 개발자입니다.

0개의 댓글