본문 바로가기
Java & 스프링/스프링부트 톺아보기

[스프링 부트] 외부 설정 적용 하기

by hjhello423 2019. 9. 24.

 

application에서 사용하는 설정 값들을 내부 또는 밖에 설정하는 기능을 필요로 할 때 외부 설정을 사용할 수 있다.

외부 설정을 사용할 때 사용하는 가장 대표적인 파일은 application.properties으로 스프링 부트가 구동할 때 자동으로 로딩한다.

 

우선 설정 방식에 따른 우선순위를 확인해 보자.

스프링 doc에 있는 내용을 발췌해 보았다.

우선순위를 확인해보면 아래에서 살펴볼 application.properties은 우선순위가 15위 인 것을 알 수 있다.

https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-external-config

더보기
  1. Devtools global settings properties on your home directory (~/.spring-boot-devtools.properties when devtools is active).
  2. @TestPropertySource annotations on your tests.
  3. properties attribute on your tests. Available on @SpringBootTest and the test annotations for testing a particular slice of your application.
  4. Command line arguments.
  5. Properties from SPRING_APPLICATION_JSON (inline JSON embedded in an environment variable or system property).
  6. ServletConfig init parameters.
  7. ServletContext init parameters.
  8. JNDI attributes from java:comp/env.
  9. Java System properties (System.getProperties()).
  10. OS environment variables.
  11. A RandomValuePropertySource that has properties only in random.*.
  12. Profile-specific application properties outside of your packaged jar (application-{profile}.properties and YAML variants).
  13. Profile-specific application properties packaged inside your jar (application-{profile}.properties and YAML variants).
  14. Application properties outside of your packaged jar (application.properties and YAML variants).
  15. Application properties packaged inside your jar (application.properties and YAML variants).
  16. @PropertySource annotations on your @Configuration classes.
  17. Default properties (specified by setting SpringApplication.setDefaultProperties).

 


이제부터 application.properties파일을 사용해서 확인해 본 뒤, 테스트용 properties파일을 등록하여 test코드를 등록해보자. 최종 파일 구조는 아래와 같다.

 

 

먼저 reources 디렉토리에 application.properties파일을 생성하고 값을 세팅해 보자

값은 아래와 같이 key=value 형식으로 지정한다.

 

 

test.name = hongjun
test.age = ${random.int}
test.fullName = ${test.name} Choi

${random.int}는 int 범위의 랜덤 값을 생성한다는 의미이다. 또한 이미 선언된 key를 이용하여 값을 지정할 수도 있다.

 


properties 파일을 생성하였다면 이제 이 파일에 설정된 값을 이용해보자.

@Value를 이용하면 properties 파일의 key를 이용하여 값을 바인딩할 수 있다.

아래와 같이 값을 바인딩할 변수의 타입과 이름을 지정한 뒤 @Value를 이용하여 값을 바인딩해보자.

그리고 해당 클래스는 bean으로 등록되어 있어야 한다. (@Component를 사용해서 bean으로 등록하자.)

 

@Component
public class SampleListener implements ApplicationRunner {

    @Value("${test.name}")
    private String name;

    @Value("${test.age}")
    private int age;

    @Value("${test.fullName}")
    private String fullName;

    @Override
    public void run(ApplicationArguments args) throws Exception {
        System.out.println("============================");
        System.out.println(name +", " + age);
        System.out.println(fullName);
        System.out.println("============================");

    }
}

실행하면 아래와 같이 외부 설정 파일의 값이 출력되는 걸 확인 가능하다.

 


만약 test코드를 사용할 경우 test코드에서 사용할 별도의 properties파일을 지정할 수 있다.

아래와 같이 @TestPropertySource 어노테이션을 이용하여 사용하고자 하는 설정 파일의 위치를 지정해 주면 된다.

@RunWith(SpringRunner.class)
@TestPropertySource(locations = "classpath:/test.properties")
@SpringBootTest
public class ApplicationTest {

    @Autowired
    Environment environment; // 스프링 env 호출

    @Test
    public void contextLoads() {
        assertThat(environment.getProperty("test.name"))
                .isEqualTo("honghong");
    }

}

@TestPropertySource 어노테이션에서 설정한 test.properties 파일의 내용을 아래와 같이 하고 테스트를 실행해보자.

test.name = honghong

 

아래 실행 결과에서 보면 hongjun으로 표기되던 값이 honghong으로 표기되는 걸 확인할 수 있다.

 

 


@Value를 사용하기 보다는 좀 더 type sfae 한 방법인 @ConfigurationProperties를 사용하기를 추천한다.

@ConfigurationProperties를 사용 하는 방법은 아래 링크에서 확인해보자

2019/09/25 - [분류 전체보기] - [스프링 부트] 외부 설정 적용하기(2)

 


git 소스 : https://github.com/hongjun423/spring-boot-study-start/tree/f37109d9f04cc80c7ff437220b33e92df79d00be/src

 

참조

스프링 부트 개념과 활용 인프런 백기선 강의

반응형

댓글