[번역] Spring Boot의 객체 목록에 대한 YAML

in #spring-boot3 years ago

https://www.baeldung.com/spring-boot-yaml-list/를 번역함.

1. 개요

이 짧은 자습서에서는 YAML 목록을 Spring Boot 의 목록 에 매핑하는 방법을 자세히 살펴보겠습니다 .

먼저 YAML에서 목록을 정의하는 방법에 대한 몇 가지 배경 지식으로 시작하겠습니다. 그런 다음 YAML 목록을 개체의 List 에 바인딩하는 방법을 자세히 살펴보겠습니다 .

2. YAML의 목록에 대한 빠른 요약

간단히 말해서 YAML 은 구성 파일을 작성하는 간결하고 명확한 방법을 제공하는 사람이 읽을 수 있는 데이터 직렬화 표준입니다. YAML의 좋은 점은 List , Map 및 스칼라 유형과 같은 여러 데이터 유형을 지원한다는 사실입니다 .

YAML 목록의 요소는 "-" 문자를 사용하여 정의되며 모두 동일한 들여쓰기 수준을 공유합니다.

yamlconfig:
list:
- item1
- item2
- item3
- item4

비교를 위해 속성 기반 등가물은 인덱스를 사용합니다.

yamlconfig.list[0]=item1
yamlconfig.list[1]=item2
yamlconfig.list[2]=item3
yamlconfig.list[3]=item4

더 많은 예를 보려면 YAML 및 속성 파일을 사용하여 목록과 맵 을 정의하는 방법에 대한 기사를 자유롭게 참조 하십시오 .

사실 YAML 의 계층적 특성은 속성 파일에 비해 가독성을 크게 향상시킵니다 . YAML의 또 다른 흥미로운 기능은 서로 다른 Spring 프로필에 대해 서로 다른 속성 을 정의할 수 있다는 것 입니다. Boot 버전 2.4.0부터는 속성 파일에서도 가능합니다.

Spring Boot가 YAML 구성에 대한 기본 지원을 제공한다는 점은 언급할 가치가 있습니다. 기본적으로 Spring Boot는 추가 작업 없이 시작 시 application.yml 에서 구성 속성을 로드합니다 .

3. YAML 목록을 간단한 개체 목록 에 바인딩

Spring Boot는 @ConfigurationProperties 주석을 제공하여 외부 구성 데이터를 객체 모델에 매핑하는 논리 를 단순화합니다 .

이 섹션에서는 @ConfigurationProperties 를 사용하여 YAML 목록을 List<Object> 에 바인딩합니다 .

application.yml에 간단한 목록을 정의하는 것으로 시작 합니다 .

application:
profiles:
- dev
- test
- prod
- 1
- 2

그런 다음, 우리는 간단하게 만들 것이다 ApplicationProps POJO를 A와 우리의 YAML 목록 바인딩의 논리 보유 목록 의  객체를 :

@Component
@ConfigurationProperties(prefix = "application")
public class ApplicationProps {

private List<Object> profiles;

// getter and setter

}

ApplicationProps의 클래스의 요구를 장식 할 @ConfigurationProperties 의 객체에 지정된 접두사와 모든 YAML 속성을 매핑하는 의도를 표현하는 ApplicationProps을 .

프로필 목록 을 바인딩하려면 List 유형의 필드를 정의하기만 하면 나머지 는 @ConfigurationProperties 주석이 처리합니다.

@Component 사용하여 ApplicationProps 클래스를 일반 Spring 빈으로 등록하는 것을 주목하세요 . 결과적으로 다른 Spring 빈과 같은 방식으로 다른 클래스에 주입할 수 있습니다.

마지막으로 ApplicationProps 빈을 테스트 클래스에 주입 하고 프로필 YAML 목록이 List<Object> 로 올바르게 주입 되었는지 확인합니다 .

@ExtendWith(SpringExtension.class)
@ContextConfiguration(initializers = ConfigDataApplicationContextInitializer.class)
@EnableConfigurationProperties(value = ApplicationProps.class)
class YamlSimpleListUnitTest {

@Autowired
private ApplicationProps applicationProps;

@Test
public void whenYamlList_thenLoadSimpleList() {
assertThat(applicationProps.getProfiles().get(0)).isEqualTo("dev");
assertThat(applicationProps.getProfiles().get(4).getClass()).isEqualTo(Integer.class);
assertThat(applicationProps.getProfiles().size()).isEqualTo(5);
}
}

4. 복잡한 목록에 YAML 목록 바인딩

이제 더 깊이의 다이빙을하게 복잡한 구조로 중첩 YAML 목록 주입하는 방법을 참조 목록 들 .

먼저 application.yml 에 일부 중첩 목록을 추가해 보겠습니다 .

application:
// ...
props:
-
name: YamlList
url: http://yamllist.dev
description: Mapping list in Yaml to list of objects in Spring Boot
-
ip: 10.10.10.10
port: 8091
-
email: [email protected]
contact: http://yamllist.dev/contact
users:
-
username: admin
password: admin@10@
roles:
- READ
- WRITE
- VIEW
- DELETE
-
username: guest
password: guest@01
roles:
- VIEW

이 예제에서는 props 속성을 List<Map<String, Object>> 에 바인딩합니다 . 마찬가지로 사용자 를 사용자 개체 목록 에 매핑 합니다.

의 각 요소 때문에 소품 항목이 다른 키를 보유하고, 우리는로 삽입 할 수 목록 의 지도 들 Spring Boot의 YAML 파일에서 맵 을 삽입하는 방법에 대한 기사를 확인하십시오 .

그러나 , 의 경우 사용자 , 모든 항목, 같은 키를 공유 그래서 그 매핑을 단순화하기 위해, 우리는 전용 만들어야 할 수 있습니다 사용자 필드로 키를 캡슐화하는 클래스를 :

public class ApplicationProps {

// ...

private List<Map<String, Object>> props;
private List<User> users;

// getters and setters

public static class User {

private String username;
private String password;
private List<String> roles;

// getters and setters

}
}

이제 중첩된 YAML 목록이 올바르게 매핑되었는지 확인합니다.

@ExtendWith(SpringExtension.class)
@ContextConfiguration(initializers = ConfigDataApplicationContextInitializer.class)
@EnableConfigurationProperties(value = ApplicationProps.class)
class YamlComplexListsUnitTest {

@Autowired
private ApplicationProps applicationProps;

@Test
public void whenYamlNestedLists_thenLoadComplexLists() {
assertThat(applicationProps.getUsers().get(0).getPassword()).isEqualTo("admin@10@");
assertThat(applicationProps.getProps().get(0).get("name")).isEqualTo("YamlList");
assertThat(applicationProps.getProps().get(1).get("port").getClass()).isEqualTo(Integer.class);
}

}

5. 결론

이 자습서에서는 YAML 목록을 Java List 에 매핑하는 방법을 배웠습니다 . 또한 복잡한 목록을 사용자 지정 POJO에 바인딩하는 방법도 확인했습니다.

항상 그렇듯이 이 기사의 전체 소스 코드는 GitHub 에서 사용할 수  있습니다 .