일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 실해하지 않는
- SW설계
- ASUS 공유기
- 소프트웨어설계
- Data Transfer Object(DTO)
- LG그램2017
- USB-C충전
- 프로젝트관리
- SW분석
- Value Object(VO)
- 구글캘린더 검색
- tvheadend
- open cursors
- SpringBoot
- SI와 SM 차이점
- angular 6
- docker 네트워크
- 객체설계
- CBD 단점
- sonoff
- maven #junit
- 경력개발자
- 네트워크 기본개념
- EXK
- USB-C to HDMI 아답터
- Tomcat error-page version
- 자바튜닝
- LAN WAN
- 자바스크립트 JQuery
- 자바개발
- Today
- Total
대빵's Blog
Spring mvc, restful, web.xml 설정하기 본문
사실 제대로 알고 있다면 그닥 어렵지 않을 껀데 어설프게 알고 있어서 더 헷갈리는 거 같다.
일단 문제핵심은 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 사이를 무한 루프 도는 희한한 광경을 볼 수 있다.....ㅡㅡ;
'개발관련' 카테고리의 다른 글
Spring Service 설계와 Transaction 처리 (0) | 2016.11.16 |
---|---|
이클립스 git id/password 저장 (0) | 2016.11.16 |
Spring Junit 테스트 에러 해결하기 (0) | 2016.07.20 |
Tomcat 7 에서 ROOT 로 Deploy 하기 (0) | 2016.05.26 |
구글 엑셀에서 COUNTIFS 에 공백아님(is not blank) 조건 표현하기 (0) | 2016.05.19 |