대빵's Blog

Spring mvc, restful, web.xml 설정하기 본문

개발관련

Spring mvc, restful, web.xml 설정하기

bigzero 2016. 11. 9. 13:37

사실 제대로 알고 있다면 그닥 어렵지 않을 껀데 어설프게 알고 있어서 더 헷갈리는 거 같다.


일단 문제핵심은 Restful을 제대로(?) 사용하기 위해서 web.xml 에 Dispatcher 설정에서 url-pattern에 "/" 를 지정하면서 문제가 발생한다.


그럼 그렇게 안하는 경우 부터 보자.

web.xml 에 일반적으로 Dispatcher 설정에서 url-pattern 에 *.do 지정한다.

그러면 WAS에서(web.xml 은 WAS 의 설정이다.) *.do 로 오는 Request 이외에 다른 것들은 Dispatcher 로 안보낸다. 그래서 서블릿관련 호출은 *.do, 다른건 spring 과 관계없음. 그냥 WAS 에서 처리......명확하다...


web.xml 에 url-pattern 을 / 로 지정한다. 이때 부터 뭐가 서블릿인지 알 수가 없다. Dispatcher는 일단 모든 Request 를 받고 자기가 handling 할 수 있는 서블릿과 JSP forwarding 이외에 다른 것들은 아몰랑~~~~404 not found 떨어진다...


그래서 이렇게 / 로 지정하는 경우에 과거에는 


1, web.xml 에 내가 사용할 확장자를 다 명시해서 어디에 있다고 지정한다. /img/*.jpg , /html/*.html, /html/*.css 같은 것들이 어디 있다고 구체적으로 지정하면 WAS는 web.xml 을 읽어들여서 우선순위에 의해서 이런 것들을 먼저 찾고 나머지는 Dispatcher 로 보낸다.....그래서 설정이 귀찮고 지저분하다...가끔 엑셀파일이라도 떨궈 줄라면 web.xml 을 건드려야 한다...이걸 초급개발자 시키면 WAS 설정을 개판으로 만들어서 개짜증이 밀려오기도 한다...............


2. 아니면 Dispatcher를 /app 라는 주소로 오는 경우만 Request를 받도록 하여 /app 가 아니면 다른 경로의 자원들(jpg, html 등) 을 찾을 수 있도록 한다... 물론 /app 라는 경로는 물리적으로는 없는 논리적인 RequestMapping 주소이다. 이 경우 모든 서블릿관련 Request 주소에 /app 가 들어가야 된다. 그래야 Dispatcher 가 작동한다. 그나마 깔끔하지만 view 에서 jsp 에 action url을 지정할때 모두 /app 를 붙여야 한다.........그래서 util 같은 거 만들어서 property 로 지정한다.....가끔 바뀌기도 하므로.......


Spring 3.0.4 부터 spring servlet configuration 에 <mvc:default-servlet-handler /> 가 추가 되었다. 이게 하는 것은 단순하다. Dispatcher 에서 아몰랑~~~ 하면 다시 WAS로 제어권을 넘긴다.....그럼 WAS가 봐서 jpg 등이 있으면 ok, 아니면 WAS 도 아몰랑~~~~404 발생한다.


결국 WAS는 정적자원과 동적자원 모두 가지고 핸들링 가능한데 Dispatcher 는 동적자원만 처리 가능하므로 Dispatcher 에서 / 로 지정하는 경우 정적자원 처리가 불가능해서 발생하는 문제를 해결하기 위한 방법으로 생긴거다...


참고로 모든 WAS에는 기본적인 servlet handler 와 jsp handler 가 있고 임의로 이름을 줄 수 있는데 이건 web.xml 에 보면 servlet-name 에서 지정되어 있다.

톰캣은 기본적인 servlet handler 이름이 default 이고 spring mvc tag 내에 이미 들어 있으므로 그냥 <mvc:default-servlet-handler /> 게 써도 적용되지만 이름을 다른 걸로 바꾼 경우 <mvc:default-servlet-handler default-servlet-name="다른이름이닭" /> 이렇게 줘야 한다.


P.S "다른이름이닭" 부분에 web.xml 에 dispatcher 이름(보통 아무생각 없이 spring 이라고 copy&paste 한다.)을 주면 Request 가 Dispatcher 와 WAS 사이를 무한 루프 도는 희한한 광경을 볼 수 있다.....ㅡㅡ;