https://lng1982.tistory.com/97?category=806339 를 참고해서 좀 더 요약해본 글입니다.
Spring legacy 프로젝트를 하다보면 피할 수 없는게, tomcat web.xml
설정과
spring xml
설정입니다. 오늘은 이 중에서도 DispatcherServlet
의 url 패턴을
/
로 쓰기 위해서 저 두 xml 파일을 어떻게 설정해야 되는지 알아보겠습니다.
이걸 왜 해야 될까요? 결론부터 말하자면
*.do
url 매핑을 하지 않기 위해서입니다.
많은 공공기관, 정부 관련 사이트에서는 아직도.do
같은 url 경로를 사용합니다.문제는 오늘날
REST API
를 통한 URL 설계가 보편화되었는데
REST API 규칙에는 URL 에 확장자를 사용하지 말라는 규칙이 있습니다.
REST API 가 정확히 무엇인지 모르겠으면 이 영상을 한번 보는 것을 적극 추천합니다.
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:me/dailycode/spring/context/**/context-*.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>webMvcServlet</servlet-name>
<servlet-class>org.springframework.</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/config/springmvc/**/*.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>webMvcServlet</servlet-name>
<url-pattern>/</url-pattern><!-- 이게 중요! -->
</servlet-mapping>
/
경로는 사실 우리가 직접적으로 위처럼 지정하지 않으면 톰캣 기본 설정 상
DefaultServlet
이 담당합니다. DefaultServlet
의 역할은 Client 가 요청한
URL 이 우리가 명시적으로 등록한 Servlet
의 <url-pattern>
과 매칭되지 않으면,
그때 해당 요청에 대한 처리를 해줍니다.
이 말은 정적 자원
요청에 대한 처리를 위한 기본 Serlvet 이 이미 Tomcat 에 구비되어 있다는 의미입니다.
그런데 현재 <url-pattern>/</url-pattern>
을 내가 만든 webMvcServlet
에 매핑했기 때문에 기존에 DefaultServlet
의 url mapping 정보를 override 하게 됩니다.
위와 같은 현상을 해결하기 위해서 spring 설정을 잘하면 됩니다.
web.xml 에서 작성한 경로 상(/WEB-INF/config/springmvc/**/*.xml
) 에 적절한 설정 파일을 둡니다.
참고로 spring 설정 파일 생성은 대부분의 IDE 에서 기능을 제공한다. 그 방법은 스스로 알아보길 바랍니다.
아무튼 그렇게 생성된 xml 설정 파일에 다음과 같이 2줄 넣어줍니다.
<!--
spring mvc programming 을 위한 모든 설정들을 자동으로 해줍니다.
이렇게 명시적으로 써줘야 default-servlet-handler 와 함게 쓸 수 있습니다.
-->
<mvc:annotation-driven />
<!--
DispatcherServlet 이 처리하지 못한 url (주로 정적 자원 url) 에 대해서는
DefaultServlet 에게 forward 하는 기능이다. 마지막 라인에 작성하도록 하자.
참고로 이 태그 설명 자체에서 DispatcherServlet url pattern 을 '/' 로 하는 것에 대한 언급이 나옵니다.
-->
<mvc:default-servlet-handler />
위까지 하면 일단 우리가 등록한 DispatcherServlet
에 의한 요청을 받아낼 수 있습니다.
그리고 추가적으로 정적 자원
요청을 처리해주던 DefaultServlet
도 사용하게 됩니다.
여기에 추가적으로 정적 자원의 기본 경로를 수정하게 싶다면 아래처럼 한 줄 더 넣어주면 됩니다.
<!--
DispatcherServlet 에 의해서 만들어지는 동적 자원이 아닌 정적 자원에 대해서
기본 default url mapping 경로를 설정하는 것입니다.
-->
<mvc:resources location="/resources/" mapping="/resources/**"/>
끝!
/
매핑 관련view
관련mvc:resource