Knowledge

[Knowledge] JVM 실행옵션을 사용하여 운영/개발 Properties 분리 실행하기

Jeong Jeon
반응형

Spring Project중 리스너를 사용한 데몬을 개발하던 중

로컬환경과 배포환경이 다르기 때문에, Properties를 분리하여 사용하고자 했다.

 

처음에는 Properties파일 안에 local / dev 두개를 같이 넣어놓고 , 개발할때는 배포환경 주석/ 배포할때는 개발환경 주석 처리하고 배포하였다.

 

하지만 데몬이 늘어날수록 너무 귀찮아지는것...!

매번 저렇게 할수 없어서 방법을 찾아서 편하게 배포할 수 있도록 수정하고싶었다.

 

기존 War로 말아서 Tomcat으로 실행시킬때는 톰캣 설정파일에 아규먼트를 전달해주면 되서 간단하게 사용했는데,

-fat.jar로 말아서 배포하여 사용하니 설정을 어디에 잡아야하는지 몰랐다... 

아직 개발 0년차....ㅎ;

 

찾아보니 JVM -D 옵션을 통해 아규먼트를 아주 쉽게 전달할수 있었다.

 

방법

 

1. .properties파일

properties 파일 자체를 개발환경과 배포환경을 나누었다.

dev.mariaDB.properties
dev.redis.properties
local.mariaDB.properties
local.redis.properties

각각 properties안에는 환경에 맞는 설정을 잡아주면 된다.

 

 

2. application-context.xml 파일

간단하게 아규먼트를 전달할때의 key 그대로 ${}를 사용하여 넣어주면 된다.

	<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
	    <property name="locations">
	        <list>
	            <value>classpath:config/${spring.profiles.active}.mariaDB.properties</value>
	            <value>classpath:config/${spring.profiles.active}.redis.properties</value>
	        </list>
	    </property>
	    <property name="ignoreUnresolvablePlaceholders" value="true"/>
	</bean>

 

3. 사용처.java

@PropertySource("classpath:config/${spring.profiles.active}.redis.properties")

우선 프로퍼티 소스를 사용하고자 한다면 해당 Annotation을 사용하여 불러올수있다.

 

Properties prop = new Properties();
ClassLoader cl;
cl = Thread.currentThread().getContextClassLoader();
String profiles = System.getProperty("spring.profiles.active");
//내가 전달한 Argument 확인
System.out.println("######### profiles : "+profiles+" #########");
//해당 파일 가져와서 내용물 확인
URL url = cl.getResource("config/"+profiles+".redis.properties");
prop.load(url.openStream());
String hostName 		= prop.getProperty("test.redis.hostName");

System.getProperty()를 통해 내가 전달한 아규먼트를 가져올수 있다.

이때 Key는 전달할때 설정한 Key로 꼭 해야된다!

 

주의! 

 

4.jar파일 실행

실행 스크립트에서 -D 옵션을 사용하여 key=value를 설정하며 실행하면 JVM에서 System으로 값을 읽어간다.

재밌다.

 

 

추가

-2021-04-02

- PowerSell을 사용했을때 java -jar -Dspring.profiles.active=local 프로젝트명 을 했을때는 -D옵션의 .을 인식하여 키를 읽지 못했다. => cmd shell을 사용했을때 문제없음 확인.

반응형