[Spring-legacy] DispatcherServlet Url Pattern = / 로 하기 위한 작업 정리

식빵·2022년 6월 27일
0

spring-legacy-configure

목록 보기
1/7
post-thumbnail

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 가 정확히 무엇인지 모르겠으면 이 영상을 한번 보는 것을 적극 추천합니다.


📐 web.xml

<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 하게 됩니다.




📐 dispatcher servlet 을 위한 spring 설정 파일

위와 같은 현상을 해결하기 위해서 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/**"/>

끝!



🌎 참고

profile
백엔드를 계속 배우고 있는 개발자입니다 😊

0개의 댓글