본문 바로가기
Spring/Spring Core

[Section 4] SpEL (스프링 Expression Language)

by kevinntech 2020. 10. 10.

해당 게시물은 백기선님의 스프링 프레임워크 핵심 기술 강좌를 정리한 내용 입니다.

 

 

스프링 EL 이란? 

 

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

 

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

 

   - OGNL, MVEL, JBoss EL 등 자바에서 사용가능한 여러 EL이 있지만 SpEL은 Spring 프로젝트 전반에 걸쳐 사용하기 위해

      만들어졌으며 스프링 3.0부터 지원된다.

 

SpEL 문법 

 

① 표현식

 

     #{"표현식"}   : "표현식"을 평가(실행) 합니다. 


     ※ 표현식 안에는 프로퍼티를 사용 할 수 있지만, 반대는 안 됨. 

 

          #{${my.data} + 1} 는 가능

② 프로퍼티 참조

 

     ${"프로퍼티"}  : "프로퍼티"를 참조할 때 합니다.

 

빈이 만들어질때 @Value()의 값이 SpEL로 작성 되어 있다면 SpEL로 파싱한 다음, 평가(실행)해서 결과 값을 변수에 할당한다.

 

 추가적인 문법은 레퍼런스를 참고

 

SpEL 예시 - 기본적인 사용법

 

@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}")
    int myValue;

    @Value("#{${my.value} eq 100}")
    boolean isMyValue100;

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

    @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);
        System.out.println(isMyValue100);
        System.out.println(spring);
    }
}

 

SpEL 예시 - Bean References (빈 참조)

 

@Component
public class Sample {

    private int data = 200;

    public int getData() {
        return data;
    }

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

}

 

@Component
public class AppRunner implements ApplicationRunner {

    @Value("#{sample.data}")
    int sampleData;

    @Override
    public void run(ApplicationArguments args) throws Exception {
        System.out.println(sampleData);
    }
}

 

SPEL 구성

 

- ExpressionParser 인터페이스는 문자열 표현식을 파싱하는 역할을 한다. 

 

- Expression 인터페이스는 문자열 표현식을 평가하는 역할을 한다. 

 

- EvaluationContext 인터페이스는 프로퍼티, 메서드, 또는 필드를 처리하고 형 변환을 수행하는 표현식을 평가할 때 
   사용 된다. 

- 아래 코드에서 ExpressionParser의 구현체인 SpelExpressionParser 클래스를 사용해서 문자열 표현식을 파싱하고  
   Expression의 getValue() 메서드를 이용해 파싱된 결과 값을 얻는다.
   (이때 파라미터로 클래스 정보를 넘겨서 Integer 타입으로 형 변환된 결과 값을 얻는다.)

   그리고 그 결과를 출력한다.

 

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

 

SpEL이 사용되는 곳

 

① @Value 애노테이션 

 

② @ConditionalOnExpression 애노테이션 

 

③ 스프링 시큐리티 

     - 메소드 시큐리티, @PreAuthorize, @PostAuthorize, @PreFilter, @PostFilter 

     - XML 인터셉터 URL 설정 
   

          … 

 

④ 스프링 데이터 

      - @Query 애노테이션 

 

⑤ Thymeleaf

댓글