@Value
개요
- 스프링에서 제공하는 애노테이션이다.
- 스프링에서 보통 프로퍼티에 정의된 값을 코드상으로 가져오고 싶을 때 쓴다.
- 스프링의
BeanPostProcessor
를 통해 이루어진다.
공식문서 번역
애노테이트된 요소에 대한 기본 값 표현을 나타내는 애노테이션이다. 필드 혹은 메서드/생성자 파라미터에 사용된다.
주로 표현식을 이용하거나 프로퍼티를 이용한 의존성 주입에 사용된다. 또한, 스프링 MVC 에서 핸들러 메서드 인자의 동적인 값 분해(resolution)도 지원된다.
일반적인 use case 는 SpEL (Spring Express Language) 표현식 스타일로 #{systemProperties.myProb}
처럼 값을 주입하는 것이다. 혹은 ${my.app.myProp}
스타일 프로퍼티 플레이스 홀더를 이용해 값이 주입될 수도 있다.
@Value
애노테이션의 실제 처리는 BeanPostProcessor
에 의해 이루어진다. BeanPostProcessor
혹은 @BeanFactoryPostProcessor
타입 내에서는 @Value
를 사용할 수 없다. @Value
애노테이션의 존재를 확인하는 AutowiredAnnotationBeanPostProcessor
클래스의 javadoc 을 참고하자.
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Value {
/**
* The actual value expression such as <code>#{systemProperties.myProp}</code>
* or property placeholder such as <code>${my.app.myProp}</code>.
*/
String value();
}
활용 코드 예제
기본 값 설정
@SpringBootTest
class AppTest {
@Value("myValue")
private String value;
@Test
void printValue() {
System.out.println("value = " + value);
}
}
가장 간단한 기본값 설정 예제이다. 위의 출력 결과로 myValue
가 나온다.
잘못 사용한 경우 살펴보기
class AppTest {
@Value("myValue")
private String value;
@Test
void printValue() {
System.out.println("value = " + value);
}
}
위처럼 @SpringBootTest
애노테이션이 없어서 스프링 애플리케이션 컨텍스트를 불러오지 못하면, value
에 아무런 값도 세팅되지 않는다. 실제로 값 세팅은 BeanPostProcessor
가 처리하는 것이기 때문에 스프링 애플리케이션 컨텍스트가 필요하다.
properties 에 있는 값 가져오기
@SpringBootTest
class AppTest {
@Value("${spring.datasource.url}")
public String value;
@Test
void printValue() {
System.out.println("value = " + value);
}
}
application.properties
에 정의해둔 값을 코드상으로 가져올 수 있다.
systemProperties 값 가져오기
@SpringBootTest
class AppTest {
@Value("#{systemProperties}")
private Map<String, String> systemPropertiesMap;
@Test
void printValue() {
System.out.println("systemPropertiesMap = " + systemPropertiesMap);
}
}
systemPropertiesMap = {java.specification.version=15, sun.cpu.isalist=amd64, sun.jnu.encoding=MS949, java.class.path=C:\Program Files\JetBrains\IntelliJ IDEA 2020.3.1\lib\idea_rt.jar;C:\Users\jakeseo\.m2\repository\org\junit\platform\junit-platform-launcher\1.6.3\...
결과로 위와 같이 내가 실행하는 자바 버전, 내 자바 클래스의 경로, 유저 이름 등등 매우 많은 것들이 표기된다.
SpEL
사용해서 값 가공하기
@SpringBootTest
class AppTest {
@Value("#{'${spring.datasource.url}'.substring(3)}")
public String value;
@Test
void printValue() {
System.out.println("value = " + value);
}
}
위와 같이 SpEL
이라는 스프링의 특수한 표현식을 이용해 값을 가공해서 세팅할 수도 있다.
레퍼런스
'Java > 자바 잡지식' 카테고리의 다른 글
스프링의 Interceptor 란 무엇일까? [공식문서 번역] (0) | 2022.05.04 |
---|---|
자바 EE 필터 (Filter) 란? (0) | 2022.05.04 |
DTO (Data Transfer Object) 란? (0) | 2022.04.27 |
Java EE 빈 검증 (Bean Validation) (0) | 2022.04.27 |
Java EE GenerationType 정리 (2) | 2022.04.26 |