servlet-context.xml(하위 컨테이너) 파일에서 /resources/** 하위의 모든 파일들을 정적자원으로 두어 해당 파일들을 추후 정적자원을 관리하는 container로 넘기는 역할을 수행합니다.
그런데 이번 프로젝트 url을 github처럼
'기본도메인/{ } /../...' 이런식으로 작성하기로 했습니다.
그러다 보니 controller에서
이런식으로 ///... 로 짜게 되었습니다.
해당 경로의 뎁스와 동일한 resources/assets/example.css라는 정적 자원을 호출할 일이 생겼는데
이렇게 해당 경로를 하나의 url로 인식하여 controller에서 받아버린 겁니다. 밑에 보면 계속 db에 연동을 시도합니다.
이런 현상이 발생하는 이유는 servlet-context.xml에 등록한 <resourcse ...>은 우선 순위가
이 녀석보다 낮아 정적 자원들이 해당 경로의 depth 구조와 일치하면 controller가 낚아채 가서 resources 폴더 아래에 있는 자원들을 제대로 불러오지 못하기 때문입니다.
이런 경우가 발생했을 경우 해결 방법은 2가지가 있습니다.
첫번째.
Controller에서 pathvariable의 자리에 정규식을 사용하여 resources를 막아버린다.
이렇게 controller에 resources를 추가하게 된다면 해당 경로에 resources로 시작하는 모든 경로를 받지 않기 때문에 제대로 servlet-context에서 resources를 정적 자원으로 넘겨줍니다.
두번째.
<annotation-driven>을 선언하게 되면 RequestMappingHandlerMapping 컨테이너가 자동으로 생성하게 되는데 이 컨테이너의 우선순위가 0입니다. 이 녀석의 우선 순위를 <resource... > 높게 잡아주면 됩니다.
여기서 주의해야할 점은
1. annotaion-driven보다 상위에 선언해 주어야 하는 겁니다.
밑에 선언해 주게 되면 annotation-driven이 선언될 때 생성한 RequestMappingHandlerMapping이 order=0인 채로 등록되어서 order 가 변경되지 않습니다.
2. bean에 id를 선언하면 안됩니다.
id를 주게 되면 annotation-driven이 자동으로 생성할 RequestMappingHandlerMapping과 다른 녀석이라 판단해 다른 객체가 생성됩니다. 그러니 여전히 order가 뒤로 밀리지 않지요.
그 후 <resources에 order=0을 주어 우선 순위를 당깁니다.
지금 저희 프로젝트에는 두번째 방법을 택하고 있으며 만약 문제가 생길 시
WebMvcContigurationSupport의 RequestMappingHandlerMapping 쪽을 손보면 될 듯 합니다.
Uploaded by Notion2Tistory v1.1.0