Eclipse WTP Root Context Path 관련 버그 회피하기 프로그래밍

Eclipse 3.6 Helios WTP 에는 웹 애플리케이션의 Context Path가 "/" 로 지정돼 있고 Tomcat을 사용할 경우 개발에 지장을 초래하는 다양한 버그가 존재한다.
  1. Publishing 이 제때 안 이뤄진다. 그래서 Tomcat을 실행해 보고, Publishing 이 안돼 있는 상태이면 Tomcat을 끄고 다시 켜야한다.
  2. 파일이 변경 될 때마나 work 디렉토리를 통째로 삭제해 버린다. 버그리포팅
  3. 내 생각에는 2번 현상 때문에 *.jsp, *.tag 파일들이 컴파일이 잘 됐음에도 JSP/Tag 컴파일된 클래스에 대한 ClassNotFoundException이 수시로 발생한다. 이건 톰캣을 다시 껐다 켜기 전에는 해결이 안 된다.
나를 가장 괴롭힌 것은 3. 번 오류이다. 정말 사람 짜증을 극한으로 몰아붙이는 버그이다. 우리 팀 팀원들이 이 버그 때문에 WTP를 통하지 않은 채 Jetty를 바로 띄워서 사용하기도 한다.

이때문에 IDE를 바꿀 생각을 하고 Netbeans, IntelliJ IDEA를 테스트 해 보았으나 우리의 개발 환경 Spring 3 + JPA 2(Hibernate 3.5) + Maven 다중 Profile 환경에서 아무런 문제 없이 깔끔하게 프로젝트가 설정되는 IDE가 단 한개도 없었다.

물론 IDE의 설정을 어찌 어찌 파고들면 어찌 어찌 해결책을 찾을지도 모르지만, 이미 익숙한 IDE(Eclipse)를 버리고 그런 삽질을 또 처음부터 하고 싶지는 않았다.

그럼 Eclipse에서의 해결책은? "/" Context Path를 사용하지 말라.

그러면 이 모든 문제가 해결 된다.

하지만 평소에 HTML에 경로를 지정할 때, 혹은 CSS 파일에서 절대 경로로 배경화면 이미지 URL을 지정했을 경우 등에서 다양한 문제가 발생한다.

제일 좋은 것은 항상 ${request.contextPath}/board/1 이런 식으로 모든 URL에 항상 ContextPath를 명기하는 것이다. 이렇게 하면 어떠한 컨텍스트 패스를 지정해도 잘 작동한다. CSS 파일에서는 항상 상대 경로로 백그라운드 이미지를 지정하면 된다.

${request.contextPath}가 제대로 명시안된 상태로 개발하는 기존의 환경을 그대로 유지하고자 할 때의 해결책은 Tomcat의 Context Path를 "/" 가 아닌 무언가로 명시하되, Apache 등의 서버를 연동하고, 이 연동에서 강제로 ContextPath를 제외한 주소로 연결 가능하게 하는 것이다.

ContextPath 가 "/web" 이고, 개발 서버의 hostname을 development 라고 했을 때 Apache Virtual Host 설정을 다음과 같이 했다.
<VirtualHost *:80>
    ServerName development
    ServerAdmin webmaster@localhost
    DocumentRoot /home/kwon37xi/tmp/apache-tomcat-6.0.30/webapps/web
    <Location />
        ProxyPass http://localhost:8080/web/
        ProxyPassReverse http://localhost:8080/web/
        ProxyPassReverseCookiePath /web /
    </Location>
</VirtualHost>
물론 mod_proxy_http가 활성화 돼 있어야  하고, DocumentRoot 등은 잘 알아서 할 수 있으리라 믿는다.

여기서 주의해서 봐야 할 곳은 ProxyPassReverse와 ProxyPassReverseCookiePath 이다.

ProxyPassReverse 설정의 역할은 Redirect등을 할 때 강제로 붙어오는 /web/board/1 등의 ContextPath가 지정된 주소를 자동으로 /board/1 식으로 변환해준다.

ProxyPassReverseCookiePath 는 세션과 쿠키를 사용할 경우 필수이다. Tomcat은 세션 쿠키를 생성할 때 Path로 ContextPath를 지정해서 생성한다. 따라서 세션 쿠키는 ContextPath를 뺀 주소(/board/1)등에는 전달이 안된다. 그러면? 당연히 평생가도 로그인을 할 수 없다. ReverseCookiePath는 Cookie의 Path값에서 ContextPath를 제거해준다.

이제부터는 Tomcat 배포한 웹 애플리케이션은 /web 컨텍스트 패스이면서  http://development/board/1 식으로 URL을 요청해 가며 테스트하는게 가능해진다.

이 상태로 개발을 하면 맨 위에 말한 Eclipse WTP + Tomcat 환경의 버그가 하나도 발생하지 않게 되어 상당히 쾌적해 진다.
다시 만난 Eclipse야 반가워. 그래도 언능 버그를 고쳤으면 좋겠다.

덧글

  • Ditongs 2012/09/24 10:13 # 삭제

    그렇군요. 저도 계속 같은 오류로 인해서 엄청난 시간이 소요되고 있습니다. Context Path에 /를 사용하지 말아야 하다니.. 이미 관련 소스가 너무 많아져서 수정이 불가능한 상황에 놓였네요 ^^;
  • 권남 2012/09/24 11:14 #

    그래도 날 잡아 고치는게 그로인해 모든 팀원들이 빼앗기는 시간의 총 합보다는 적을겁니다.
    물론 스트레스도 줄겠지요. ^^
    버그 리포팅은 해서 Eclipse쪽에서도 알고는 있는데, 고쳐주질 않을 모양입니다.
※ 로그인 사용자만 덧글을 남길 수 있습니다.