정상혁정상혁

Local 개발환경에서 WAS를 띄우는 여러가지 방식과 장단점에 대해서 정리해 봤습니다. 저는 상황에 따라서 아래 3가지 방법들을 그때 그때 골라서 씁니다.

  1. Eclipse WTP (+Agent based reloading) : WAS를 올린 상태에서 클래스파일을 고칠 때, class파일 1개만 리로딩하는 것이 좋을 때

  2. Maven Jetty plugin : JSP만 고칠 때나 클래스 파일을 고치면 전체 어플리케이션을 reloading을 하는 것이 유리할 때.

  3. Maven Tomcat plugin : JSP만 고칠때. WTP가 뭔가 꼬인 것 같은데 같은 Tomcat에서 같은 에러가 나는지 확인해보고 싶을 때

1. Eclipse WTP(Web Tools Platform) + Agent Based Reloading

Maven 프로젝트가 <packaging>war</packaging>`로 선언된 경우 `mvn eclipse:eclipse 명령을 치면 Eclipse의 dynamic web project로 설정을 만들어 줍니다. Run as Server혹은 server 설정에 drag & drop으로 넣고 Eclipse안에서 서버를 실행합니다. M2Eclipse를 잘 활용하면 local에서는 수동으로 maven 빌드를 돌릴 일이 거의 없어지기도 합니다.

항상 쓰는 것은 아니지만, SpringSource Tool Suite의 Agent based reloading을 이용해서 class파일을 수정하고 빠르게 리로딩을 하기도 합니다. 모든 상황에서 잘 통하지는 않아서, 그냥 WTP만 쓰는 것이 나을 때도 있습니다. 예를 들면 XML파일을 고쳤을 때에는 Agent based reloading에서는 잘 반영되지 않았습니다. JRebel에서는 보다 다양한 경우를 지원하는 것 같지만, 저는 테스트 코드에서 View를 빼놓고는 왠만한 건 실행해보고 WAS를 올리기 때문에 보다 강력한 JRebel이 크게 절실하지는 않습니다

그런데, Eclipse의 Dynamic web project + WTP 환경에서는 JSP를 고칠때의 반영속도가 미묘하게 느린 것 때문에 web context 폴더를 소스폴더 외에도 별도로 잡고, /WEB-INF/classes나 lib까지 다 그 폴더로 복사해서 'add external web module’로 등록해서 쓰시는 분들도 많습니다. 어디가 소스폴더이고 어디가 목적폴더인지 정리되어 있지 않아서 WEB-INF/lib나 WEB-INF/classes같이 꼭 버전관리가 필요없는 파일까지 같이 SVN에 commit하기도 하고, 복잡하게 svn:ignore를 시키는 수고를 하기도 합니다. WTP에서 'Serve modules without publishing ' 옵션을 써서 이를 해결하기도 합니다. 이에 대한 자세한 내용은 아래 자료에 정리되어 있습니다.

다음에 소개하는 maven jetty plugin과 Jetty나 Maven plugin을 써도 JSP가 더 빠르게 반영되기 때문에, WTP의 JSP반영 속도 때문에 일부러 'add external modules’로 WAS를 띄울 필요성은 적어집니다.

2. Maven jetty plugin

pom.xml에 Maven jetty plugin을 설정하면 따로 별도의 WAS설치과정이 필요없이 mvn jetty:run만 치면 바로 WAS가 뜹니다.

<plugin>
    <groupId>org.mortbay.jetty</groupId>
    <artifactId>maven-jetty-plugin</artifactId>
     <configuration>
         <scanIntervalSeconds>3</scanIntervalSeconds>
         <contextPath>/</contextPath>
      </configuration>
       <version>6.1.11</version>
</plugin>

디폴트로 8080포트를 쓰려면 위에서 "connector' 부분의 설정이 없어도 됩니다.

아래의 Tomcat plugin도 마찬가지지만, 이런 plugin이 설정되어 있으면, Eclipse가 없어도 SVN에서 checkout한후바로 명령어 하나로 WAS를 띄워볼 수 있습니다. 그 프로젝트의 개발자가 아닌 사람이 프로젝트를 띄워보거나 가끔 들어가는 프로젝트를 실행할 때도 편합니다.

대부분의 웹어플리케이션은 Servlet Spec만 따라서 개발하므로 Jetty에서 돌아가면 Tomcat에서 거의 돌아간다고 봐도 됩니다. 물론 성능테스트나 프로파일링 같은건 당연히 Tomat을 띄워서 해야겠죠.

다음에 소개할 Maven Tomcat plugin보다 WAS가 뜨는 속도나 리로딩 속도도 빠르다는 느낌입니다. "scanIntervalSeconds" 설정에 따라서 클래스 파일을 고쳐도 리로딩이 잘 됩니다. 'WTP + Agent based reloading’을 쓴다고 해도 뭔가 꼬이는 상황이 발생할 수 있고, 그럴 때는 전체 web context를 로딩하는게 좋습니다. 그런 상황이 많은 개발환경이라면 Jetty plugin이 유리합니다.

단점은 Tomcat이 아닌 Jetty이니 WAS level의 클래스가 던지는 에러메시지가 약간 다르기도 하고, Apache와 연결할때 AJP connector등을 설정할 수 없어서 Apache httpd의 모듈을 사용하는 페이지에는 쓸 수 없다는 점입니다.

3. Maven Tomcat plugin

jetty plugin과 비슷하게 pom.xml에 Tomcat plugin을 설정하고, mvn tomcat:run 을 치면 WAS 설치가 필요없이 Tomcat이 뜹니다.

설정은 아래와 같습니다.

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>tomcat-maven-plugin</artifactId>
    <version>1.1</version>
    <configuration>
        <path>/</path>
        <serverXml>$\{basedir}/src/main/webapp/server.xml</serverXml>
    </configuration>
</plugin>

만약 AJP설정 같은게 필요없어서 server.xml을 지정할 것까지도 없고 포트만 지정하면 된다면 아래처럼 하면 됩니다.

<configuration>
    <path>/</path>
    <port>8080</port>
</configuration>

그리고 port도 지정할 필요가 없이 디폴트인 8080으로 띄우고 싶다면 "<port/>" 부분도 생략해도 됩니다.

장점은 Tomcat이니까 다른 개발서버, 운영서버와 똑같은 환경이고, 같은 에러메시지가 뜬다는 점입니다. 그리고 server.xml을 지정할 수 있으니 AJP연결등으로 Apache와 연동하는 개발에도 쓸 수 있습니다. WTP가 꼬인 것 같을 때 mvn tomcat:run으로 확인해보고 다시 Eclipse의 WTP로 돌아가기도 합니다.

위 Plugin은 org.codehaus.mojo의 아래에 존재했지만, 최신 버전은 아래 링크의 Apache Tomcat 프로젝트 산하로 들어갔습니다.

Tomcat7은 아래와 같이 지정합니다.

    <plugin>
        <groupId>org.apache.tomcat.maven</groupId>
        <artifactId>tomcat7-maven-plugin</artifactId>
        <version>2.2</version>
        <configuration>
            <path>/</path>
        </configuration>
    </plugin>

mvn tomcat7:run 으로 실행할 수 있습니다.

마찬가지로 Tomcat6 plugin도 활용할 수 있습니다.

    <plugin>
        <groupId>org.apache.tomcat.maven</groupId>
        <artifactId>tomcat6-maven-plugin</artifactId>
        <version>2.2</version>
        <configuration>
            <path>/</path>
        </configuration>
    </plugin>

mvn tomcat6:run 으로 실행합니다.

참고로 spring-loaded를 함께 쓰면 Tomcat재시작 횟수를 줄일수 있습니다. ( https://gist.github.com/benelog/aee89ac5b6ff896b2e0f 참조 )