1. 개요

Spring Boot의 일반적인 관행은 외부 구성을 사용하여 속성을 정의하는 것 입니다. 이를 통해 다른 환경에서 동일한 애플리케이션 코드를 사용할 수 있습니다.

속성 파일, YAML 파일, 환경 변수 및 명령 줄 인수를 사용할 수 있습니다.

이 짧은 사용방법(예제)에서는 속성과 YAML 파일의 주요 차이점을 살펴 봅니다.

2. 속성 구성

기본적으로 Spring Boot는 key-value 형식을 사용 하는 application.properties 파일에 설정된 구성에 액세스 할 수 있습니다 .

spring.datasource.url=jdbc:h2:dev
spring.datasource.username=SA
spring.datasource.password=password

여기에서 각 라인은 단일 구성입니다. 따라서 키에 동일한 접두사를 사용하여 계층 적 데이터를 표현해야합니다. 그리고이 예에서 모든 키는 spring.datasource에 속합니다.

2.1. Properties 파일에서 Placeholder 사용

값 내에서 $ {} 구문 과 함께 자리 표시자를 사용하여 다른 키, 시스템 속성 또는 환경 변수의 내용을 참조 할 수 있습니다.

app.name=MyApp
app.description=${app.name} is a Spring Boot application

2.2. List 구조

값이 다른 동일한 종류의 속성이있는 경우 배열 인덱스로 List 구조를 나타낼 수 있습니다.

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

2.3. 여러 프로필

버전 2.4.0부터 Spring Boot는 다중 문서 속성 파일 생성을 지원합니다. 간단히 말해, 하나의 실제 파일을 여러 논리 문서로 분할 할 수 있습니다.

이를 통해 선언해야하는 각 프로필에 대한 문서를 모두 동일한 파일에 정의 할 수 있습니다.

logging.file.name=myapplication.log
bael.property=defaultValue
#---
spring.config.activate.on-profile=dev
spring.datasource.password=password
spring.datasource.url=jdbc:h2:dev
spring.datasource.username=SA
bael.property=devValue
#---
spring.config.activate.on-profile=prod
spring.datasource.password=password
spring.datasource.url=jdbc:h2:prod
spring.datasource.username=prodUser
bael.property=prodValue

문서를 분할 할 위치를 나타 내기 위해 '# ---'표기법을 사용합니다.

이 예에서는 태그 가 다른 프로파일을 가진 두 개의 스프링 섹션이 있습니다. 또한 루트 수준에서 공통 속성 집합을 가질 수 있습니다.이 경우 logging.file.name 속성은 모든 프로필에서 동일합니다.

2.4. 여러 파일의 프로필

동일한 파일에 다른 프로필을 갖는 대신 다른 파일에 여러 프로필을 저장할 수 있습니다. 버전 2.4.0 이전에는 속성 파일에 사용할 수있는 유일한 방법이었습니다 .

예를 들어 application-dev.yml 또는  application-dev.properties 와 같이 파일 이름에 프로필 이름을 입력하면됩니다 .

3. YAML 구성

3.1. YAML 형식

Java 속성 파일뿐만 아니라 Spring Boot 애플리케이션에서 YAML 기반 구성 파일을 사용할 수도 있습니다 . YAML은 계층 적 구성 데이터를 지정하기위한 편리한 형식입니다 .

이제 속성 파일에서 동일한 예를 가져와 YAML로 변환 해 보겠습니다.

spring:
    datasource:
        password: password
        url: jdbc:h2:dev
        username: SA

반복되는 접두사가 포함되지 않으므로 대체 속성 파일보다 더 읽기 쉽습니다.

3.2. List 구조

YAML에는 List을 표현하기위한보다 간결한 형식이 있습니다.

application:
    servers:
    -   ip: '127.0.0.1'
        path: '/path1'
    -   ip: '127.0.0.2'
        path: '/path2'
    -   ip: '127.0.0.3'
        path: '/path3'

3.3. 여러 프로필

속성 파일과 달리 YAML은 설계에 따라 다중 문서 파일을 지원하므로 사용하는 Spring Boot 버전에 관계없이 동일한 파일에 여러 프로필을 저장할 수 있습니다.

그러나이 경우 사양은 새 문서의 시작을 나타 내기 위해 세 개의 대시를 사용해야 함 을 나타냅니다 .

logging:
  file:
    name: myapplication.log
---
spring:
  config:
    activate:
      on-profile: staging
  datasource:
    password: 'password'
    url: jdbc:h2:staging
    username: SA
bael:
  property: stagingValue

4. 스프링 부트 사용법

구성을 정의 했으므로 이제 구성에 액세스하는 방법을 살펴 보겠습니다.

4.1. 어노테이션

@Value 어노테이션을 사용하여 속성 값을 삽입 할 수 있습니다 .

@Value("${key.something}")
private String injectedProperty;

여기서 key.something 속성 은 필드 주입을 통해 객체 중 하나에 주입됩니다.

4.2. Envirionment Abstraction

환경 API를 사용하여 속성 값을 얻을 수도 있습니다 .

@Autowired
private Environment env;

public String getSomeKey(){
    return env.getProperty("key.something");
}

4.3. ConfigurationProperties 어노테이션

마지막으로 @ConfigurationProperties  어노테이션을 사용하여 속성을 형식이 안전한 구조화 된 개체에 바인딩 할 수도 있습니다 .

@ConfigurationProperties(prefix = "mail")
public class ConfigProperties {
    String name;
    String description;
...

5. 결론

이 기사에서 우리는 속성yml Spring Boot 구성 파일 간의 몇 가지 차이점을 확인했습니다  . 또한 그 값이 다른 속성을 어떻게 참조 할 수 있는지 살펴 보았습니다. 마지막으로 런타임에 값을 주입하는 방법을 살펴 보았습니다.

항상 그렇듯이 모든 코드 예제는 GitHub에서 사용할 수 있습니다 .