Spring을 사용하여 YAML 파일에서 맵 삽입

1. 개요

이 빠른 튜토리얼에서는 Spring Boot에서 YAML 파일의 맵을 주입하는 방법을 자세히 살펴볼 것 입니다.

먼저 Spring Framework의 YAML 파일에 대한 약간의 통찰력으로 시작합니다. 그런 다음 실제 예제를 통해 YAML 속성을 Map 에 바인딩하는 방법을 보여줄 것 입니다.

2. 스프링 프레임 워크의 YAML 파일

YAML 파일을 사용하여 외부 구성 데이터를 저장하는 것은 Spring 개발자들 사이에서 일반적인 관행입니다. 기본적으로 Spring은 속성의 대안으로 YAML 문서를 지원하고 SnakeYAML을 사용하여 파싱합니다 .

더 이상 고민하지 않고 일반적인 YAML 파일이 어떻게 생겼는지 살펴 보겠습니다.

server: port: 8090 application: name: myapplication url: //myapplication.com

보시다시피 YAML 파일은 자명하고 사람이 읽기 쉽습니다. 사실 YAML은 계층 적 구성 데이터를 저장하는 멋지고 간결한 방법을 제공합니다.

기본적으로 Spring Boot 는 애플리케이션 시작시 application.properties 또는 application.yml 에서 구성 속성을 읽습니다 . 그러나 @PropertySource 를 사용하여 사용자 지정 YAML 파일을로드 할 수 있습니다 .

이제 YAML 파일이 무엇인지 익숙해 졌으므로 Spring Boot에서 YAML 속성을 Map 으로 주입하는 방법을 살펴 보겠습니다 .

3. YAML 파일에서 지도 를 삽입하는 방법

Spring Boot는 @ConfigurationProperties 라는 편리한 주석을 제공하여 데이터 외부화를 다음 단계로 끌어 올렸습니다. 이 주석은 구성 파일의 외부 속성을 Java 개체에 직접 쉽게 삽입하기 위해 도입 되었습니다 .

이 섹션에서는 @ConfigurationProperties 어노테이션을 사용하여 YAML 속성을 빈 클래스에 바인딩하는 방법을 자세히 다룰 것 입니다.

먼저 application.yml에 몇 가지 키-값 속성을 정의 해 보겠습니다 .

server: application: name: InjectMapFromYAML url: //injectmapfromyaml.dev description: How To Inject a map from a YAML File in Spring Boot config: ips: - 10.10.10.10 - 10.10.10.11 - 10.10.10.12 - 10.10.10.13 filesystem: - /dev/root - /dev/md2 - /dev/md4 users: root: username: root password: rootpass guest: username: guest password: guestpass

이 예에서는 응용 프로그램 을 간단한 으로 매핑 해 보겠습니다 . 마찬가지로 구성 세부 정보를 Map 으로 삽입합니다. , 사용자 A와 지도문자열 키와 객체가 사용자 정의 클래스에 속하는 - 자격 증명을 - 값으로 .

둘째, 구성 속성을 Map 에 바인딩하는 로직을 캡슐화하기 위해 Bean 클래스 인 ServerProperties를 생성 해 보겠습니다 .

@Component @ConfigurationProperties(prefix = "server") public class ServerProperties { private Map application; private Map
    
      config; private Map users; // getters and setters public static class Credential { private String username; private String password; // getters and setters } }
    

보시다시피, @ConfigurationProperties로 ServerProperties 클래스를 장식했습니다 . 그런 식으로 Spring에 지정된 접두사를 가진 모든 속성을 ServerProperties 객체에 매핑하도록 지시합니다 .

대부분의 Spring Boot 애플리케이션에서 자동으로 수행되지만 구성 속성에 대해서도 앱을 활성화해야합니다.

마지막으로 YAML 속성이 Map 으로 올바르게 주입되었는지 테스트 해 보겠습니다 .

@RunWith(SpringRunner.class) @SpringBootTest class MapFromYamlIntegrationTest { @Autowired private ServerProperties serverProperties; @Test public void whenYamlFileProvidedThenInjectSimpleMap() { assertThat(serverProperties.getApplication()) .containsOnlyKeys("name", "url", "description"); assertThat(serverProperties.getApplication() .get("name")).isEqualTo("InjectMapFromYAML"); } @Test public void whenYamlFileProvidedThenInjectComplexMap() { assertThat(serverProperties.getConfig()).hasSize(2); assertThat(serverProperties.getConfig() .get("ips") .get(0)).isEqualTo("10.10.10.10"); assertThat(serverProperties.getUsers() .get("root") .getUsername()).isEqualTo("root"); } }

4. @ConfigurationProperties@Value

이제 @ConfigurationProperties@Value를 빠르게 비교해 보겠습니다 .

모두 주석을 구성 파일에서 분사 특성에 사용할 수 있다는 사실에도 불구하고 , 그들은 매우 다르다. 이 두 주석의 주요 차이점은 각 주석이 다른 용도로 사용된다는 것입니다.

즉, @V의 ALUE는 우리가 직접 특정 속성 주입 할 수 있도록 핵심에 의한 값입니다. 그러나 @ConfigurationProperties 주석은 여러 속성 을 특정 개체에 바인딩 하고 매핑 된 개체를 통해 속성에 대한 액세스를 제공합니다.

일반적으로 Spring 은 구성 데이터를 주입 할 때 @Value 보다 @ConfigurationProperties 를 사용할 것을 권장 합니다 . @ConfigurationProperties 는 나중에 다른 빈에 주입 할 수있는 구조화 된 객체의 구성 속성을 중앙 집중화하고 그룹화하는 훌륭한 방법을 제공합니다.

5. 결론

요약하자면 먼저 Spring Boot의 YAML 파일에서 Map 을 주입하는 방법을 설명했습니다 . 그런 다음 @ConfigurationProperties@Value 의 차이점을 강조했습니다 .

평소처럼 기사의 전체 소스 코드는 GitHub에서 사용할 수 있습니다.