티스토리 뷰
설정파일에 정의한 내용들을 객체에 바인딩할때 @ConfigurationProperties 애노테이션을 이용해서 주입할 수 있다.
// yml file
config:
person:
age: 33
name: LichKing
// binding 할 객체의 클래스
@ConfigurationProperties("config.person")
@NoArgsConstructor @Setter @ToString
public class Person {
private String name;
private int age;
}
// 어디엔가 이 애노테이션을 선언해줘야 한다
@ConfigurationPropertiesScan
위처럼 정의하면 spring 컨테이너가 구동될때 Person 의 기본생성자를 이용해 인스턴스를 만들고, setter 를 이용해 설정파일들을 주입해준다. 하지만 setter 보다는 생성자 주입을 하고싶은게 요즘 자바 개발자의 마음일 것이다. 그럴때 사용하라고 spring boot 2.2 부터 나온 애노테이션이 @ConstructorBinding 이다.
@ConstructorBinding
@ConfigurationProperties("config.person")
@RequiredArgsConstructor @ToString
public class Person {
private final String name;
private final int age;
}
위처럼 정의하면 생성자를 통해 주입받을 수 있다. 그 덕분에 필드들을 final 로 선언하고, setter 를 없앨 수 있게됐다.
하지만 위 코드는 spring boot 3 로 오게되면 컴파일이 되지 않게 되는데, @ConstructorBinding 애노테이션의 패키지가 변경되고, 메타 애노테이션으로 정의된 @Target 내용이 달라졌기 때문이다. 기존에는 Type 에도 달 수 있었기 때문에 클래스에 붙일 수 있었는데 spring boot 3 로 오면서 생성자와 애노테이션에만 붙일 수 있게 됐다.
@ConfigurationProperties("config.person")
@ToString
public class Person {
private final String name;
private final int age;
@ConstructorBinding
public Person(String name, int age) {
this.name = name;
this.age = age;
}
}
그래서 이렇게 생성자에 애노테이션을 붙여주면 정상적으로 컴파일도 되고, 설정주입도 되는걸 확인할 수 있다. 하지만 롬복으로 선언한 생성자를 사용할 수 없어 코드 내용은 더 길어졌다.
사실 spring boot 3 에서 @ConstructorBinding 의 @Target 이 변경된건 이유가 있는데, 생성자가 1개 일때는 애노테이션이 없어도 단일 생성자를 통해 주입해주도록 변경됐기 때문이다. 이전에 spring bean 주입을 위해선 @Autowired 를 생성자에 붙여줬어야 했는데 생성자가 1개일때는 해당 생성자를 통해 주입할 수 있도록 변경된 것과 유사하다. 그래서 위 코드는 아래와 같이 변경할 수 있다.
@ConfigurationProperties("config.person")
@RequiredArgsConstructor @ToString
public class Person {
private final String name;
private final int age;
}
때문에 spring boot 3 로 마이그레이션을 한다면 @ConstructorBinding 애노테이션을 생성자에 붙이기보다는 아마도 삭제하는 편으로 마이그레이션하는게 훨씬 편할 것이다.
'Java > spring' 카테고리의 다른 글
Spring bean 에서 다형성을 활용할 수 있을까 (0) | 2024.05.26 |
---|---|
spring boot 3 migration#04 spring boot 3 resilience4j 버전이 안올라간다면 (1) | 2024.01.28 |
spring boot 3 migration#02 WebSecurityConfigurerAdapter (0) | 2023.05.14 |
spring boot 3 migration#01 ListenableFuture (1) | 2023.05.14 |
spring boot 에서 ObjectMapper 확장하기 (1) | 2023.03.24 |
- Total
- Today
- Yesterday
- http
- Spring
- servlet
- generics
- java
- Git
- MySQL
- clean code
- db
- DesignPattern
- TEST
- frontend개발환경
- Design Pattern
- backend개발환경
- Jackson
- spring cloud
- JavaScript Core
- toby
- OOP
- Kotlin
- JPA
- go-core
- programming
- EffectiveJava
- javascript
- mariadb
- java8
- frontcode
- code
- 정규표현식
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |