Spring - SPEL(SPring Expression Language)


Spring Expression Language(SpEL)

  • 자바에서 사용할 수 있는 Expression Language를 Spring에서 개선한 표현 언어.
  • SpEL은 기존 EL로부터 메소드 호출, 빈 참조, 객체 그래프와 같은 기능을 추가하여 제공한다.
  • SpEL은 Parser와 같은 클래스를 생성한다면 Spring과 연결되지 않고 독립적으로 사용할 수 있다.

SpEL에서 표현할 수 있는 기능들

* 문자열 표현
* 프로퍼티, 배열, 리스트, 맵
* 인라인 리스트/맵
* 배열 생성
* 메소드 호출
* 오퍼레이터
* 타입
* 생성자
* 변수
* 함수
* 빈 참조
* 삼항 연산자

ExpressionParser

  • SpelExpressionParser는 Spring에서 제공하는 SpEL 클래스이다.
  • SpelExpressionParser는 ExpressionParser 인터페이스를 구현한 클래스로서 SpEL 표현식을 파싱할 수 있다.
  • 파싱한 표현식은 Expression 객체이고 getValue함수를 통해 형변환된 결과를 얻을 수 있다.
1
2
3
4
5
6
7
ExpressionParser parser = new SpelExpressionParser();
Expression expression = parser.parseExpression("2+100");
Integer value = expression.getValue(Integer.class);

//SpEL은 다음과 같은 형식으로 메소드와 프로퍼티를 호출할 수 있다.
Expression expression2 = parser.parseExpression("'SpEL'.length()");
int len = expression2.getValue(int.class);

@Value 어노테이션을 통한 SpEL

  • Spring 환경에서 @Value 어노테이션은 SpEL 표현식으로 값을 정할 수 있다.
  • Value 어노테이션에서 사용할 수 있는 SpEL문법은 다음과 같다.
    1. ‘#{ (표현식) } ‘
    2. ‘${ (프로퍼티) } ‘ - SpEL은 프로퍼티를 표현할 수 있지만 반대로 프로퍼티는 SpEL을 표현할 수 없다.
    3. ‘#{ ${ (프로퍼티) } }’ - 프로퍼티가 포함된 표현식을 사용할 수 있다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
   @Value("#{1+1}")//#{}로 안의 표현식을 인식하고 결과값을 프로퍼티에 주입해준다.
int value;
@Value("#{'hello' + 'world'}")
String greeting;

@Value("#{1 eq 1}")
boolean tof;

@Value("${my.value}")//${}로 프로퍼티의 키값을 주입받을 수 있다.
int myValue;

@Value("#{${my.value} eq 100}")//표현식 내부에 프로퍼티를 넣을 수 있음.
boolean isMyValue;

@Value("#{'spring'}")//문자열 그대로 출력된다.
String spring;

@Value("#{sample.data}")//Bean의 데이터를 호출할 수 있음, 메소드 호출도 가능하다
int sData;

댓글