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=myproject
spring.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"