s
s
spring
Search…
YAML 파일 설정
기존에는 환경 프로퍼티 설정시에 .propeties 파일을 많이 사용했지만, 최근에는 표현의 한계로 YAML 파일(.yml)을 더 많이 사용한다.
1
# 공통 부분(프로파일과 무관)
2
server:
3
port: 80
4
5
---
6
7
spring:
8
active:
9
profiles: dev
10
server:
11
port: 8081
12
13
---
14
15
spring:
16
active:
17
profiles: qa
18
server:
19
port: 8082
20
21
---
22
23
spring:
24
active:
25
profiles: prod
26
server:
27
port: 9091
Copied!
YAML 파일에서 프로퍼티 설정을 구분할 때 ---을 기준으로 설정값을 나눈다.
또는 application-{profile}.yml 로 파일을 생성하면 된다. {profile}에 원하는 프로파일 값으로 파일을 추가하면 애플리케이션 실행 시 지정한 프로파일 값을 바탕으로 실행된다. application.yml은 디폴트 프로퍼티 값이며, application-{profile}.yml보다 우선순위가 낮다.
1
$ java -jar ... -D spring.profiles.actvie=dev
Copied!
다음 명령어로 프로파일 값을 활성화할 수 있다.
  • intellij

파일 매핑하기

기능
@Value
@ConfigurationProperties
유연한 바인딩
X
O
메타데이터 지원
X
O
SpEL 평가
O
X
  • 유연한 바인딩 : 프로퍼티 값을 객체에 바인딩할 경우 필드를 Camel 표기법으로 선언하고, 프로퍼티의 키는 다양한 형식으로 선언하여 바인딩할 수 있다.
    1
    @Data
    2
    @ConfigurationProperties("fruit")
    3
    public class FruitProperties{
    4
    private String colorName;
    5
    }
    Copied!
    1
    # 스프링부트 2.0부터 Kebeb 표기법과 소문자표기법만 지원
    2
    fruit.color-name:
    3
    fruit.colorname:
    Copied!
  • 메타데이터 지원: 프로퍼티의 키에 대한 정보를 메타데이터 파일로 제공한다. 키의 이름, 타입, 설명, 디폴트값 등 키사용에 앞서 힌트가 되는 정볼르 얻을 수 있다.
  • SpEL(Spring Expression Language) 평가 : SpEL은 런타임에 객체 참조에 대해 질의하고 조작하는 기능을 지원하는 언어이다. 메서드 호출 및 기본 문자열 템플릿 기능을 제공한다.

@Value

프로퍼티의 키를 사용해 특정 값을 호출할 수 있다. 키를 정확히 입력해야하며, 값이 없는 경우에 대해 예외 처리가 필요하다.
1
property:
2
test:
3
name: property depth test
4
propertyTest: test
5
propertyTestList: a,b,c
Copied!
1
@RunWith(SpringRunner.class)
2
@SpringBootTest
3
public class AutoconfigurationApplicationTest{
4
// depth가 존재하는 키값은 .으로 구분해 매핑
5
@Value("${property.test.name}")
6
private String propertyTestName;
7
8
// 단일키값 매핑
9
@Value("${propertyTest}")
10
private String propertyTest;
11
12
// 여러 값을 배열형으로 매핑
13
@Value("${propertyTestList}")
14
private String[] propertyTestArray;
15
16
// 키가 없는 경우 디폴트 값이 매핑되도록 설정
17
@Value("${noKey:default value}")
18
private String defaultValue;
19
20
// SpEL을 사용해 List에 매핑
21
@Value("#{'${propertyTestList}'.split(,)}")
22
private List<String> propertyTestList;
23
24
@Test
25
public void testValue(){
26
assertThat(propertyTestName, is("property depth test"));
27
28
assertThat(propertyTest, is("test"));
29
30
assertThat(propertyTestArray[0], is("a"));
31
assertThat(propertyTestArray[1], is("b"));
32
assertThat(propertyTestArray[2], is("c"));
33
34
assertThat(defaultValue, is("default value"));
35
36
assertThat(propertyTestList.get(0), is("a"));
37
assertThat(propertyTestList.get(1), is("b"));
38
assertThat(propertyTestList.get(2), is("c"));
39
40
}
41
}
Copied!
YAML에 설정한 키값을 @Value 프로퍼티 값으로 주면 해당 값이 필드에 할당되며, 주로 단일 필드값을 가져오는데 사용한다.

@ConfigurationProperties

@ConfigurationProperties는 다양한 형의 프로퍼티 값을 매핑할 수 있다. @ConfigurationProperties는 기본적으로 접두사(prefix)를 사용해 값을 바인딩한다.
1
fruit:
2
list:
3
- name: banana
4
color: yellow
5
- name: apple
6
color: red
Copied!
1
@Data
2
@Component
3
@ConfigurationProperties("fruit")
4
public class FruitProperties{
5
private List<Map> list;
6
}
Copied!
@ConfigurationProperties를 사용하려면 해당 클래스를 @Component로 선언해야 사용하는 곳에서 의존성 주입이 가능하다. 위의 예에서는 접두사가 fruit인 프로퍼티 값을 읽어와서 설정한다.
application.yml이 아닌 다른 이름의 YAML 파일을 따로 생성해서 관리하는 경우에는 아래와 같이 사용하면 된다.
1
@ConfigurationProperties(prefix = "fruit")
Copied!
1
@RunWith(SpringRunner.class)
2
@SpringBootTest
3
public class AutoconfigurationApplicationTest{
4
@Autowired
5
FruitPoperty;
6
7
@Test
8
public void propertyTest(){
9
List<Map> fruitData = fruitProperty.getList();
10
11
assertThat(propertyTestList.get(0).get("name"), is("banana"));
12
assertThat(propertyTestList.get(0).get("color"), is("yellow"));
13
assertThat(propertyTestList.get(1).get("name"), is("apple"));
14
assertThat(propertyTestList.get(1).get("color"), is("red"));
15
16
}
17
}
Copied!

POJO 타입 매핑

1
@Data
2
public class Fruit{
3
private String name;
4
private String color;
5
}
Copied!
1
@Data
2
@Component
3
@ConfigurationProperties("fruit")
4
public class FruitProperties{
5
private List<Fruit> list;
6
}
Copied!
1
@RunWith(SpringRunner.class)
2
@SpringBootTest
3
public class AutoconfigurationApplicationTest{
4
@Autowired
5
FruitPoperty;
6
7
@Test
8
public void propertyTest(){
9
List<Map> fruitData = fruitProperty.getList();
10
11
assertThat(propertyTestList.get(0).getName(), is("banana"));
12
assertThat(propertyTestList.get(0).getColor(), is("yellow"));
13
assertThat(propertyTestList.get(1).getName(), is("apple"));
14
assertThat(propertyTestList.get(1).getColor(), is("red"));
15
16
}
17
}
Copied!