본문 바로가기

더 나은 엔지니어가 되기 위해/지금은 안쓰는 자바

[스프링 프레임워크 핵심 기술] SpEL

인프런에서 백기선님의 스프링 프레임워크 핵심 기술 을 공부하며 개인적으로 정리한 글입니다.

SpEL

SpEL 은 Spring Expression Language 로, 스프링에서 지원하는 일종의 표현식이다.

1) 예시

예를 들면 아래 같이 사용된다.

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

결과적으로 1 + 1 의 결과가 int value 에 담긴다.

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

String greeting 에는 "hello world" 가 담긴다.

즉, 코드 내에서 #{...} 로 표현되는 부분들은 SpEL 이라고 보면 된다.

2) 문법

사용 문법은 다음과 같다.

  • #{"표현식"}
  • ${"프로퍼티"}
  • 표현식은 프로퍼티를 가질 수 있지만, 반대는 안된다.

@Value 를 사용하는 다양한 예시를 보자.

@Component
public class AppRunner implements ApplicationRunner {

  // 일반적인 표현식 사용 예
  @Value("#{1 + 1}")
  int value;

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

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

  // 프로퍼티 사용 예
  @Value("${my.value}")
  String myValue;

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

  // 빈 속성 사용 예 (여기서는 Sample 이라는 빈을 사전에 정의 했음.)
  @Value("#{sample.value}")
  int sampleValue;

  @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(sampleValue);
  }
}

Runner 를 실행하면 다음과 같다.

2
hello world
true
100
true
100

이 외 @ConditionalOnExpression 등 다양한 SpEL 사용 방법은 공식 도큐먼트에 소개되어 있다.

사용되는 곳

실제로 스프링 내부의 많은 모듈들이 SpEL 을 사용한다.
강의에서 소개하는 바로는 다음과 같다.

  • 스프링 시큐리티

  • 스프링 데이터

    • @Query("select u from User u where u.age = ?#{[0]}")
  • Thymeleaf