Sky Archive

Framework/Spring Boot

[Spring] Spring 어노테이션 @Value의 다양한 사용법

Anchovy ʕ-᷅ᴥ-᷄ʔ 2022. 11. 18. 14:42

안녕하세요🐱‍🐉

이번 글에서는 Spring 어노테이션 @Value의 다양한 사용법을 알아볼게요. 일반적으로 사용하는 방법 외에도 SpEL을 사용한 방법도 있으니 도움되길 바랄게요!

 

@Value annotation은 Spring에서 관리되는 beans에 값을 주입하는 데 사용할 수 있고 필드 또는 생성자 / 메서드 매개 변수에 적용할 수 있습니다!


0. application 설정

configuration class의 @PropertySource를 정의
properties file 설정 예)

// *.properties
value.from.file=Value got from the file
priority=high
listOfValues=A,B,C

// application.yml
value:
  from:
    file: Value got from the file
priority: high
listOfValues: A,B,C


1. 문자열 값

기본적이고 거의 쓸모없는 예

@Value("string value")
private String stringValue;

 

2. @PropertySource 주석

@PropertySource 주석을 사용하면 @Value 주석으로 properties files의 값으로 작업할 수 있습니다.

 

2.1. properties files 값

@Value("${value.from.file}")
private String valueFromFile;

 

2.2. system property 값

systemValue라는 system property을 정의했다고 가정

@Value("${systemValue}")
private String systemValue;

 

2.3. 정의되지 않은 속성에 대해 default 값을 설정

@Value("${unknown.param:some default}")
private String someDefault;

 

2.4. system property와 properties files에 동일한 속성이 설정된 경우, system property 적용

@Value("${priority}")
private String prioritySystemProperty;

 

2.5. 여러 개의 값을 설정하는 경우

쉼표로 구분된 값을 properties files 또는 system property로 정의하고 배열에 주입하는 것이 편리합니다.

@Value("${listOfValues}")
private String[] valuesArray;

listOfValues에 쉼표로 구분된 값을 정의했으므로 배열 값은 ["A", "B", "C"]가 됩니다.

 

3. SpEL 표현식

priority라는 시스템 속성이 있는 경우 해당 값이 필드에 적용됩니다. (system property가 정의되지 않은 경우 null 값 할당)

@Value("#{systemProperties['priority']}")
private String spelValue;

 

3.1. SpEL 표현식에 속성이 정의되지 않은 경우, default 값을 설정

@Value("#{systemProperties['unknown'] ?: 'some default'}")
private String spelSomeDefault;

 

3.2. 다른 bean의 필드 값을 사용하는 경우

someValue 필드가 10 인 someBean이라는 이름의 빈이 있다고 가정, 10이 할당

@Value("#{someBean.someValue}")
private Integer someBeanValue;

 

3.3. 속성을 조작하여 String List 값 할당

@Value("#{'${listOfValues}'.split(',')}")
private List<String> valuesList;

 

4. Map과 함께 @Value 사용

properties file에 key, value 형식으로 속성을 정의

valuesMap={key1: '1', key2: '2', key3: '3'}

맵의 값은 작은따옴표로 묶어야 합니다.

 

@Value("#{${valuesMap}}")
private Map<String, Integer> valuesMap;

 

4.1. Map에서 특정 키의 값을 가져와야 하는 경우 표현식에 키 이름 입력

@Value("#{${valuesMap}.key1}")
private Integer valuesMapKey1;

 

4.2. Map에 특정 키가 포함되어 있는지 확실하지 않은 경우

예외를 발생시키지 않고 키를 찾을 수 없을 때 값을 null로 설정하여 더 안전한 표현식 사용

@Value("#{${valuesMap}['unknownKey']}")
private Integer unknownMapKey;

 

4.3. 존재하지 않을 수 있는 속성 또는 키에 대한 기본값을 설정

@Value("#{${unknownMap : {key1: '1', key2: '2'}}}")
private Map<String, Integer> unknownMap;

@Value("#{${valuesMap}['unknownKey'] ?: 5}")
private Integer unknownMapKeyWithDefaultValue;

 

4.4. Map 항목을 필터링

값이 1보다 큰 항목만 가져와야 한다고 가정

@Value("#{${valuesMap}.?[value>'1']}")
private Map<String, Integer> valuesMapFiltered;

 

4.5. @Value 주석을 사용하여 모든 현재 시스템 속성을 주입

@Value("#{systemProperties}")
private Map<String, String> systemPropertiesMap;

 

5. 생성자 주입과 함께 @Value 사용

@Component
@PropertySource("classpath:values.properties")
public class PriorityProvider {

    private String priority;

    @Autowired
    public PriorityProvider(@Value("${priority:normal}") String priority) {
        this.priority = priority;
    }

    // standard getter
}

PriorityProvider의 생성자에 priority 값을 직접 주입합니다. priority 값을 찾을 수 없는 경우를 대비하여 기본값도 제공


6. Setter 주입과 함께 @Value 사용

@Component
@PropertySource("classpath:values.properties")
public class CollectionProvider {

    private List<String> values = new ArrayList<>();

    @Autowired
    public void setValues(@Value("#{'${listOfValues}'.split(',')}") List<String> values) {
        this.values.addAll(values);
    }

    // standard getter
}

SpEL 표현식을 사용하여 값 List를 setValues 메서드에 삽입합니다.

 

 

 

 

 

 

 

 

 

ref.

https://www.baeldung.com/spring-value-annotation

https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#beans-value-annotations