Spring Loaded로 Tomcat 재시작 없이 수정한 클래스 반영하기

수정한 클래스 파일만 재로딩하는 Spring Loaded를 tomcat7-maven-plugin, Eclipse WTP와 함께 사용하는 방법을 정리합니다.

Note

2014년에 gist로 작성했던 글을 2026년에 이 블로그로 옮겼습니다. 발행 날짜는 gist 작성일(2014-10-13)에 맞췄고, 내용도 그 시점 기준입니다. 원본에 있던 Eclipse 설정 화면 스크린샷 3장은 원본 이미지 서버가 없어져 싣지 못했습니다.

Spring Loaded는 개발 환경에서 .java 클래스를 수정했을 때 변경된 클래스 파일만 재로딩하는 도구입니다. Local PC에서 수정과 Tomcat 재시작을 반복하는 시간을 줄여 줍니다.

다만 JRebel도 그러하듯이 모든 경우에 완벽한 리로딩이 되지는 않습니다. 메소드 추가·수정은 잘 반영됩니다. 그러나 아래와 같은 경우에는 자동 반영이 되지 않습니다.

  • 상속 구조의 변경

  • Reflection 정보가 Cache된 것

  • XML 설정 수정 (프레임워크에 특화된 구현이 들어가지 않으면 당연히 어렵습니다.)

그래도 많은 경우 Tomcat 재시작 없이 개발을 이어갈 수 있다면 생산성에 도움이 되리라 생각합니다. 이를 tomcat-maven-plugin과 함께 사용하는 방법을 정리합니다. Linux 명령어를 기준으로 썼지만, 윈도우에서도 같은 역할을 하는 작업을 수행하면 됩니다.

다운로드

참조할 디렉토리에 다운로드합니다. tomcat-maven-plugin을 사용할 예정이면 `pom.xml`이 있는 디렉토리에 받기를 권장합니다.

wget -O springloaded-1.2.1.jar http://search.maven.org/remotecontent?filepath=org/springframework/springloaded/1.2.1.RELEASE/springloaded-1.2.1.RELEASE.jar

Spring Loaded의 GitHub에서 최신 버전을 확인한 후 다운로드하는 것이 좋습니다.

tomcat7-maven-plugin으로 실행

1. 환경변수 설정

export MAVEN_OPTS="-javaagent:springloaded-1.2.1.jar -noverify"

2. pom.xml에 Tomcat7 plugin 추가

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

3. 실행

mvn tomcat7:run

Jetty나 Tomcat 6을 쓰고 싶다면 Local 개발환경에서 WAS를 띄우는 여러가지 방법을 참고합니다.

Eclipse WTP에서 실행

1. java agent 설정

Eclipse 메뉴의 Run > Run Configurations에서 Tomcat 실행 설정을 찾은 다음, Arguments 탭의 VM arguments란에 `-javaagent`를 추가합니다. 한 번이라도 Tomcat을 WTP로 실행해야 해당 설정이 생깁니다.

-javaagent:/다운로드경로/springloaded-1.2.1.jar -noverify

2. 기본 reload 설정 제거

Servers 뷰에서 Tomcat을 선택하고 Overview 탭의 Server Options란에서 'Modules auto reload by default’를 선택 해제합니다. Modules 탭의 해당 모듈 설정에서도 Auto reloading이 해제되어 있는지 확인합니다.

main 메소드를 직접 실행하는 경우

Spring Boot나 Embedded Tomcat, Jetty를 이용해서 main 메소드로 직접 WAS를 띄우는 경우도 있습니다. 이때도 Run > Run Configurations의 Arguments 탭에서 VM arguments란에 같은 -javaagent 설정을 추가합니다.

통합 테스트를 위한 내장 Tomcat, tomcat-bed 시간대 DB에서 우리나라 시간의 오류