해당 게시물은 백기선님의 스프링 프레임워크 핵심 기술 강좌를 정리한 내용 입니다.
스프링 EL 이란?
- SpEL은 객체 그래프를 조회하고 조작하는 기능을 제공한다.
- Unified EL 과 비슷하지만, 메서드 호출을 지원하며, 문자열 템플릿 기능도 제공한다.
- OGNL, MVEL, JBoss EL 등 자바에서 사용가능한 여러 EL이 있지만 SpEL은 Spring 프로젝트 전반에 걸쳐 사용하기 위해
만들어졌으며 스프링 3.0부터 지원된다.
SpEL 문법
① 표현식
#{"표현식"} : "표현식"을 평가(실행) 합니다.
※ 표현식 안에는 프로퍼티를 사용 할 수 있지만, 반대는 안 됨.
#{${my.data} + 1} 는 가능
② 프로퍼티 참조
${"프로퍼티"} : "프로퍼티"를 참조할 때 합니다.
빈이 만들어질때 @Value()의 값이 SpEL로 작성 되어 있다면 SpEL로 파싱한 다음, 평가(실행)해서 결과 값을 변수에 할당한다.
③ 추가적인 문법은 레퍼런스를 참고
SpEL 예시 - 기본적인 사용법
@Component
public class AppRunner implements ApplicationRunner {
@Value("#{1 + 1}")
int value;
@Value("#{'hello ' + 'world'}")
String greeting;
@Value("#{1 eq 1}")
boolean trueOrFalse;
@Value("hello")
String hello;
@Value("${my.value}")
int myValue;
@Value("#{${my.value} eq 100}")
boolean isMyValue100;
@Value("#{'spring'}")
String spring;
@Override
public void run(ApplicationArguments args) throws Exception {
System.out.println("=================");
System.out.println(value);
System.out.println(greeting);
System.out.println(trueOrFalse);
System.out.println(hello);
System.out.println(myValue);
System.out.println(isMyValue100);
System.out.println(spring);
}
}
SpEL 예시 - Bean References (빈 참조)
@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("#{sample.data}")
int sampleData;
@Override
public void run(ApplicationArguments args) throws Exception {
System.out.println(sampleData);
}
}
SPEL 구성
- ExpressionParser 인터페이스는 문자열 표현식을 파싱하는 역할을 한다.
- Expression 인터페이스는 문자열 표현식을 평가하는 역할을 한다.
- EvaluationContext 인터페이스는 프로퍼티, 메서드, 또는 필드를 처리하고 형 변환을 수행하는 표현식을 평가할 때
사용 된다.
- 아래 코드에서 ExpressionParser의 구현체인 SpelExpressionParser 클래스를 사용해서 문자열 표현식을 파싱하고
Expression의 getValue() 메서드를 이용해 파싱된 결과 값을 얻는다.
(이때 파라미터로 클래스 정보를 넘겨서 Integer 타입으로 형 변환된 결과 값을 얻는다.)
그리고 그 결과를 출력한다.
ExpressionParser parser = new SpelExpressionParser();
Expression expression = parser.parseExpression("2 + 100");
Integer value = expression.getValue(Integer.class);
System.out.println(value);
SpEL이 사용되는 곳
① @Value 애노테이션
② @ConditionalOnExpression 애노테이션
③ 스프링 시큐리티
- 메소드 시큐리티, @PreAuthorize, @PostAuthorize, @PreFilter, @PostFilter
- XML 인터셉터 URL 설정
…
④ 스프링 데이터
- @Query 애노테이션
⑤ Thymeleaf
'Spring > Spring Core' 카테고리의 다른 글
[Section 5] AOP (0) | 2020.10.16 |
---|---|
Section 3. 데이터 바인딩 추상화: Converter와 Formatter (0) | 2020.10.05 |
[Section 3] 데이터 바인딩 추상화 : PropertyEditor (0) | 2020.10.01 |
[Section 2] Validation 추상화 (0) | 2020.09.13 |
[Section 2] Resource 추상화 (0) | 2020.09.13 |
댓글