[Spring] EnvironmentCapable - Property 사용하기
[Spring] EnvironmentCapable - Property 사용하기
ApplicationContext는 EnvironmentCapable을 상속받으며, EnvironmentCapable이 제공하는 주요 기능에는 profile과 property가 있다.
본 포스팅에서는 그 중 property에 대해 살펴본다.
1. Property 기능
어플리케이션에서 사용되는 여러가지 key, value 쌍으로 제공되는 프로퍼티에 간편하게 접근할 수 있는 기능이다.
Spring은 프로퍼티에 '계층형'으로 접근하는데 계층형으로 접근한다는 말은 프로퍼티에 우선순위가 있다는 뜻이다.
프로퍼티는 다양한 형태로 어플리케이션에 제공될 수 있는데 key가 동일하면 우선순위가 더 높은 프로퍼티의 value를 가져온다.
2. Property 접근 방법
프로퍼티가 어떻게 주어지든 Environment 객체로 가져온다는 접근 방법은 동일하다.
1) JVM 시스템 프로퍼티
JVM 시스템 프로퍼티는 -D 옵션을 사용해서 주어지는 VM 프로퍼티를 의미한다.
IDE의 실행 환경 설정에서 -D 옵션을 사용해서 프로퍼티를 설정해보자.
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.context.ApplicationContext;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;
@Component
public class AppRunner implements ApplicationRunner {
@Autowired
ApplicationContext ctx;
@Override
public void run(ApplicationArguments args) throws Exception {
Environment environment = ctx.getEnvironment();
System.out.println(environment.getProperty("app.name"));
}
}
설정된 프로퍼티는 Environment 객체로부터 getProperty() 메소드를 사용해서 key값을 넘겨 가져올 수 있다.
Environment 객체는 ApplicationContext의 getEnvironment()로 얻는다.
실행 결과
2) 프로퍼티 파일(.properties)
프로젝트 classpath 내에 app.properties 파일을 만들고 프로퍼티를 설정한다.
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.PropertySource;
@SpringBootApplication
@PropertySource("classpath:/app.properties")
public class Demospring52Application {
public static void main(String[] args) {
SpringApplication.run(Demospring52Application.class, args);
}
}
그리고 @Configuration이 있는 클래스에 @PropertySource 애노테이션을 사용해서 프로퍼티 파일의 경로를 설정한다.
꺼내는 방법은 JVM 프로퍼티와 동일하다.
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.context.ApplicationContext;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;
@Component
public class AppRunner implements ApplicationRunner {
@Autowired
ApplicationContext ctx;
@Override
public void run(ApplicationArguments args) throws Exception {
Environment environment = ctx.getEnvironment();
System.out.println(environment.getProperty("app.about"));
}
}
실행 결과
3. 우선순위
JVM 시스템 프로퍼티와 프로퍼티 파일 중 우선순위가 높은 것은 무엇일까?
똑같은 key를 설정해서 결과를 확인해보자.
JVM 프로퍼티에는 app.name=spring5demo를, 프로퍼티 파일에는 app.name=spring5core를 값으로 설정했다.
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.context.ApplicationContext;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;
@Component
public class AppRunner implements ApplicationRunner {
@Autowired
ApplicationContext ctx;
@Override
public void run(ApplicationArguments args) throws Exception {
Environment environment = ctx.getEnvironment();
System.out.println(environment.getProperty("app.name"));
}
}
실행 결과
둘 중 JVM 프로퍼티의 값이 출력되었다.
즉 프로퍼티 파일보다 JVM 프로퍼티의 우선순위가 더 높다.
4. [참고] Spring Boot에서 프로퍼티 접근하기
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.context.ApplicationContext;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;
@Component
public class AppRunner implements ApplicationRunner {
@Autowired
ApplicationContext ctx;
@Value("${app.name}")
String appName;
@Override
public void run(ApplicationArguments args) throws Exception {
Environment environment = ctx.getEnvironment();
System.out.println(environment.getProperty("app.name"));
System.out.println(appName);
}
}
Spring boot에서 제공하는 기능을 사용하면 @Value 애노테이션으로 프로퍼티 값에 접근할 수 있다.
- 관련 글
JAVA 웹 프로젝트에서 Properties 파일 활용하기
[Spring] EnvironmentCapable - Profile 사용하기
References
'Spring Framework > Spring Core' 카테고리의 다른 글
[Spring] Resource 추상화 (0) | 2021.04.22 |
---|---|
[Spring] ResourceLoader로 텍스트 파일 출력하기 (Java 11) (0) | 2021.04.22 |
[Spring] ApplicationEventPublisher를 이용한 이벤트 프로그래밍 (0) | 2021.04.21 |
[Spring] Spring 어플리케이션 메시지 다국어 및 재로딩 처리 (0) | 2021.04.21 |
[Spring] EnvironmentCapable - Profile 사용하기 (0) | 2021.04.21 |
[Spring] 빈의 Scope - 싱글톤과 프로토타입 (0) | 2021.04.21 |
[Spring] Component Scan과 Function을 사용한 빈 등록 방법 (0) | 2021.04.21 |
[Spring] @Autowired 동작 원리 - BeanPostProcessor (0) | 2021.04.21 |