이번 편에서는 web.xml 파일의 작성법에 대해 알아볼 것이다.
context.xml은 Bean과 Annotation을 작성하는 파일이므로, 특별한 것이 없다.
따라서 건너 뛰도록 하겠다.
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 까지이다.
나머지는 필요에 맞게 적절히 추가해주면 된다.
우리가 작성할 부분은 크게 ROOT/Servlet Context, Listener, Filter 이렇게 4가지이다.
작성 순서대로 차근차근 알아보자.
ROOT던 Servlet이던 Context 설정을 로딩하는 방법에는 2가지가 있다.
- 자바 Class로 설정
- XML 파일로 설정
위 방법들에 대해 하나씩 알아보자!
<!-- 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 파일이 바로 인식될 수 있는 것이다!!)
<!-- 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로 변경하는 것이다.
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로 지정한다.
리스너는 이벤트를 처리하기 위한 요소이다.
ApplicationListener를 구현하여 만든 리스너를 등록하며,
여러가지 리스너를 만들어서 등록할 수 있다.
여기서는 앞서 배운대로 ROOT Context를 등록하기 위한 ContextLoaderListener를 등록해 볼 것이다.
<listener>
<listner-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
대망의 서블릿 컨텍스트! 이건 따로 설명하진 않겠다.
보통 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을 등록했다! 라는 것만 알아두자.
전체 코드를 한번 쭉 써보자면 다음과 같다.
<!-- 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>
이로써 Spring의 Container 모듈에 대한 글을 모두 마쳤다.
중간중간 까먹은 부분도 있었고, 다시 공부하면서 새로이 알게된 부분도 많아서, 되돌아 보기에 좋은 시간이었다.
비록 아직 부족하지만, 그런 부분들은 그때그때 추가해나갈 예정이다.
이 뒤로는 아마 Container 관련 오류들이나, 궁금한 점들 위주로 작성해나갈 것 같다.
그럼 다음 파트인 MVC를 기약하며 글을 마치겠다 : )