April
18th,
2021
SpEL이란?
SpEL은 Spring Expression Lanaugae의 줄임말로, 스프링의 객체들의 정보를 질의하거나 조작하여 어떤 값을 표현할 수 있는 강력한 표현 언어이다. 객체들의 정보는 레퍼런스로 연관되어 있는 객체 그래프를 탐색하여 얻어지기 때문에 런타임 때 SpEL의 표현식 값이 결정(Resolve)된다. 참고로, 객체 그래프는 런타임 때 객체간의 연관 관계를 통해 그려지는 그래프를 의미한다.
SpEL 구성
ExpressionParser parser = new SpelExpressionParser();
Expression expression = parser.parseExpression("2 + 100");
Integer value = expression.getValue(Integer.class);
System.out.println(value);
SpEL 활용 예시 및 문법
#{표현식}
${프로퍼티}
- 표현식은 프로퍼티를 가질 수 있지만, 프로퍼티는 표현식을 가지지 못함
- ` #{${my.data} + 1}`
package me.cjkim.demoSpring51;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;
@Component
public class AppRunner implements ApplicationRunner {
@Value("#{1+1}")
int value;
@Value("#{'hello '+ 'world'}")
String greeting;
@Value("#{1 eq 1}") //표현식으로 인식, 표현식 먼저 실행 후 결과 값을 property에 넣어준다.
Boolean trueorFalse;
@Value("hello") //그냥 value만 넣어도 상관없다
String hello;
@Value("${my.value}")
int myValue;
@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);
}
}
출력 결과 :
==================
2
hello world
true
hello
100
위와 같이 @Value
어노테이션을 이용해 spEL을 사용할 수 있다. #{}
는 표현식을 사용하고, ${}
는 프로퍼티를 사용한다. 스프링부트 프로젝트 내 application.properties
라는 파일에 프로퍼티 값을 관리할 수 있으며, 내부에 my.value=100
으로 키-값을 작성하였기 때문에 위와 같이 ` @Value(“${my.value}”)`로 값을 가져올 수 있다.
표현식은 내부적으로 프로퍼티를 가질 수 있지만, 반대는 불가능 한 점 유의하자.
SpEL의 활용처
@Value
어노테이션@ConditionalOnExpression
어노테이션 : 선택적으로 빈을 등록하거나 읽을 수 있는 어노테이션- 스프링 시큐리티
- 메소드 시큐리티, @PreAuthorize, @PostAuthorize, @PreFilter, @PostFilter
- XML 인터셉터 URL 설정
- 스프링 데이터
@Query
어노테이션
- Thymeleaf
참고 자료