본문 바로가기
웹개발/스프링

스프링 4 MVC - part 3

by 인생여희 2020. 11. 11.

DispatcherServlet과 CharacterEncodingFilter 설정

Bean 정의파일에 설정한 내용을 바탕으로 DispatcherServlet을 설정한다. 먼저 web.xml에 설정하는 방법을 알아보고, Servlet3.0 이후의 환경에서 사용할 수 있도록 WebApplication Initializer를 사용한 방법도 알아본다.

 

web.xml

<?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_3_1.xsd"
         version="3.1">
  <display-name>Sample MVC</display-name>

  <!-- 1번  -->
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
      classpath:/META-INF/spring/beans-biz.xml
    </param-value>
  </context-param>
  
  
  <!-- 2번  -->
  <listener>
    <listener-class>
      org.springframework.web.context.ContextLoaderListener
    </listener-class>
  </listener>
  
  
  <!-- 3번  -->
  <servlet>
    <servlet-name>dispatcherServlet</servlet-name>
    <servlet-class>
      org.springframework.web.servlet.DispatcherServlet
    </servlet-class>
    <!-- 5번  -->
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>
        classpath:/META-INF/spring/beans-webmvc.xml
      </param-value>
    </init-param>

    <load-on-startup>1</load-on-startup>
  </servlet>

  <!-- 4번  -->
  <servlet-mapping>
    <servlet-name>dispatcherServlet</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>

  <!-- 6번  -->
  <context-param>
    <param-name>defaultHtmlEscape</param-name>
    <param-value>true</param-value>
  </context-param>
  
  
  <!-- 7번  -->
  <filter>
    <filter-name>characterEncodingFilter</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>characterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>



</web-app>

 

우선 웹 컨테이너상에 DI 컨테이너를 배치하는 설정이 1번 , 2번 이다. DI컨테이너를 웹컨테이너상에 작성하는 Listner가 2번이고,

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

어떤 Bean정의 파일을 가지고 DI 컨테이너를 만들 것인가를 지정하는 파라미터가 1번이다.

  <!-- 1번  -->
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
      classpath:/META-INF/spring/beans-biz.xml
    </param-value>
  </context-param>

 

다음으로 스프링 MVC중심이 되는 DispatcherServlet의 정의가 3번 , 4번이다. 3번에서 DispatcherServlet을 서블릿으로 정의하고

<!-- 3번  -->
  <servlet>
    <servlet-name>dispatcherServlet</servlet-name>
    
    <servlet-class>
      org.springframework.web.servlet.DispatcherServlet
    </servlet-class>
    
    <load-on-startup>1</load-on-startup>
  </servlet>

4번에서 DispatcherServlet에 대한 경로를 설정한다. 스프링MVC에서 웹 애플리케이션을 구축할 때는 정적 리소스 설정에서도 설명한 것처럼 기본적으로 컨텍스트 루트에 매핑시키는 경우가 대부분이다.

<!-- 4번  -->
  <servlet-mapping>
    <servlet-name>dispatcherServlet</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>

5번은 DispatcherServlet에서 작성하는 DI컨테이너의 Bean 정의 파일을 지정하고 있다. 스프링의 MVC의 베이스를 한 웹 애플리케이션에서는 ContextLoaderListener와 DispatcherServlet의 양쪽에서 DI 컨테이너를 작성할 수 있어서, 후자가 전자를 참조하는 형태가 된다.

스프링 MVC에서 DI 컨테이너와의 관계

즉, ContextLoaderListener의 DI 컨테이너에서 관리되고 있는 Bean을 DispatcherServlet의 DI컨테이너에서 관리되고 있는 Bean에 인젝션 할 수 있지만 반대로는 되지 않는다. 일반적으로 ContextLoaderListener의 DI컨테이너에서 비즈니스 층 이하의 Bean을 관리하고, DispatcherServlet의 DI컨테이너에서는 프레젠테이션 층 이상의 Bean을 관리한다.

 

6번은 스프링 MVC의 뷰에서 HTML의 이스케이프 실시에 대한 설정이다. < , > 등의 문자를 이스케이프 처리 해준다.

	<!-- 6번  -->
  <context-param>
    <param-name>defaultHtmlEscape</param-name>
    <param-value>true</param-value>
  </context-param>
  

7번은 characterEncodingFilter 설정이다. 이 필터를 설정하면 자동으로 HttpServlertRequest의 setCharacterEncoding 메서드를 실행해 적절한 문자 코드를 지정해 준다.

  <!-- 7번  -->
  <filter>
    <filter-name>characterEncodingFilter</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>characterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

 

 

1.참고할만한 포스팅 : ContextLoaderListener 원리와 ContextLoaderListener를 이용한 설정

2.참고할만한 포스팅 : 스프링 MVC 동작 원리

 


@RequestMapping의 여러설정

@RequestParam의 여러설정

@Controller 메서드 인수로 지정가능한 오브젝트

 

 

 

 

참고: 스프링 4입문 (한빛미디어)