스프링 핵심 기술-12.SpEL(스프링 Expression Language)


SpEL(스프링 Expression Language)

  • 객체 그래프를 조회하고 조작하는 기능을 제공한다.

    jsp 사용시와 비슷한 ${} 등 스프링 3.0 부터 개발 및 지원

  • Unified EL과 비슷하지만, 메소드 호출을 지원하며, 문자열 템플릿 기능도 제공한다.

  • OGNL, MVEL, JBoss EL 등 자바에서 사용할 수 있는 여러 EL이 있지만, SpEL은 모든 스프링 프로젝트 전반에 걸쳐 사용할 EL로 만들었다.
    (스프링 코어에 들어가게 됨, 스프링 시큐리티, 클라우드 등 다양한 부분에서 사용되고 있음)

코드 구현

@Component
public class AppRunner implements ApplicationRunner {

    @Value("#{1+1}")
    int value;

    @Value("#{'hello' + 'world'}")
    String greeting;

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

    // 프로퍼티 사용 - application.properties  my.value = 100
    @Value("${my.value}")
    int myValue;

    // 표현식 안에 프로퍼티를 감싸서 사용 (반대는 안됨)
    @Value("#{${my.value} eq 100}")
    boolean isMyValue100;

    @Value("#{'spring'}")
    String spring;

    // 빈에 등록된 값 Sample 클래스의 int data=1000; getter setter 구현 
    @Value("#{sample.data}")
    int sampleData;

    @Override
    public void run(ApplicationArguments args) throws Exception {
        System.out.println(value);
        System.out.println(greeting);
        System.out.println(trueOrFalse);
        System.out.println(myValue);
        System.out.println(isMyValue100);
        System.out.println(spring);
        System.out.println(sampleData);

        // 필요하다면 코딩으로 ExpressionParser를 구현 가능
        ExpressionParser parser = new SpelExpressionParser();
        Expression expression = parser.parseExpression("2 + 100"); // 자체가 익스프레션
        Integer value = expression.getValue(Integer.class);
        System.out.println(value);
    }
}

실행결과

2
helloworld
true
100
true
spring
1000
102

문법

  • #{“표현식”}
  • ${“프로퍼티”}
  • 표현식은 프로퍼티를 가질 수 있지만, 반대는 안 됨. (프로퍼티 안에서는 표현식 사용 불가)

    #{${my.data} + 1}

이 외에도 다양한 문법 및 오퍼레이션 존재 (레퍼런스 한번 훑어볼 것)
레퍼런스 참고

SpEL 구성

ExpressionParser parser = new SpelExpressionParser()
StandardEvaluationContext context = new StandardEvaluationContext(bean)
Expression expression = parser.parseExpression(SpEL 표현식”)
String value = expression.getvalue(context, String.class)

어디서 사용하나요?

  • @Value 애노테이션
  • @ConditionalOnExpression 애노테이션

    @ConditionalOnExpression도 SpEL 지원한다.
    ConditionalOnExpression는 선택적으로 빈 등록/관리할 수 있는데,
    이때 SpEL 기반으로 선별적으로 빈을 등록할 수 있음.

  • 스프링 시큐리티

    메소드 시큐리티, @PreAuthorize, @PostAuthorize, @PreFilter, @PostFilter
    ex. @PostFilter(hasRoll = ‘’) ..
    XML 인터셉터 URL 설정

  • 스프링 데이터

    @Query 애노테이션
    ex. @Quert(select u from user where firtsname = :#{custom.firstname})

  • Thymeleaf 외 기타 등..





© 2019. by jaeuk