영호
@ConfigurationProperties 는 무엇을 기준으로 값을 주입할까 본문
들어가면서,
최근에 같이 우테코를 수료한 지인과 각자 실무를 하면서 기본기를 다시 다지기 위해 Spring 스터디를 시작했습니다.
스터디원이 ConfigurationProperties 관련해 흥미로운 점을 알려줬고, 관련해서 조금 더 파본 내용을 간단하게 정리한 글입니다.
실험을 진행한 환경은 Spring Boot 3.x 버전입니다.
궁금한 점
꼭 설정 파일의 key 값과 java 코드의 필드명이 같아야 될까?
HikariConfig 를 보면 maxPoolSize 란 필드가 있습니다. 그러나 설정파일 에서는 maximum-pool-size 키 값을 사용해 우리가 원하는 값을 주입 해줍니다. 즉, 설정 파일의 key 값과 자바 코드의 필드명이 달라도 매핑이 됩니다.
그래서 이를 확인해보기 위해 직접 코드를 쳐봤습니다.
주목할 점은 2가지가 있습니다.
- yml 파일의 key 값이 name 이 아닌 na 입니다.
- 자바 코드의 필드명은 name 이지만, 파라미터 이름은 설정 파일의 키 값과 동일한 na 입니다.
my:
name: ee
age: 5
school:
name: wooteco
course: BE
@ConfigurationProperties("my")
public class ConfigProperty {
private final String name;
private final Integer age;
private final School school;
public ConfigProperty(String na, Integer age, School school) {
this.name = na;
this.age = age;
this.school = school;
}
@PostConstruct
public void init() {
System.out.println("school name: " + age);
System.out.println("school name: " + name);
System.out.println("school course: " + school.course);
}
static class School {
private String name;
private String course;
public School(String name, String course) {
this.name = name;
this.course = course;
}
}
}
이렇게 실행해보면 name 필드에 ee 라는 값으로 정상적으로 매핑됩니다.
어떻게?
내부 코드를 따라가다 보니 Binder 라는 클래스를 찾을 수 있었습니다.
제가 파악한 흐름을 정말 간단하게 요약하자면 아래와 같습니다.
- 설정 파일의 키 값을 기준으로 value 를 파싱한다.
2. 이를 주입해야 하는 target 클래스에 값을 바인딩한다.
- 생성자 주입과, getter 와 setter 방식으로 주입하는 경우는 BindMethod 란 enum 에서 이를 구분하여 다르게 동작하고 있습니다.
결론
yml 의 키 값을 토대로 생성자 parameter 이름과 매핑되어 값이 주입된다.
'Spring' 카테고리의 다른 글
[spring] Transactional outbox pattern 을 활용해 이벤트 유실 개선하기 (0) | 2024.04.27 |
---|---|
[Spring] 역할에 따른 멀티모듈 구성으로 프로젝트 개선하기 (0) | 2024.04.11 |
[Spring] TaskScheduler 를 활용해 만료된 인증코드 제거하기 (0) | 2024.03.12 |
스탬프 중복 적립 개선기 (0) | 2024.02.23 |
[Spring] @TransactionalEventListener 에서 CUD 가 안되는 이유 (0) | 2023.10.15 |
Comments