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을 사용했을때 문제없음 확인.
'Knowledge' 카테고리의 다른 글
[Knowledge] HttpSession이란 언제 만들어지는것일까? (0) | 2021.06.08 |
---|---|
[Knowledge] Oauth란? Oauth 기본 개념 (0) | 2021.03.18 |
[Knowledge] Modal사용시 외부 클릭했을때 Modal 닫힘 방지 (0) | 2021.03.12 |
[Knowledge] Cookie 와 Session과 Cash 정리 (0) | 2021.02.08 |
[Knowledge] WebStorage(Local Storage/Session Storage) 및 Cookie 개념정리 (0) | 2021.02.08 |