Application Properties는 다양한 환경에서 동작하도록 한다. 여러 가지 properties를 주입하는 방법과 우선순위에 대해 알아보자.
[환경]
- spring-boot: 2.7.14
- java 8
Command Line Properties
Command Line properties는 다른 것보다 항상 우선순위를 갖는다.
[application.yml]
server:
port: 9090
이런 상황에서 application을 실행할 때 command line properties를 추가해서 실행해보자.
java -jar spring-properties-0.0.1-SNAPSHOT.jar --server.port=8080
실행결과
8080으로 실행이 된다. (Command Line properties는 항상 우선순위에 있음)
command line properties
> application.yml
application.properties, application.yml
application.properties와 application.yml이 동시에 존재할 때 어느 파일의 정보를 우선 읽어오는지 테스트
[application.properties]
app.name=app_application.properties
[application.yml]
app:
name: app_application.yml
실행결과
app_application.properties
properties가 yml보다 우선순위를 가진다.
application.properties
> application.yml
Externalized properties
spring.config.location
classpath에 properties를 두지 않고 외부에 properties를 둘 수 있다. Jar 실행 시 외부 파일에 파일을 두어 실행해보자.
[application.properties]
app.name=app_application.properties
[config.properties]
app.name=config.properties
java -Dspring.config.location=classpath:/config/config.properties -jar spring-properties-0.0.1-SNAPSHOT.jar
실행결과
config.properties
properties를 외부 위치에서 가져오도록 했기 때문에 classpath 상에 있는 application.properties는 무시된다.
spring.config.location를 2개 지정
[config1.properties]
app.name=config1.properties
[config2.properties]
app.name=config2.properties
아래와 같이 실행하면
java -Dspring.config.location=classpath:/config/config1.properties,classpath:/config/config2.properties -jar spring-properties-0.0.1-SNAPSHOT.jar
실행결과
config2.properties
spring.config.location에 config2 설정이 앞의 설정을 override하기 때문에 우선된다.
spring.config.additional-location
[config1.properties]
app.name=config1.properties
[config2.properties]
app.name=config2.properties
아래와 같이 실행하면
java -Dspring.config.additional-location=classpath:/config/config1.properties,classpath:/config/config2.properties -jar spring-properties-0.0.1-SNAPSHOT.jar
실행결과
config2.properties
spring.config.location에 config2 설정이 앞의 설정을 override하기 때문에 우선된다.
profile 적용시
[application.yml]
app:
name: app_application.yml
[application-dev.properties]
app:
name: app_application-dev.yml
이런 상황에서 실행을 해보자.
java -Dspring.profiles.active=dev -jar spring-properties-0.0.1-SNAPSHOT.jar
실행결과
app_application-dev.yml
activeProfile을 dev로 실행하면 app.name=app_application-dev.yml 을 읽어온다.
app_application-dev.yml에 값이 없으면 app_application.yml에서 읽어온다.
profile 여러개 지정 시
[application.yml]
app:
name: app_application.yml
[application-dev.yml]
app:
name: app_application-dev.yml
[application-prod.yml]
app:
name: app_application-prod.yml
activeProfile을 dev,prod로 지정하고 실행하면
java -Dspring.profiles.active=dev,prod -jar spring-properties-order-0.0.1-SNAPSHOT.jar
실행결과
app_application-prod.yml
만일 activeProfile을 prod, dev로 지정하고 실행하면 실행결과가 app_application-dev.yml
으로 나온다.
여러 프로파일이 적용된 경우는 last-wins
전략이 적용된다. 즉, 가장 마지막에 설정된 properties가 적용된다는 뜻이다. (마지막 프로파일이 override)
profile과 external property 동시에 지정 시
java -Dspring.config.location=classpath:/config/config.properties -Dspring.profiles.active=dev -jar spring-properties-0.0.1-SNAPSHOT.jar
실행결과
config.properties
External property로 지정한 값이 우선 읽어 온다.
아래와 같이 실행해도 동일하다.
java -Dspring.profiles.active=dev -jar spring-properties-0.0.1-SNAPSHOT.jar --spring.config.location=classpath:/config/config.properties
실행결과
config.properties
SPRING_APPLICATION_JSON 사용
커맨드라인에서 SPRING_APPLICATION_JSON으로 환경변수로 사용할 수 있다.
SPRING_APPLICATION_JSON='{"app": {"name": "spring_application_json"}}' java -jar spring-properties-0.0.1-SNAPSHOT.jar
[application.yml]
app:
name: app_application.yml
실행결과
spring_application_json
spring.application.json을 사용할 수도 있다.
java -Dspring.application.json='{"app": {"name": "spring_application_json"}}' -jar spring-properties-0.0.1-SNAPSHOT.jar
다음과 같이 커맨드라인 인자로 넘길 수도 있다.
java -jar spring-properties-0.0.1-SNAPSHOT.jar --spring.application.json='{"app": {"name": "spring_application_json"}}'