[Spring] EnvironmentCapable - Property 사용하기

2021. 4. 21. 02:04 Spring Framework/Spring Core

 

[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

인프런 - 백기선님의 스프링 프레임워크 핵심 기술

 

출처 : atoz-develop.tistory.com/entry/Spring-EnvironmentCapable-Property-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0?category=869243