본문 바로가기
back/Spring Framework

스프링 property 동적 설정(환경변수 사용)

by 사용자 펭귄대장 2018. 12. 5.

보통 개발환경은 최소 2개 이상으로 나뉜다.

local, dev(개발), oper(운영) 등등..

 

was(웹어플리케이션서버)에 .war(컴파일된 소스)를 deploy(반영/배포) 할 때마다 환경(호출해야하는 이미지서버 도메인주소 등)이 달라지므로 디플로이하는 환경에 맞춰 읽어들여야 할 property 파일들을 달리 처리 해야 한다. (local일땐 local.property를, 개발일땐 dev.property를 ... )

이를 매번 반영할 때마다 환경에 맞게 필요없는 프로퍼티 파일들을 제거한 후 deploy 하기도 번거롭고 

deploy 해놓고 vi (리눅스 visual editor) 로 property 불러오는 스프링 context.xml 을 수정하기도 번거롭다.

 

이런 번거로운 수고를 덜기 위해, 동적으로 프로퍼티를 적용하는 방법은 아래와 같이 몇가지가 있다.

 

1. 서버(WAS)의 ip 값을 기준으로 property 를 분기처리 하는 방법

was 에서 ip를 얻어올 땐 java.net.InetAddress클래스의 getHostAddress() 사용.

가져온 ip주소와 하드코딩 해놓은 was ip 비교하여 property 파일을 분기처리.

서버정보가 바뀔 경우 소스레벨에서의 수정이 필요하므로 그닥 좋은 방법 같진 않다..

[SAMPLE CODE]

1
2
3
4
5
6
InetAddress iAddr = InetAddress.getLocalHost(); 
String adr = iAddr.getHostAddress();
String prefix = ""
if(adr.indexOf("127.0.0.1"> -1){ 
prefix = "local" 
else if (//... 생략
cs

 

2. 서버(WAS)의 환경 변수를 기준으로 property를 분기처리 하는 방법

2-1. was서버 설정

1) 보통 was 실행하는 쉘 스크립트인 start.sh 을 vi 로 들여다 보면 JAVA_OPTS 을 선언한 부분을 찾을 수 있다.

    없다면 start.sh 내에서 호출하는 다른 쉘을 vi 로 또 한 번 들여다보자. 

    찾았다면 JAVA_OPTS="$JAVA_OPTS -Dspring.profiles.active=dev" 와 같이 한 줄을 추가한다.

    못 찾겠으면 

./start.sh -Dspring.profiles.active=dev &

    와 같이 서버구동용 쉘스크립트에 위와 같은 옵션을 주어 실행하면

    위와 같이 할 경우, spring.profiles.active 라는 key 에 dev 라는 value를 갖는 환경변수를 설정한 셈이 된다.

 

2) 스프링 property 설정 수정

1
<util:properties id="properties" location="classpath:sample/properties/conf_#{systemProperties['spring.profiles.active']}.properties" />
cs

이와 같이 설정시

sample/properties/conf_환경변수.properties 프로퍼티를 주입하게 된다.

(환경변수는 로컬 vm arguments(2-1)와 서버별 was 환경변수로 지정한 spring.profiles.active 값)

별다른 코드를 짜지 않아도 위와 같은 설정만으로 서버 환경별 property 를 동적으로 주입받게 되는 것이다.

 

2-2. 로컬설정

사용중인 서버(jboss) 더블클릭 > Open launch configuration >  VM arguments 에

-Dspring.profiles.active=local 추가 (톰캣도 같다)

※ 만약 로컬 환경에서 사용 할 프로퍼티 파일명을 sample/properties/conf_.properties 와 같이 사용할 경우 환경변수를 잡아 줄 필요가 없다.

※ 환경변수(JAVA_OPTS)로 선언할 땐 -Dspring ~ 과 같이 D를 붙여주고 그 외(소스)에는 D를 빼주어야 한다는 걸 주의

 

[사용예]

서버 환경 별로 사용하는 js 가 달라지는 경우 (서버 환경 별로 js 내의 목적지 ip 가 달라지거나 하는 경우)

@Controller :

1
2
@Value("#{systemProperties['spring.profiles.active'].js})"
private String jsFileNm;
cs

JSP :

1
<script src="/resources/js/${jsFileNm}" />
cs

와 같이 사용하여 서버 환경 별로 달라지는 js 파일명을 동적으로 가져다 사용할 수 있다.

 

 

반응형

댓글0