본문으로 바로가기

스프링을 공부하다가 보면 경로들에 <c:url> 태그들을 사용하는 경우가 있다. 특히 js파일이나 이미지파일에 <c:url> 태그를 붙이는 걸 많이 볼 수 있다. 왜 그냥 경로만 쓰지않고 <c:url> 태그를 사용하여 경로를 표시하는 것일까?


<c:url> 태그를 사용하게 되면 URL에 자동적으로 context path가 붙는다.

그래서 <c:url> 태그를 사용하게 되면 context path를 변경하더라도 URL을 수정할 필요가 없다.


예를 들면 개발 서버의 context path가 "/dev" 이고 로컬의 context path가 "/loc" 라고 해보자. 그러면 개발 서버에서는 "/dev/resources/js/..." 라고 선언해야 하고 로컬에서는 "/loc/resources/js/..." 라고 선언해야 한다. 그렇게 되면 계속 경로를 수정해줘야 한다. 여기에서 <c:url> 태그를 이용해서 선언을 한다면('<c:url value="/resrouce/js/...">') 자동적으로 context path 정보를 가져와서 URL 앞에 붙여주기 때문에 수정할 필요가 없어진다.


하지만 <c:url> 태그를 사용하게 되면 주소창에 ;jsessionid= 이 생기는 경우가 있다. 왜 ;jsessionid= 가 생길까? 서버에서 클라이언트에 세션을 유지하기 위해서 "쿠키"를 생성해야 하는데, 클라이언트가 쿠키 생성을 허용 여부가 불확실하면 ;jessionid= 를 붙여서 세션을 유지한다고 한다. 이렇게 ;jsessionid= 가 붙게 되면 리소스 파일들이 깨져버리는 경우도 생긴다. 그럼 어떻게 해결해야 할까?


1. ${pageContext.request.contextPath} 사용

<c:url> 태그 대신에 경로 앞에 ${pageContext.request.contextPath}를 붙이면 된다.

${pageContext.request.contextPath}/resources/js/...

 


2. <tracking-mode> 태그 추가

강제로 끄는 방법이라고 한다. 근데 강제로 꺼도 되는 건가 싶어서 찾아봤는데 문제가 생긴다는 글은 못봤기 때문에 이걸로 설정하려고 한다. 참고로 톰캣의 버전에 따라 다르다고 한다. (Tomcat 7버전 이상)


Servers 폴더 -> Tomcat v9.0 Server at localhost-config -> web.xml

프로젝트의 web.xml 파일이 아닌 서버의 web.xml 파일로 가야 한다.


web.xml (servers 의 web.xml)

1
2
3
4
    <session-config>
        <session-timeout>30</session-timeout>
        <tracking-mode>COOKIE</tracking-mode>
    </session-config>
cs

ctrl+f 를 이용해서 <session-config> 태그를 찾아서 03행의 <tracking-mode> 태그를 추가하면 된다. 참고로 <tracking-mode> 태그는 <session-timeout> 태그 밑에 있어야 한다. 위에 있으면 오류가 생긴다!



잘 사용하던 프로젝트에 주소창에 갑자기 jsessioid이 나타나서 당황했다. 그래서 찾다가 그냥 모든 경로에 <c:url> 태그를 사용했더니 jsessionid가 나타나지 않았다(;;) 유레카!!(?) 섞어 쓰면 안되는 건가? ㅎ.. 그냥 위의 두 방법이 마음에 안들었었는데... ㅎ 다음에 또 나타나면 그때 다시 보자..ㅎ


++ 추가 (2018.11.26)

크롬의 설정에서 쿠키를 삭제하고 톰캣을 실행해보니 jseesionid가 나왔다. 처음에 jsessionid가 나타난 뒤에 쿠키를 삭제하지 않는다면 다음 번엔 나타나지않았던 것이였다. 그래서 나는 <c:url> 태그를 적었더니 사라졌다고 착각했던 거였다. (민망) (뻘줌) 그래서 2번의 방법으로 설정을 하니, 쿠키를 삭제하고 톰캣을 실행해도 jsesionid가 더이상 나타나지 않았다.