#
)server:
port: 8080
spring:
datasource:
url: jdbc:mysql://localhost:3306/mydb
username: root
password: secret
{
"name": "John Doe",
"age": 30,
"isEmployee": true
}
name: John Doe
age: 30
isEmployee: true
스칼라 : 문자열, 숫자, 불리언 (참/거짓) 값과 같은 기본 데이터 타입
리스트 : 배열이나 목록을 표현
각 항목은 동일한 들여쓰기 레벨에서 하이픈 (-)으로 시작
hobbies:
- Reading
- Hiking
- Coding
맵 : 키-값 쌍으로 데이터를 구성
객체나 레코드를 표현하는 데 유용
address:
street: 123 Main St
city: Anytown
zip: 12345
# 앵커
defaultAddress: &address
street: 123 Main St
city: Anytown
zip: 12345
# 앵커참조
johnsAddress: *address
janesAddress:
<<: *address
street: 456 Elm St
|
여러 줄의
텍스트를
그대로 보존합니다.
>
이것은 하나의
긴 문장입니다.
이 줄바꿈은 유지됩니다.
새로운 단락입니다.
.yml
파일을 Java 객체(Map, List, POJO 등) 로 변환YamlPropertySourceLoader
를 통해 application.yml
을 PropertySource
로 등록Yaml yaml = new Yaml();
InputStream input = new FileInputStream(new File("config.yml"));
Map<String, Object> data = yaml.load(input);
application.yml
→ Java 객체로 주입되는 원리Spring Boot는 어떻게
application.yml
내용을 Java 객체에 주입할까?
@SpringBootApplication이 하는 일
Spring Boot Application 실행 흐름
SpringApplication
이 실행되면서 내부적으로 ConfigDataEnvironmentPostProcessor
가 동작application.yml
혹은 application.properties
를 YamlPropertySourceLoader
등을 통해 파싱MapPropertySource
형태로 Environment
에 등록@ConfigurationProperties
가 붙은 클래스를 ConfigurationPropertiesBindingPostProcessor
가 감지Binder
가 Environment
에서 prefix에 맞는 값을 찾아 해당 클래스 필드에 주입ConversionService
가 사용되어 문자열 값을 Java 타입으로 변환Springboot 2.4.0 부터 application.properties 를 인식하는것이 부터 코드내에 변경되었다.
Spring Boot에서 application.yml
에 정의된 설정들이 Java 객체로 바인딩되는 전체 과정을 설명합니다.
application.yml
, application-{profile}.yml
등 설정 파일 로딩YamlPropertySourceLoader
가 .yml
파일을 Map<String, Object>
형태로 파싱application.yml
→ applicationConfig: [classpath:/application.yml]
Environment.getProperty("myapp.title")
방식으로 접근 가능@ConfigurationProperties(prefix = "myapp")
@Value("${myapp.title}")
같은 애노테이션이 붙은 클래스나 필드를 스캔org.springframework.boot.context.properties.bind.Binder
클래스가Environment
의 값들을 Java Bean으로 바인딩예:
myapp:
enabled: true
max-users: 100
@ConfigurationProperties(prefix = "myapp")
public class MyAppConfig {
private boolean enabled; // 문자열 "true" → boolean
private int maxUsers; // 문자열 "100" → int
}
@Component
, @EnableConfigurationProperties
,@Bean
등록 등을 통해 스프링 컨테이너에 등록되어 사용 가능@startuml
title YAML → Java 객체 바인딩 흐름
actor "개발자" as Dev
participant "application.yml" as YML
participant "YamlPropertySourceLoader" as Loader
participant "Map<String, Object>" as MapData
participant "Environment\n(PropertySources)" as Env
participant "@ConfigurationProperties\nor @Value" as Annotation
participant "Binder" as Binder
participant "ConversionService" as Converter
participant "Java 객체 (POJO)" as POJO
Dev -> YML : 설정 작성
YML -> Loader : YML 파일 로딩 요청
Loader -> MapData : YAML → Map 변환
MapData -> Env : PropertySource 로 등록
Env -> Annotation : @ConfigurationProperties 로 매핑 대상 감지
Annotation -> Binder : prefix 기준 바인딩 요청
Binder -> Env : 설정 값 조회
Binder -> Converter : 타입 변환 요청
Converter -> POJO : 최종 타입 객체 생성
@enduml
application.yml
↓
YamlPropertySourceLoader
↓
Map<String, Object>
↓
Environment (PropertySources)
↓
@ConfigurationProperties / @Value
↓
Binder
↓
ConversionService (타입 변환)
↓
Java 객체 (POJO)
myapp:
title: Hello YAML
port: 8081
enabled: true
@Component
@ConfigurationProperties(prefix = "myapp")
public class MyAppProperties {
private String title;
private int port;
private boolean enabled;
// Getters / Setters
}
구성 요소 | 역할 |
---|---|
YamlPropertySourceLoader | YAML 파일을 읽고 파싱 |
Environment | 설정 값 저장소 역할 |
Binder | YAML → Java 객체로 바인딩 수행 |
ConfigurationPropertiesBindingPostProcessor | 바인딩 트리거 역할 |
ConversionService | 문자열 → 실제 타입으로 변환 |
SpringApplication
실행 YamlPropertySourceLoader
가 application.yml
을 파싱 Environment
에 등록 (PropertySource
) @ConfigurationProperties
, @Value
, Environment.getProperty()
등으로 값 주입 application.yml
myapp:
title: "Welcome Application"
ConfigurationProperties
@Component
@ConfigurationProperties(prefix = "myapp")
public class MyAppProperties {
private String title;
// Getter / Setter
}
Spring Boot는 다양한 설정 소스를 읽고 이를 Environment
에 등록한다.
우선순위가 높을수록 설정이 override 됨
우선순위 | 종류 | 설명 |
---|---|---|
1 | CommandLinePropertySource | --key=value 형식으로 실행 시 전달한 값 |
2 | SystemEnvironmentPropertySource | 시스템 환경변수 (MYAPP_TITLE=... ) |
3 | SystemPropertiesPropertySource | JVM 옵션 (-Dmyapp.title=... ) |
4 | RandomValuePropertySource | ${random.uuid} 등 지원 |
5 | application-{profile}.yml | 활성화된 프로파일 전용 설정 |
6 | application.yml | 기본 설정 파일 |
7 | @PropertySource | 자바 클래스에서 명시한 .properties 파일 |
8 | setDefaultProperties() | Java 코드에서 기본 설정 지정 |
application.properties
myapp.title=Application Default Title
application-dev.properties
myapp.title=Application Dev Profile Title
DemoApplication.java
public static void main(String[] args) {
SpringApplication app = new SpringApplication(DemoApplication.class);
Map<String, Object> defaults = Map.of("myapp.title", "Fallback Default Title");
app.setDefaultProperties(defaults);
app.run(args);
}
java -jar app.jar --spring.profiles.active=dev --myapp.title=Command Line Title
@RestController
public class TitleController {
@Value("${myapp.title}")
private String title;
@GetMapping("/title")
public String title() {
return title;
}
}
실행 상황 | 결과값 |
---|---|
기본 실행 | Application Default Title |
-Dspring.profiles.active=dev | Application Dev Profile Title |
명령줄 인자 추가 | Command Line Title |
아무것도 없을 때 | Fallback Default Title |
@ConfigurationProperties
는 타입 안정성과 계층적 매핑을 제공함YamlPropertySourceLoader
는 application.yml
을 PropertySource
로 만들어 환경 설정에 반영함Spring Boot에서 application.yml
파일을 읽어 환경 설정으로 등록해주는 핵심 컴포넌트
public class YamlPropertySourceLoader implements PropertySourceLoader {
@Override
public String[] getFileExtensions() {
return new String[] { "yml", "yaml" };
}
@Override
public List<PropertySource<?>> load(String name, Resource resource) throws IOException {
...
return result;
}
}
.yml
,.yaml
확장자를 가진 리소스를 읽어PropertySource
객체로 반환
SpringApplication.run(...)
ConfigDataEnvironmentPostProcessor
실행.yml
파일이면 YamlConfigDataLoader
→ YamlPropertySourceLoader
호출OriginTrackedYamlLoader.load()
→ Map<String, Object>
OriginTrackedMapPropertySource
로 wrapping 후 Environment
에 등록위 과정을 거치면 Spring Boot 안 어디에서든지 아래처럼 접근 가능
@Value("${server.port}") // 8080
혹은
environment.getProperty("spring.profiles.active");
.properties
파일은 PropertiesPropertySourceLoader
가 처리ConfigFileApplicationListener
가 설정 파일을 로딩했음spring.factories
또는 META-INF/spring/
경로를 통해 자동 등록됨