SpEL이란?

SpELSpring 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

참고 자료

  1. 스프링 프레임워크 핵심 기술

oksusutea's blog

꾸준히 기록하려고 만든 블로그