티스토리 뷰
Spring에서 프로퍼티에 있는 값을 불러오는 다양한 방법들이 있다. 이번에는 대표적인 방식인 @Value와 @ConfigurationProperties의 차이에 대해 알아보도록 하자.
1. @Value와 @ConfigurationProperties의 사용법 및 차이
스프링의 properties나 yaml에 있는 값들은 애플리케이션이 실행되면서 환경변수로 Environment에 등록이 된다. 그리고 해당 값들을 꺼내서 애플리케이션에서 활용하기 위한 방법으로는 @Value와 @ConfigurationProperties가 있다.
[ @Value 어노테이션 ]
@Value는 단일 값을 주입받기 위해서 사용된다. 앞선 포스팅에서 살펴보았듯 값을 가져오기 위해서는 PropertyPlaceHolderConfigurer를 통해 ${}을 사용하는 방식과 SpEL을 통해 #{}을 이용하는 방식 크게 2가지를 사용할 수 있다.
@Value를 이용해 값을 가져올 때에는 RelaxedBinding이라는 것이 적용되지 않는다. Relaxed Binding이란 프로퍼티 값의 이름이 조금 달라도 유연하게 바인딩을 시켜주는 규칙을 의미한다. 예를 들어 다음과 같은 값이 프로퍼티에 있다고 하자.
server.admin-what-is-real-name=MangKyu
@Value는 Relaxed Binding이 적용되지 않으므로 완벽히 일치하는 프로퍼티 이름으로만 값을 가져올 수 있다.
@Value("${server.admin-what-is-real-name}")
private String adminName;
이러한 Value의 특징을 다음과 같이 정리할 수 있다.
- 단일 값을 주입받기 위해 사용됨
- RelaxedBinding이 적용되지 않음
[ @ConfigurationProperties 어노테이션 ]
@ConfigurationProperties는 프로퍼티에 있는 값을 클래스로 바인딩하기 위해 사용되는 어노테이션이다. @ConfigurationProperties는 값의 바인딩을 위해 Setter를 필요로 하며 생성자로 바인딩하기 위해서는 @ConstructorBinding을 붙여주어야 한다. (이와 관련된 내용에 대해 모른다면 이 포스팅을 참고해주세요)
@ConfigurationProperties를 사용하기 위해서는 @EnableConfigurationProperties에 해당 클래스를 지정해주거나 @ConfigurationPropertiesScan를 통해 스캐닝의 대상이 되도록 해주어야 한다. (이와 관련된 내용은 뒤에서 살펴볼 예정이다.)
@ConfigurationProperties는 기본적으로 RelaxedBinding이 적용된다. 예를 들어 위에서 봤던 프로퍼티 값을 불러오고자 한다면 다음과 같이 완전히 일치하게 적지 않아도 바인딩이 된다.
@Getter
@Setter
@ConfigurationProperties(prefix = "server")
public class ServerInfo {
private final String adminWhatIsRealName;
}
RelaxedBinding이 적용되는 규칙들로는 다음과 같은 것들이 있다. 이러한 4가지 표기법들은 @ConfigurationProperties로 값이 바인딩될 때 RelaxedBinding에 의해 올바르게 바인딩이 된다. 또한 @ConfigurationProperties는 클래스로 값을 바인딩하므로 한번에 여러 값을 바인딩 받을 수 있다. 하지만 @ConfigurationProperties에는 spEL이 사용될 수 없다는 단점이 있다.
server.admin-what-is-real-name | properties 와 .yml에 권장되는 표기법 |
server.adminWhatIsRealName | 표준 카멜 케이스 문법 |
server.admin_what_is_real_name | .properties와 .yml 에서 사용가능한 표기법 ( - 표기법이 더 표준임) |
SERVER_ADMIN_WHAT_IS_REAL_NAME | 시스템 환경 변수를 사용할 때 권장되는 표기법 |
또한 추가로 ConfigurationProperties에는 Validation을 적용할 수 있다. 이를 위해 @Validated 어노테이션을 붙여주어야 한다.
@Getter
@Setter
@ConfigurationProperties(prefix = "server")
@Validated
public class ServerInfo {
@NotBlank
private final String adminWhatIsRealName;
}
2. @Value와 @ConfigurationProperties의 차이 요약
[ @Value와 @ConfigurationProperties의 차이 요약 ]
Spring에서는 여러 값을 바인딩받아야 하는 경우에 @ConfigurationProperties를 사용하도록 권장하고 있다. 또한 @ConfigurationProperties는 RelaxedBinding이 적용되므로 보다 유연하게 값을 바인딩할 수 있다.
관련 포스팅
- 설정 값 분리의 필요성과 @Value의 사용법 및 동작 과정
- @Value와 @ConfigurationProperties의 사용법 및 차이
- final 변수를 갖는 클래스에 프로퍼티(Properties) 설정 값 불러오기, 생성자 바인딩(Constructor Binding)
- @ConfigurationPropertiesScan을 이용한 설정 프로퍼티 클래스(@Configuration Properties)의 빈 등록