본문 바로가기
Spring

[Spring] Environment - Property

by dbjh 2020. 1. 7.
반응형

이번 글에서는 ApplicationContext가 가지고 있는 기능들 중 Enviroment의 Property 기능이다.

여기서 말하는 Propery란, 애플리케이션에 등록되어 있는 여러가지 Key - Value 쌍으로 정리되어 있는 값을 Property로 접근할 수 있는 기능을 말한다. Property는 계층형으로 접근을 한다. 쉽게 말해 여러가지 형태로 Property 사용이 가능한데, 우선순위 별로 적용되는 것이라고 생각하면된다. Property는 OS 환경변수, VM 옵션, Servlet Context, Servlet Config 등에 들어갈 수있다. 

 

1. VM options를 이용한 Property 사용

기본적으로 VM options에 프로퍼티를 적용하는 법에 대해 알아보자. 이전 글인 Environment - Profile기능에 대한 내용중에서 어플리케이션 설정의 VM options에 설정값을 넣는 방식에 대해 알아 보았었다. 바로 그 기능이 Property 기능을 이용한 방식이다. 

위처럼 VM options란에 "-Dapp.name=property"라고 입력한 후에 아래의 Runner 클래스를 실행 시켜보도록 하자.

 

BeanRunner.java
// 코드중략

@Component
public class BeanRunner implements ApplicationRunner {

    @Autowired
    ApplicationContext ctx;

    @Override
    public void run(ApplicationArguments args) throws Exception {
        Environment environment = ctx.getEnvironment();
        System.out.println(environment.getProperty("app.name"));
    }
}

 

결과는 아래와 같이 나올 것이다.

VM options에 입력한 -Dapp.name=property

 

위처럼 IDE의 기능을 사용하지 않고 파일 형태로 property를 관리하고 싶다면, properties 파일로 관리하면된다.


2. 파일을 이용한 Property 사용


아래의 이미지처럼 resources 폴더 아래의 application.properties는 그대로 두고 property.properties 파일을 생성하여 property를 작성하자.

property.properties

 

property.properties
app.name=propertyInPropertiesFile

 

그런 후에 BeanRunner 클래스로 해당 프로퍼티를 확인할 수 있게 아래와 같이 코드를 작성하자.

BeanRunner.java
@Component
public class BeanRunner implements ApplicationRunner {

    @Autowired
    ApplicationContext ctx;

    @Override
    public void run(ApplicationArguments args) throws Exception {
        Environment environment = ctx.getEnvironment();
        System.out.println(environment.getProperty("app.name"));
        System.out.println(environment.getProperty("app.property"));
    }
}

 

위와 같이 작성하고 코드를 실행하면,

app.property 값이 비어있는 결과

app.property의 값이 비어있는 것을 확인할 수 있다. 이유는 property.properties 파일에 입력만 한다고해서 적용되는것이 아니라, @Configuration이 적용된 클래스에게 해당 properties 파일의 위치를 알려줘야 한다.

Spring Boot는 @SpringBootApplication이 거의 모든 것을 확장하고 있기 때문에 해당 클래스 위치에 명시해주면된다.

BeanApplication.java
// 코드중략

@SpringBootApplication
@PropertySource("classpath:/property.properties")
public class BeanApplication {

    public static void main(String[] args) {
        SpringApplication.run(BeanApplication.class, args);
    }

}

// classpath:/ => 프로젝트의 최상위 경로를 나타냄

 

위와 같이 @SpringBootApplication이 명시된 클래스가 property 소스의 경로를 알 수 있도록 @PropertySource 어노테이션을 명시해주도록하자. 그런 후에 다시 어플리케이션을 실행하면 입력한 property가 출력되는 것을 확인 할 수 있다.

app.property 값이 출력됨

 

위처럼 두가지 방법으로 property를 사용할 수 있으면 key가 같은 값을 설정 하였을때는 어떤 것이 적용이될까?

앞에서 말했듯이 Property 기능은 계층형으로 접근하기 때문에 우선순위가 높은것이 적용된다. 여기서는 VM options가 우선 순위가 높기 때문에 같은 property를 key - value로 설정해두면 VM options의 Property를 사용한다.

추가로 SpringBoot에서 지원해주는 기능이 있는데, 아래와 같이 코드를 작성해도 Property를 얻을 수 있다.

BeanRunner.java
// 코드중략

@Component
public class BeanRunner implements ApplicationRunner {

    @Autowired
    ApplicationContext ctx;

    @Value("${app.property}")
    String appProperty;

    @Override
    public void run(ApplicationArguments args) throws Exception {
        System.out.println(appProperty);
    }
}

SpringBoot 기능을 이용한 Property 사용

 

내용 출처

반응형

'Spring' 카테고리의 다른 글

[Spring] ApplicationEventPublisher  (0) 2020.05.15
[Spring] MessageSource  (0) 2020.01.18
[Spring] Environment - Profile  (0) 2019.12.29
[Spring] Bean의 스코프  (0) 2019.12.29
[Spring] @Component와 컴포넌트 스캔  (0) 2019.12.17

댓글