안녕하세요🐱🐉
이번 글에서는 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.
'Framework > Spring Boot' 카테고리의 다른 글
[Spring Boot] 다국어처리(MessageSource) (0) | 2022.03.28 |
---|---|
[Spring Boot Tutorial] 1-1. 프로그램 설치 (0) | 2022.03.28 |
[Spring Boot Tutorial] 0. 들어가기에 앞서 (0) | 2022.03.06 |