스프링 핵심 기술-12.SpEL(스프링 Expression Language)
SpEL(스프링 Expression Language)
- 객체 그래프를 조회하고 조작하는 기능을 제공한다.
jsp 사용시와 비슷한 ${} 등 스프링 3.0 부터 개발 및 지원
Unified EL과 비슷하지만, 메소드 호출을 지원하며, 문자열 템플릿 기능도 제공한다.
- OGNL, MVEL, JBoss EL 등 자바에서 사용할 수 있는 여러 EL이 있지만, SpEL은 모든 스프링 프로젝트 전반에 걸쳐 사용할 EL로 만들었다.
(스프링 코어에 들어가게 됨, 스프링 시큐리티, 클라우드 등 다양한 부분에서 사용되고 있음)
코드 구현
@Component
public class AppRunner implements ApplicationRunner {
@Value("#{1+1}")
int value;
@Value("#{'hello' + 'world'}")
String greeting;
@Value("#{1 eq 1}")
boolean trueOrFalse;
// 프로퍼티 사용 - application.properties my.value = 100
@Value("${my.value}")
int myValue;
// 표현식 안에 프로퍼티를 감싸서 사용 (반대는 안됨)
@Value("#{${my.value} eq 100}")
boolean isMyValue100;
@Value("#{'spring'}")
String spring;
// 빈에 등록된 값 Sample 클래스의 int data=1000; getter setter 구현
@Value("#{sample.data}")
int sampleData;
@Override
public void run(ApplicationArguments args) throws Exception {
System.out.println(value);
System.out.println(greeting);
System.out.println(trueOrFalse);
System.out.println(myValue);
System.out.println(isMyValue100);
System.out.println(spring);
System.out.println(sampleData);
// 필요하다면 코딩으로 ExpressionParser를 구현 가능
ExpressionParser parser = new SpelExpressionParser();
Expression expression = parser.parseExpression("2 + 100"); // 자체가 익스프레션
Integer value = expression.getValue(Integer.class);
System.out.println(value);
}
}
실행결과
2
helloworld
true
100
true
spring
1000
102
문법
- #{“표현식”}
- ${“프로퍼티”}
- 표현식은 프로퍼티를 가질 수 있지만, 반대는 안 됨. (프로퍼티 안에서는 표현식 사용 불가)
#{${my.data} + 1}
이 외에도 다양한 문법 및 오퍼레이션 존재 (레퍼런스 한번 훑어볼 것)
레퍼런스 참고
SpEL 구성
ExpressionParser parser = new SpelExpressionParser()
StandardEvaluationContext context = new StandardEvaluationContext(bean)
Expression expression = parser.parseExpression(“SpEL 표현식”)
String value = expression.getvalue(context, String.class)
어디서 사용하나요?
- @Value 애노테이션
- @ConditionalOnExpression 애노테이션
@ConditionalOnExpression도 SpEL 지원한다.
ConditionalOnExpression는 선택적으로 빈 등록/관리할 수 있는데,
이때 SpEL 기반으로 선별적으로 빈을 등록할 수 있음. - 스프링 시큐리티
메소드 시큐리티, @PreAuthorize, @PostAuthorize, @PreFilter, @PostFilter
ex. @PostFilter(hasRoll = ‘’) ..
XML 인터셉터 URL 설정 - 스프링 데이터
@Query 애노테이션
ex. @Quert(select u from user where firtsname = :#{custom.firstname}) - Thymeleaf 외 기타 등..