origin

아래 문서를 기준으로 내게 필요한 내용만 번역.
https://docs.spring.io/spring-boot/docs/2.6.2/reference/html/features.html

1. SpringApplication

2. Externalized Configuration

Spring Boot를 사용하면 설정을 외부화하여 다른 환경에서 동일한 응용프로그램 코드로 동작할 수 있습니다. Java 프로퍼티, YAML, 환경 변수, CLI 인자를 비롯한 다양한 외부 설정 소스를 사용할 수 있습니다.

프로퍼티 값은 @Value 어노테이션을 사용하여 빈에 직접 주입하거나, Spring의 Environment 추상화를 통해 접근, @ConfigurationProperties 를 통해 구조화된 객체에 바인딩 할 수 있습니다.

Spring Boot는 적절하게 오버라이딩을 할 수 있도록 설계된 매우 까다로운 PropertySource 순서를 사용합니다. 프로퍼티는 다음 순서로 고려됩니다. (낮은 항목의 값이 이전 항목보다 우선시 됨)

  1. 기본 프로퍼티 (StringApplication.setDefaultProperties 를 통해 지정)

  2. @Configuration 클래스의 @PropertySource 어노테이션. 이러한 프로퍼티 소스는 어플리케이션 컨텍스트를 리프레시될 때까지 Environment 에 추가되지 않음. 리프레시 되기 전에 읽은 logging., spring.main. 과 같은 특정 프로퍼티를 설정하기에는 너무 늦음.

  3. 설정 데이터Config data (예: application.properties)

  4. random.* 에만 있는 RandomValuePropertySource

  5. OS 환경 변수

  6. Java 시스템 프로퍼티 (System.getProperties())

  7. java:comp/env 의 JNDI 속성

  8. ServletContext 초기화 파라미터

  9. ServletConfig 초기화 파라미터

  10. SPRING_APPLICATION_JSON 의 속성 (시스템 프로퍼티, 환경 변수안에 포함된 inline JSON)

  11. 커맨드-라인 인자

  12. 테스트에 있는 properties 속성. @SpringBootTest어플리케이션 혹은 특정 부분을 테스트하기 위한 테스트 어노테이션

  13. 테스트에 있는 @TestPropertySource 어노테이션

  14. devtools이 활성화일 때 $HOME/.config/spring-boot 디렉토리의 Devtools 전역 설정 프로퍼티

설정 데이터Config data 파일은 다음 순서로 고려됩니다.

  1. jar 내부에 패키징된 어플리케이션 프로퍼티 (application.properties 및 YAML 변형)

  2. jar 내부에 패키징된 프로필별 어플리케이션 프로퍼티 (application-{profile}.properties 및 YAML 변형)

  3. 패키징된 jar 외부의 어플리케이션 프로퍼티 (application.properties 및 YAML 변형)

  4. 패키징된 jar 외부의 프로필별 어플리케이션 프로퍼티 (application-{profile}.properties 및 YAML 변형)

Note

전체 어플리케이션에 대해서 하나의 형식을 사용하는 것이 좋습니다. 만약 동일한 위치에 .properties.yml 포맷의 설정 파일이 있을 경우 .properties 가 우선시 됩니다.

예를 들기 위해 다음과 같이 name 프로퍼티를 사용하는 @Component 를 개발한다고 가정합시다.

@Component
class MyBean {
    @Value("\${name}")
    private val name: String;

    // ...
}

당신의 어플리케이션 클래스패스(예, jar 내부)에서 name 에 적절한 기본 프로퍼티 값을 제공하는 application.properties 를 가질 수 있습니다. 새 환경에서 실행할 때 name 을 재정의하는 application.properties 파일이 jar 외부에 제공될 수 있습니다. 일회성 테스트일 경우 CLI로 실행할 수 있습니다. (예, java -jar app.jar --name="String")

Tip

envconfigprops 의 엔드포인트는 프로퍼티에 특정 값이 있는 원인을 확인하는데 유용할 수 있습니다. 이 두 엔드포인트를 통해 예기치 않은 프로퍼티 값을 진단할 수 있습니다. 자세한 내용은 "프로덕션 준비 기능" 섹션을 참조해주세요.

2.1. Accessing Command Line Properties

기본적으로 SpringApplication 은 모든 커맨드-라인 옵션 인자(즉, --server.port=9000 와 같이 -- 로 시작하는 인자)를 프로퍼티로 변환하고 이를 Spring Environment 에 추가합니다. 앞에서 언급했듯이 커맨드-라인 프로퍼티는 항상 파일 기반의 프로퍼티 소스보다 우선시 됩니다.

Environment 에 커맨드-라인 프로퍼티를 추가하지 않으려면 SpringApplication.setAddCommandLineProperties(false) 를 사용하여 비활성화 할 수 있습니다.

2.2. JSON Application Properties

2.3. External Application Properties

스프링 부트는 어플리케이션이 시작될 때 다음 위치에서 application.propertiesapplication.yaml 파일을 자동으로 찾아서 로드합니다.

  1. 클래스패스 에서

    1. 클래스패스 root

    2. 클래스패스 /config 패키지

  2. 현재 디렉토리에서

    1. 현재 디렉토리 내

    2. 현재 디렉토리 내 /config 하위 디렉토리

    3. /config 하위 디렉토리의 1 depth 하위 디렉토리

목록은 우선순위에 따라 정렬됩니다 (낮은 항목의 값이 이전 항목보다 우선시 됨). 불러온 파일의 문서는 스프링 EnvironmentPropertySources 로 추가됩니다.

설정 파일 이름으로 application 이 맘에 들지 않다면 spring.config.name 속성으로 변경할 수 있습니다. 예를 들어, myproject.properties 혹은 myproject.yaml 파일을 찾으려면 다은과 같이 어플리케이션을 실행할 수 있습니다.

$ java -jar myproject.jar --spring.config.name=myproject

spring.config.location 설정 프로퍼티를 사용하면 명시적으로 위치를 참조할 수도 있습니다. 이 속성은 확인할 다수의 위치를 쉼표로 구분한 리스트를 허용합니다.

다음 예제에서는 두 개의 개별 파일을 지정하는 방법을 보여줍니다:

$ java -jar myproject.jar --spring.config.location=\
    optional:classpath:/default.properties,\
    optional:classpaht:/override.properties
Tip

위치가 선택 사항이고 존재하지 않아도 상관 없을 경우 optional: 접두어를 사용하세요.

Warning

spring.config.name, spring.config.location, spring.config.additional-location 는 불러올 파일을 결정하기 위해 매우 일찍 사용됩니다. 환경 속성(일반적으로 OS 환경 변수, 시스템 속성 또는 명령줄 인수)으로 정의해야 합니다.

2.3.1. Optional Locations

2.3.2. Wildcard Locations

2.3.3. Profiles Specific Files

2.3.4. Importing Additional Data

2.3.5. Importing Extensionless Files

2.3.6. Using Configuration Trees

2.3.7. Property Placeholders

2.3.8. Working with Multi-Document Files

2.3.9. Activation Properties

2.4. Encrypting Properties

2.5. Working with YAML

YAML은 JSON의 상위집합이며, 계층적 구성 데이터를 기술하는데 편리한 포맷입니다. SpringApplication 클래스는 클래스패스에 SnakeYAML 라이브러리가 있을 때 프로퍼티에 대한 대안으로 자동으로 YAML을 지원합니다.

Note

"Starters"를 사용하면 spring-boot-starter 에서 SnakeYAML을 자동으로 제공합니다.

2.5.1. Mapping YAML to Properties

2.5.2. Directly Loading YAML

스프링 프레임워크는 YAML 문서를 불러오는데 사용할 수 있는 편리한 두 개의 클래스를 제공합니다. YamlPropertiesFactoryBean 은 YAML을 Properties 로, `YamlMapFactoryBean 은 YAML을 Map 으로 불러옵니다.

또한, YAML을 스프링 PropertySource 로 불러오고자 할 경우 YamlPropertySourceLoader 클래스를 사용할 수도 있습니다.

3. Profiles

스프링 프로필은 어플리케이션 설정의 일부를 분리하고 특정 환경에서만 사용할 수 있도록 하는 방법을 제공합니다. 다음 예제와 같이 @Component, @Configuration, @ConfigurationProperties@Profile 로 표시하여 불러오는 것을 제한할 수 있습니다.

@Configuration(proxyBeanMethods = false)
@Profile("production")
class ProductionConfiguration {
    // ...
}
Note

@ConfigurationProperties 빈이 자동 스캔 대신 @EnableConfigurationProperties 를 통해 등록된 경우 @EnableConfigurationProperties 어노테이션에 있는 @Configuration 클래스에 @Profile 어노테이션을 지정해야 합니다.

spring.profiles.active Environment 프로퍼티를 통해 활성화할 프로필을 지정할 수 있습니다. 이 챕터의 앞부분에 설명한 방법으로 프로퍼티를 지정할 수 있습니다. 예를 들어, 다음 예제와 같이 application.properties 에 포함할 수 있습니다.

spring:
  profiles:
    active: "dev,hsqldb"

--spring.profiles.active=dev.hsqldb 를 통해 커맨트-라인으로도 지정할 수 있습니다.

활성화된 프로필이 없으면 기본 프로필이 활성화됩니다. 기본 프로필의 이름은 default 이며, 다음 예제와 같이 spring.profiles.default Environment 프로퍼티로 변경할 수 있습니다.

spring:
  profiles:
    default: "none"