본문 바로가기

개발/Spring

SpEL(스프링 Expression Language)

반응형

스프링 EL 이란 
 - 객체 그래프를 조회하고 조작하는 기능을 제공한다.
 - Unified EL과 비슷하지만, 메소드 호출을 지원하며, 문자열 템플릿 기능도 제공한다.
 - OGNL, MVEL, JBOss EL 등 자바에서 사용할 수 있는 여러 EL이 있지만, SpEL은 모든 스프링 프로젝트 전반에 걸처 사용할 EL로 만들었다.
 - 스프링 3.0 부터 지원이 가능하다.

package com.bpkim.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}")
    boolean trueOrFalse;

    @Value("hello")
    String hello;

    // $ 표현식
    @Value("${my.value}")
    String myValue;

    // 표현식 안에선 프로퍼티 사용가능
    // 프로퍼티 안에선 프로퍼티 사용 불가
    @Value("#{${my.value} eq 100}")
    boolean isMyValue100;

    // 빈에 있는 값
    @Value("#{sample.data}")
    int simpleData;

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

--------------

package com.bpkim.demospring51;

import org.springframework.stereotype.Component;

@Component
public class Sample {
    private int data = 200;

    public int getData() {
        return data;
    }

    public void setData(int data) {
        this.data = data;
    }
}

- 실행결과

 

** Spring Expression Language를 실제로 사용하는 곳은 ?
 - @Value 애노테이션
 - @ConditionalOnExpression 애노테이션
   선택적으로 빈을 등록하거나, 선택적으로 빈을 읽어 들일때 사용하는 것 
 - Spring Security
  메소드 시큐리티 , @PreAhthorize, @PostAuthorize, @PreFilter, @PostFilter
  XML 인터셉터 URL 설정
   >> 이러한 것은 EvaluationContext 에서 빈을 만들어주고 빈이 제공하는 것을 쓸 수 있다.
 - Spring Data 의 쿼리 애노테이션

SpEL 구성
ExpressionParser parser = new SpeelExpressionParser();
StandardEvaluationContext Context = new StandardEvaluationContext(bean)
Expression expriession = parser.parserExpression("SpEL 표현식");
String value = expriession.getValue(context, String.class

- 코드로 구현 

package com.bpkim.demospring51;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.expression.Expression;
import org.springframework.expression.ExpressionParser;
import org.springframework.expression.spel.standard.SpelExpressionParser;
import org.springframework.stereotype.Component;

@Component
public class AppRunner implements ApplicationRunner {

    @Override
    public void run(ApplicationArguments args) throws Exception{

        ExpressionParser parser = new SpelExpressionParser();
        Expression expression = parser.parseExpression("2+100");
        Integer value = expression.getValue(Integer.class);
        System.out.println(value);
    }
}

- 실행 결과

반응형

'개발 > Spring' 카테고리의 다른 글

AOP - 프록시 기반 AOP  (0) 2021.04.27
스프링 AOP - 개념  (0) 2021.04.27
데이터 바인딩 추상화 Converter와 Formatter  (0) 2021.04.23
데이터 바인딩 추상화: PropertyEditor  (0) 2021.04.22
Validation 추상화  (0) 2021.04.22