티스토리 뷰

Spring

[Spring] @Value와 @ConfigurationProperties의 사용법 및 차이

망나니개발자 2022. 1. 23. 10:00
반응형

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이 적용되므로 보다 유연하게 값을 바인딩할 수 있다.

 

 

 

 

 

관련 포스팅

  1. 설정 값 분리의 필요성과 @Value의 사용법 및 동작 과정
  2. @Value와 @ConfigurationProperties의 사용법 및 차이
  3. final 변수를 갖는 클래스에 프로퍼티(Properties) 설정 값 불러오기, 생성자 바인딩(Constructor Binding)
  4. @ConfigurationPropertiesScan을 이용한 설정 프로퍼티 클래스(@Configuration Properties)의 빈 등록

 

 

 

반응형
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG more
«   2024/04   »
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
글 보관함