자바에서 사용할 수 있는 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문법은 다음과 같다.
‘#{ (표현식) } ‘
‘${ (프로퍼티) } ‘ - SpEL은 프로퍼티를 표현할 수 있지만 반대로 프로퍼티는 SpEL을 표현할 수 없다.
‘#{ ${ (프로퍼티) } }’ - 프로퍼티가 포함된 표현식을 사용할 수 있다.
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;