Spring Expression Language (SpEL)은 Spring 프레임워크에서 제공하는 표현식 언어로, 런타임에 객체 그래프를 조회하고 조작할 수 있도록 지원한다.
SpEL은 다음과 같은 기능을 제공한다.
SpEL 표현식은 #{} 또는 ExpressionParser를 사용하여 평가할 수 있다.
ExpressionParser parser = new SpelExpressionParser();
Expression exp = parser.parseExpression("'Hello SpEL'");
String message = exp.getValue(String.class);
System.out.println(message); // Hello SpEL
ExpressionParser parser = new SpelExpressionParser();
// 문자열 길이 구하기
Expression exp = parser.parseExpression("'Hello World'.length()");
Integer length = exp.getValue(Integer.class);
System.out.println(length); // 11
System.out.println(parser.parseExpression("10 * 2").getValue()); // 20
System.out.println(parser.parseExpression("10 / 2").getValue()); // 5
System.out.println(parser.parseExpression("10 > 5").getValue()); // true
System.out.println(parser.parseExpression("'Spring' == 'Spring'").getValue()); // true
List<Integer> numbers = parser.parseExpression("{1, 2, 3, 4}").getValue(List.class);
System.out.pirntln(numbers); // [1, 2, 3, 4]
Map<String, String> map = parser.parseExpression("{'key': 'value'}").getValue(Map.class);
System.out.println(map.get("key")); // value
Spring 환경에서 SpEL을 사용하면 빈(Bean) 참조 및 조작이 가능하다.
@Component
public class MyBean {
@Value("#{10 + 20}") // SpEL 표현식 사용
private int sum;
@Value("#{systemProperties['user.name']}") // 시스템 프로퍼티 접근
private String userName;
}
@Component
public class AnotherBean {
@Value ("#{myBean.sum + 10}")
private int newSum;
}
@Value("#{someBean.property != null ? someBean.propperty : 'Default Value'}")
private String propertyWithDefault;
@Value("#{someBean.property ?: 'Default Value'}") // Elvis 연산자
private String elvisOperatorExample;
SpEL은 Spring Security와 함께 사용되어 권한 및 접근 제어에 활용된다.
@PreAuthorize("hasRole('ADMIN')")
public void adminOnlyMethod() {
// 관리자만 접근 가능
}
SpEL을 사용하면 Spring 애플리케이션에서 동적 속성 평가 및 조건문 활용이 더욱 유연해진다.