Gradle 로 Spring Legacy

2021. 11. 27. 05:00Spring MVC

Gradle 로 Spring MVC 프로젝트 구현하기
* 2021-11-26

 

*  build.gradle

dependencies {
	implementation "org.jetbrains.kotlin:kotlin-stdlib:1.6.0"
    
    implementation 'org.springframework:spring-webmvc:5.2.18.RELEASE'
    testImplementation 'junit:junit:4.13.2'
    
    testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1'
    
    testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.1'

}


ContextLoaderListener 에 대한 실험

Gradle  사용하여 Template 없이  Spring Legacy MVC 를  만들어 보았다.

 Dependency  부터 하나씩 수동으로 지정해 가면서 프로젝트를 진행하는데 갑자기 궁금증이 발동한다.

그래서 몇가지 실험을 해 본다.

1. listener 만 설정할 경우

* servlet 은 설정하지 않았다

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

* listener 를 설정하면 반드시 applicationContext.xml 이 있어야 한다.
* 또는 root 수준에서 <context-param>을 다음과 같이 설정해야 한다  
※ src/main/webapp/WEB-INF/root-context.xml 파일이 있어야 한다.

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


* listener 만 설정할 경우는 src/main/webapp/index.jsp 파일은 열수 있으나 Controller 핸들링은 할수 없다
* root-context.xml 에 <component-scan>을 설정하였으나 Controller 를 찾지 못한다
* 아무래도 <servlet-mapping> 이 없어서 인듯 하다

 

2. servlet 만 설정할 경우

* root context 설정은 제거한 상태

    <servlet>
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>


* 이때는 반드시 src/main/webapp/WEB-INF/dispatcher-servlet.xml 파일이 있어야 한다.
* 파일이름은 servlet-name 으로 설정한 이름-servlet.xml 으로 작성한다.
* dispatcher-servlet.xml 에 <component-scan>을 설정하였다.

 

3. filter 와 servlet 만 등록

* root context 설정을 모두 제거한 상태에서 CharacterEncodingFilter 만 설정하여 테스트를 진행해 보았다

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

  <servlet>
      <servlet-name>dispatcher</servlet-name>
      <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  </servlet>

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


* CharacterEncodingFilter 는 root context 가 없어도 작동이 된다
* POST 로 넘긴 한글데이터가 Controller 로 잘 전달된다

 

4. 실험결과


* 자료를 찾았으나 명확한 해답을 제시한 곳이 없다
* 잠정 결론은 listener 로 ContextLoaderListener 를 등록하는 경우는 
최근 spring-security 와 같은 서버 프로젝트 전반에 걸쳐 작용하는 framework 등을 위해 필요하다
* 일부 filter, interceptor 와 같은 부분을 등록할때도 있어야 하는 것으로 볼수 있다
* ContextLoaderListener 의 필요성을 좀더 고민해 봐야 하겠다.

'Spring MVC' 카테고리의 다른 글

Spring Security 암호화된 properties 값 읽기  (0) 2021.11.15