
#)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.ymlmyapp:
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.propertiesmyapp.title=Application Default Title
application-dev.propertiesmyapp.title=Application Dev Profile Title
DemoApplication.javapublic 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/ 경로를 통해 자동 등록됨