Java/Spring2015. 2. 9. 01:09
반응형

 Spring Boot를 이용하여 웹 어플리케이션을 작성할 경우 일반적인 웹 어플리케이션과 같이 이미 구동된 WAS(Web Application Server)에 반영(Deploy)하는 절차를 통해서 구동되는 것과는 달리 어플리케이션 자체에 WAS를 내장하고 구동하는 형태를 띠고 있기 때문에 수정된 내용을 반영하기 위해서는 가상머신(JVM)을 재기동할 필요가 있었습니다. 이런 경우 Spring에서 제공하고 있는 Spring Loaded를 이용하면 가상머신을 재기동 하지 않고 개발을 진행할 수 있어 개발 생산성을 높일 수 있을 듯 합니다. Spring 레퍼런스 문서상에는 이러한 기능을 Hot Swapping이라는 타이틀로 기술하고 있습니다. 물론 Spring Loaded가 웹 어플리케이션만을 위한 기술은 아닙니다. 데몬과 같이 상주형 어플리케이션을 개발할 경우에도 유용하게 사용할 수 있습니다.


※Hot Swap이란 Java 1.4에서 추가된 Java Platform Debugger Architecture (JPDA)의 기능의 하나입니다.



 먼저 git저장소(https://github.com/spring-projects/spring-loaded)에서 라이브러리를 다운로드 받아서 적당한 위치에 저장합니다.



커맨드 라인 실행

java -javaagent:<path>/springloaded-{버전}.jar -noverify JavaEntryClass

※JavaEntryClass는 main메소드가 있는 진입점 클래스를 의미합니다.


 위의 실행 명령어를 입력하여 Spring Boot 어플리케이션을 실행하면 소스코드 수정후 저장하면 즉시 소스 코드가 반영됩니다. 정확한 내용은 소스코드를 분석해 보지 않아서 모르겠지만 기반이 되는 기술은 위에서 언급한 JPDA인듯하고 실제 반영되는 부분은 Grails2를 이용해서 수행하고 있는듯 합니다. 사실 JPDA에서 제공하는 Hot Swap은 클래스 구조에 영향을 끼치지 않는 범위(메소드 바디 수정)에서만 동작하는데 Spring Loaded의 경우는 메소드/필드/생성자 추가 삭제가 가능합니다. 동작원리는 본 포스팅의 범위를 벗어나므로 따로 분석하지 않겠습니다.(사실은 능력이...) 관심있는 분들은 소스코드를 분석해 보는것도 좋은 공부가 되지 않을지 싶습니다.

 사실 일반적인 프로젝트에서 처럼 WAS에서 어플리케이션 단위로 디플로이 되는 것이 아닌 런타임에 Java 소스 코드 반영이 프로덕트 환경에서 재기동 없는 Hot Swapping이 정확한 동작을 보증할지 의문이 생기기도 하고 위의 커맨드 라인 실행에서 추가한 -noverify 옵션은 바이트 코드의 검증을 생략한다는 무시무시한 설명만 있어서 먼가 꺼림직 하기도 합니다.



IDE환경에서의 실행

 사실 일반적으로 개발을 진행할 경우 커맨드 라인 환경에서 어플리케이션을 실행하는 경우는 드물다고 생각되므로 IDE(통합 개발 환경)환경하에서 실행하는 방법에 대해서 자세히 알아보도록 하겠습니다.


※본 포스팅에서는 일반적으로 많이 사용하는Eclipse(이클립스)를 기준으로 설명하도록 하겠습니다.



Run > Run Configuration 메뉴에서 가상머신 인자로 위와 같이 지정해서 실행하면 위에서 소개한 커맨드라인 실행과 동일하게 작동가능합니다. Main탭에서 엔트리 클래스를 별도로 지정하므로 인자에 엔트리 클래스 명을 기술할 필요가 없다는 점이 다릅니다.



 위에서 소개한 Run Configuration상에 지정하는 방법은 각 개발자가 개별로 설정을 진행해야 하기때문에 프로젝트를 진행하는 관점에서 생각하면 아직 불편합니다. 전체 개발자의 개발환경을 동일하게 구성하기 위해서는 역시 빌드 툴을 통해서 작동할 수 있도록 해주어야 합니다. Maven이용해서 Spring Loaded를 적용하는 방법을 살펴보도록 합시다.


Maven 이용하여 실행하기


	<build>
		<plugins>
			<plugin>
				<groupid>org.springframework.boot</groupid>
				<artifactid>spring-boot-maven-plugin</artifactid>
				<dependencies>
					<dependency>
						<groupid>org.springframework</groupid>
						<artifactid>springloaded</artifactid>
						<version>1.2.1.RELEASE</version>
					</dependencies>
			</plugin>
		</plugins>
	</build>



 위처럼 pom.xml에 플러그인 설정을 추가하고 Maven Build를 이용하여 실행하면 적용됩니다. Maven Build의 Goals에 spring-boot:run 을 지정하여 빌드를 실행하면 Spring Loaded가 적용된 상태로 어플리케이션이 기동됩니다. Gradle의 경우에는 Intellij의 플러그인을 통해서 Spring Loaded가 적재된 상태로 가능한 듯 합니다.



 다음으로 알아볼 내용은 정적 리소스(엄밀한 의미에서 정적 리소스가 아닌 템플릿 엔진의 템플릿 파일을 의미함)의 재로딩 방법입니다. Spring Boot에서는 다양한 템플릿 엔진을 기본적으로 지원하고 있는데 Spring Boot의 기본 설정 파일인 'application.properties'에 아래와 같은 간단한 설정만으로 재로딩이 가능합니다.


 Thymeleaf

spring.thymeleaf.cache=false



 FreeMarker

spring.freemarker.cache=false



 Groovy

spring.groovy.template.cache=false



 Velocity

spring.velocity.cache=false



 본 포스팅에서 소개한 Spring Loaded를 이용하여 Spring Boot를 이용한 개발에 생산성을 더해보도록 합시다. Spring Boot자체가 개발의 편의성을 위해서 나왔는데 이를 좀 더 편리하게 하는 무엇인가가 필요하다는게 좀 아이러니 하기도 합니다.


Posted by Reiphiel