애플리케이션에서 사용하는 여러가지 설정 값들을 애플리케이션의 밖이나 안에 정의하는 파일이다.
Spring boot를 이용해서 어플리케이션을 만들다 보면 외부에서 특정 값들을 주입받아야 하는 경우가 있다. (예를 들면 외부 API를 사용하기 위한 API key 등) 이러한 값들을 소스 코드에 그대로 쓰면 여러가지 문제가 생길 수 있다. 따라서 이러한 값들을 외부 설정 파일에 넣어 사용할 수 있다.
resources 디렉터리 밑에 있는 application.properties 나 application.yaml 파일은 스프링 부트가 자동으로 로딩하는 설정 파일들이다.
스프링부트가 애플리케이션을 구동할때 자동으로 로딩하는 파일이다. key - value 형식으로 값을 정의하면 애플리케이션에 참조하여 사용할 수 있다.
spring.h2.console.path=/h2-console
spring.datasource.url=jdbc:h2:~/test
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=password
# 리스트 표현
application.servers[0].ip=127.0.0.1
application.servers[0].path=/path1
application.servers[1].ip=127.0.0.2
application.servers[1].path=/path2
application.servers[2].ip=127.0.0.3
application.servers[2].path=/path3
app.age=${random.int}
앞서 정의해준 값을 변수 사용하듯이 참조할 수 있다.
app.name=MyApp
app.description=${app.name} is a Spring Boot application
properties와 다르게 계층 구조로 표현할 수 있어서 prefix의 중복 제거가 가능해지고 가독성이 좋다.
spring:
h2:
console:
path: /h2-console
datasource:
url: jdbc:h2:~/test
driverClassName: org.h2.Driver
username: sa
password: password
# 리스트 표현
application:
servers:
- ip: '127.0.0.1'
path: '/path1'
- ip: '127.0.0.2'
path: '/path2'
- ip: '127.0.0.3'
path: '/path3'
아래와 같은 application.yml이 정의된 상태라고 가정
external:
record-year: 2021
api:
name: kakao
key: 123123
@Value 어노테이션을 사용하여 값을 주입할 수 있다.
public class ExternalService{
@Value("${external.record-year}")
private String recordYear;
@Value("${external.api.name}")
private String apiName;
@Value("${external.api.key}")
private Integer apiKey;
}
Environment api를 사용하여 .getProperty("key") 메서드로 값을 가져올 수 있다.
@Autowired
private Environment env;
private String apiName = env.getProperty("external.api.name")
@ConfigurationProperties 어노테이션을 사용해 구조화 된 개체에 바인딩 할 수도 있다.
@ConfigurationProperties 의 value 로 prefix를 적어줘야 한다. 중첩 클래스 (ex.Api)를 사용하게 되는 경우 이름을 똑같이 일치시켜야 하고 setter를 반드시 정의해주어야 함.
@ConfigurationProperties("external")
public class ConfigProperties{
String recordYear;
String Api api;
@Getter
@Setter
public static class Api {
private String name;
private Integer key;
}
}
프로퍼티를 설정할 수 있는 방법은 여러가지이며 각 방법마다 우선순위가 있다. 여러 방법으로 같은 프로퍼티를 정의하고 있으면 우선순위가 가장 높은 방법으로 정의한 프로퍼티 값이 오버라이딩된다.
application.properties를 같은 위치가 아니라 다른 위치에 둘 경우는 컴파일해도 덮어쓰지 않게된다.
이 때 우선순위는 아래와 같다.
Using application.yml vs application.properties in Spring Boot