1. SpringApplication
2. Externalized Configuration
Spring Boot를 사용하면 설정을 외부화하여 다른 환경에서 동일한 응용프로그램 코드로 동작할 수 있습니다. Java 프로퍼티, YAML, 환경 변수, CLI 인자를 비롯한 다양한 외부 설정 소스를 사용할 수 있습니다.
프로퍼티 값은 @Value 어노테이션을 사용하여 빈에 직접 주입하거나, Spring의 Environment 추상화를 통해 접근,
@ConfigurationProperties 를 통해 구조화된 객체에 바인딩 할 수 있습니다.
Spring Boot는 적절하게 오버라이딩을 할 수 있도록 설계된 매우 까다로운 PropertySource 순서를 사용합니다. 프로퍼티는 다음 순서로 고려됩니다.
(낮은 항목의 값이 이전 항목보다 우선시 됨)
- 
기본 프로퍼티 ( StringApplication.setDefaultProperties를 통해 지정)
- 
@Configuration클래스의@PropertySource어노테이션. 이러한 프로퍼티 소스는 어플리케이션 컨텍스트를 리프레시될 때까지Environment에 추가되지 않음. 리프레시 되기 전에 읽은logging.,spring.main.과 같은 특정 프로퍼티를 설정하기에는 너무 늦음.
- 
설정 데이터Config data (예: application.properties)
- 
random.*에만 있는RandomValuePropertySource
- 
OS 환경 변수 
- 
Java 시스템 프로퍼티 ( System.getProperties())
- 
java:comp/env의 JNDI 속성
- 
ServletContext초기화 파라미터
- 
ServletConfig초기화 파라미터
- 
SPRING_APPLICATION_JSON의 속성 (시스템 프로퍼티, 환경 변수안에 포함된 inline JSON)
- 
커맨드-라인 인자 
- 
테스트에 있는 properties속성.@SpringBootTest및 어플리케이션 혹은 특정 부분을 테스트하기 위한 테스트 어노테이션
- 
테스트에 있는 @TestPropertySource어노테이션
- 
devtools이 활성화일 때 $HOME/.config/spring-boot디렉토리의 Devtools 전역 설정 프로퍼티
설정 데이터Config data 파일은 다음 순서로 고려됩니다.
- 
jar 내부에 패키징된 어플리케이션 프로퍼티 ( application.properties및 YAML 변형)
- 
jar 내부에 패키징된 프로필별 어플리케이션 프로퍼티 ( application-{profile}.properties및 YAML 변형)
- 
패키징된 jar 외부의 어플리케이션 프로퍼티 ( application.properties및 YAML 변형)
- 
패키징된 jar 외부의 프로필별 어플리케이션 프로퍼티 ( application-{profile}.properties및 YAML 변형)
| Note | 전체 어플리케이션에 대해서 하나의 형식을 사용하는 것이 좋습니다. 만약 동일한 위치에  | 
예를 들기 위해 다음과 같이 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 | 
 | 
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.properties 및 application.yaml 파일을 자동으로 찾아서 로드합니다.
- 
클래스패스 에서 - 
클래스패스 root 
- 
클래스패스 /config패키지
 
- 
- 
현재 디렉토리에서 - 
현재 디렉토리 내 
- 
현재 디렉토리 내 /config하위 디렉토리
- 
/config하위 디렉토리의 1 depth 하위 디렉토리
 
- 
목록은 우선순위에 따라 정렬됩니다 (낮은 항목의 값이 이전 항목보다 우선시 됨). 불러온 파일의 문서는 스프링 Environment 에 PropertySources 로 추가됩니다.
설정 파일 이름으로 application 이 맘에 들지 않다면 spring.config.name 속성으로 변경할 수 있습니다. 예를 들어, myproject.properties 혹은 myproject.yaml
파일을 찾으려면 다은과 같이 어플리케이션을 실행할 수 있습니다.
$ java -jar myproject.jar --spring.config.name=myprojectspring.config.location 설정 프로퍼티를 사용하면 명시적으로 위치를 참조할 수도 있습니다. 이 속성은 확인할 다수의 위치를 쉼표로 구분한 리스트를 허용합니다.
다음 예제에서는 두 개의 개별 파일을 지정하는 방법을 보여줍니다:
$ java -jar myproject.jar --spring.config.location=\
    optional:classpath:/default.properties,\
    optional:classpaht:/override.properties| Tip | 위치가 선택 사항이고 존재하지 않아도 상관 없을 경우  | 
| Warning | 
 | 
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"를 사용하면  | 
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 | 
 | 
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"