본문 바로가기
JAVA/Spring

web.xml 전체경로(.do)와 Servlet기반 경로 매칭 설정(/폴더)

by 설총이 2018. 9. 12.

- 전체경로와 Servlet기반 경로 매칭 설정


우리는 지금까지 확장자 기반으로 servlet을 실행시켜왔다

ex)


1
2
3
4
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
cs




근데 확장자 기반이 아닌 디렉토리로 정하는 기법도 사용되는데


1
2
3
4
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/game/*</url-pattern>
</servlet-mapping>
cs



폴더명or디렉토리명의 경로로 이렇게 사용할 수 있다.




근데 단점이,

예를들어 우리가 요청하는것은 "/game/info" 경로인데,


1
2
3
4
5
@RequestMapping("/game/info")
public String info(..){
...
}
cs



<url-pattern>의 값으로 디렉터리를 포함한 패턴을 지정하게 되면

Servlet 경로는 "/game"이 되며, Servlet 경로를 제외한 나머지 경로를 이용해서

@RequestMapping Annotation의 값과 매칭 여부를 판단하게 되므로, 

실제 비교할 때 사용되는 요청 URI는 "/info"가 된다.


/game/info로 요청해야 우리가 원하는 작업이 시작이 되는데 /info로 찾아지게되는것이다



그걸 해결하기위해선


1
2
3
4
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" 
p:alwaysUseFullPath="true"/>
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" 
p:alwaysUseFullPath="true"/>
cs


라고 걸어주어야 서블릿경로가 짤리지않고 우리가 원하는 경로대로 시작이 된다.


디렉토리 기반으로 경로 매칭을 쓰는 이유는

레스트풀(?)에서 확장자 기반이 아닌,

디렉토리 기반으로 해서 데이터를 같이 전송하는(?) 방식으로 많이 쓰이기때문에 알아두어야한다.


== 아직 써보지않아 무슨 이야긴지 이해를 못했지만, 나중에 쓰게될것같다. 일단 정리.....