[Spring] 스프링 Expression Language : SpEL (Spring Expression Language)
| 스프링 Expression Language : SpEL
SpEL은 Spring Expression Language의 줄임말로 스프링의 객체들의 정보를 질의하거나 조작하여 어떤 값을 표현할 수 있는 강력한 표현 언어다. 객체들의 정보는 레퍼런스로 연관되어 있는 객체 그래프를 탐색하여 얻어지므로 런타임 때 SpEL의 표현식 값이 결정(Resolve)된다. 참고로 객체 그래프는 런타임 때 객체 간의 연관 관계를 통해 그려지는 그래프를 의미하는 말이다.
| SpEL의 내부 구성
SpEL은 내부적으로 ExpressionParser 객체를 통해 SpEL의 표현식을 파싱하며 StandardEvaluationContext 객체를 통해 스프링 빈이 가지고 있는 객체 정보를 구한다. 이 두 정보를 가지고 표현식 객체와 객체의 정보를 가지고 SpEL의 표현식 값을 결정한다.
@Component
public class AppRunner implements ApplicationRunner {
@Override
public void run(ApplicationArguments args) throws Exception {
ExpressionParser parser = new SpelExpressionParser();
Expression expression = parser.parseExpression("2 + 100");
Integer value = expression.getValue(Integer.class);
System.out.println(value);
}
}
102
| @Value 어노테이션과 SpEL
SpEL은 @Value 어노테이션과 같이 쓰일 수 있으며 이 어노테이션과 SpEL의 조합을 통해서 쉽게 데이터를 바인딩할 수 있다. 아래는 그에 관련된 예시다.
# application.properties
my.val=100
@Component
public class Sample {
private int data = 200;
public int getData() {
return data;
}
public void setData(int data) {
this.data = data;
}
}
@Component
public class AppRunner implements ApplicationRunner {
@Value("#{1+1}")
int value;
@Value("#{'Hello ' + ' World'}")
String hello;
@Value("#{1 eq 1}")
boolean trueOrFalse;
@Value("you are great")
String great;
@Value("${my.val}") // 프로퍼티 값 읽어올 수 있음
String myName;
@Value("#{${my.val} eq 100}") // 프로퍼티 값과의 비교 가능
boolean isMyNameSaelobi;
@Value("#{sample.data}") // Bean으로 등록된 객체 참조 가능
int sampleData;
@Override
public void run(ApplicationArguments args) throws Exception {
System.out.println("==============");
System.out.println(value);
System.out.println(hello);
System.out.println(trueOrFalse);
System.out.println(great);
System.out.println(myName);
System.out.println(isMyNameSaelobi);
System.out.println(sampleData);
}
}
'Spring Framework > Spring 입문 - 개념 및 핵심' 카테고리의 다른 글
[Spring] 필터(filter)와 인터셉터(interceptor)의 차이 (0) | 2022.06.07 |
---|---|
[Spring] 스프링 @(어노테이션) 종류 (0) | 2022.06.07 |
@Component와 @Bean의 차이 (0) | 2021.10.05 |
[Spring] 스프링 AOP (Spring AOP) 총정리 : 개념, 프록시 기반 AOP, @AOP (0) | 2021.03.15 |
[Spring] 스프링 Converter와 Formatter를 이용한 데이터 바인딩(Converter, Formatter : Spring Data Binding) (0) | 2021.03.08 |
[Spring] 스프링 데이터 바인딩 추상화 : PropertyEditor (Spring Editor Binding Abstraction : PropertyEditor) (0) | 2021.01.15 |
[Spring] 스프링 Validation 추상화, Validator( Spring Validation Abstraction, Validator ) (0) | 2021.01.15 |
[Spring] 스프링 Resource 추상화( Spring Resource Abstraction ) (0) | 2021.01.15 |