@ConfigurationProperties를 immutable하게 설계하기
스프링부트 2.2부터 @ConstructorBinding을 이용해서 @ConfigurationProperties를 immutable하게 설계할 수 있습니다.
- @ConfigurationProperties이란 prefix에 매핑되는 외부 설정 값을 객체로 바인딩 시킬 수 있는 기능입니다.
(자세한 건 문서를 참고하시면 좋을 거 같습니다)
기존 사용 방식
@Getter @Setter @ConfigurationProperties(prefix = "member") public class MemberProperties { private String firstName; private String address; private int age; }
application.yml
# application.yml member: nick-name: brick address: seoul age: 10
Test
@SpringBootTest class MemberPropertiesTest { @Autowired MemberProperties member; @DisplayName("memberProperties 외부 설정 주입") @Test void member_properties_test() { assertThat(member.getNickName()).isEqualTo("brick"); assertThat(member.getAddress()).isEqualTo("seoul"); assertThat(member.getAge()).isEqualTo(10); } }

정상적으로 테스트가 통과했습니다.
하지만 위 코드에는 MemberProperties 값을 setter를 통해 바인딩을 하고 있으므로 객체의 값이 언제든 변경될 가능성이 있습니다.
이번엔 @ConstructorBinding을 이용해서 immutable하게 설계를 해보겠습니다.
After
@ConfigurationProperties("member") @ConstructorBinding // (1) @Getter public class MemberProperties { private final String nickName; private final String address; private final int age; }
매우 간단합니다. Type 레벨에 @ConstructBinding을 붙이면 됩니다.
@SpringBootApplication @ConfigurationPropertiesScan // @EnableConfigurationProperties으로 일일이 등록하지 않아도 됨. public class Application { public static void main(String[] args) { SpringApplication.run(TransactionApplication.class, args); } }
유효성 검사도 가능합니다.
@ConfigurationProperties("member") @ConstructorBinding @Validated @Getter public class MemberProperties { private final String nickName; private final String address; @Min(1) private final int age; }
테스트도 정상적으로 작동하는 걸 확인할 수 있습니다.

Reference
'Spring' 카테고리의 다른 글
@Async는 어떤식으로 실행될까? (0) | 2021.08.23 |
---|---|
Spring AOP self-invocation이 발생하는 이유와 @Transaction 사용시 주의사항 (0) | 2021.08.11 |
EventLister를 활용한 느슨한 결합 및 이벤트 처리. (0) | 2021.07.21 |
ResponseEntity는 왜 사용하는 것이며 @RestControllerAdvice는 무엇일까. (2) | 2021.05.02 |
[Spring, OOP] 생성자 주입이 좋은 이유와 스프링을 이용한 다양한 DI (2) | 2021.02.10 |
댓글을 사용할 수 없습니다.