application에서 사용하는 설정 값들을 내부 또는 밖에 설정하는 기능을 필요로 할 때 외부 설정을 사용할 수 있다.
외부 설정을 사용할 때 사용하는 가장 대표적인 파일은 application.properties으로 스프링 부트가 구동할 때 자동으로 로딩한다.
우선 설정 방식에 따른 우선순위를 확인해 보자.
스프링 doc에 있는 내용을 발췌해 보았다.
우선순위를 확인해보면 아래에서 살펴볼 application.properties은 우선순위가 15위 인 것을 알 수 있다.
https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-external-config
- Devtools global settings properties on your home directory (~/.spring-boot-devtools.properties when devtools is active).
- @TestPropertySource annotations on your tests.
- properties attribute on your tests. Available on @SpringBootTest and the test annotations for testing a particular slice of your application.
- Command line arguments.
- Properties from SPRING_APPLICATION_JSON (inline JSON embedded in an environment variable or system property).
- ServletConfig init parameters.
- ServletContext init parameters.
- JNDI attributes from java:comp/env.
- Java System properties (System.getProperties()).
- OS environment variables.
- A RandomValuePropertySource that has properties only in random.*.
- Profile-specific application properties outside of your packaged jar (application-{profile}.properties and YAML variants).
- Profile-specific application properties packaged inside your jar (application-{profile}.properties and YAML variants).
- Application properties outside of your packaged jar (application.properties and YAML variants).
- Application properties packaged inside your jar (application.properties and YAML variants).
- @PropertySource annotations on your @Configuration classes.
- 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)
참조
스프링 부트 개념과 활용 인프런 백기선 강의
'Java & 스프링 > 스프링부트 톺아보기' 카테고리의 다른 글
[스프링 부트] 로깅 (0) | 2019.10.07 |
---|---|
[스프링 부트] 프로파일 (0) | 2019.10.03 |
[스프링 부트] 외부 설정 적용하기(2) (0) | 2019.09.25 |
[스프링부트] 이벤트 리스너 (0) | 2019.09.24 |
[스프링 부트] 스프링 인스턴스 사용해보기 (0) | 2019.09.23 |
댓글