본문 바로가기
  • 오늘도 한걸음. 수고많았어요.^^
  • 조금씩 꾸준히 오래 가자.ㅎ
IT기술/spring

[Spring] SpEL, Value로 어노테이션에 값 전달하기

by 미노드 2024. 2. 27.

https://docs.spring.io/spring-framework/docs/3.2.x/spring-framework-reference/html/expressions.html

 

8. Spring Expression Language (SpEL)

This section introduces the simple use of SpEL interfaces and its expression language. The complete language reference can be found in the section Language Reference. The following code introduces the SpEL API to evaluate the literal string expression 'Hel

docs.spring.io

스프링 어노테이션을 통해 값을 전달하는 방법입니다.

SpEL 사용법

SpEL 표현식은 다음과 같은 규칙이 있습니다.

  • # 기호로 시작하고 중괄호로 묶는다. ex) #{expression}
  • 속성은 $ 기호로 시작하고 중괄호로 감싼다. ex) ${property.name}

스프링에서 SpEL이 자주 사용되는 어노테이션은 대략 다음과 같은 어노테이션들이 있습니다.

  • @Value
  • @PreAuthorize
  • @PostAuthorize
  • @PreFilter
  • @PostFilter

표현식은 다음과 같이 사용할 수 있습니다.

@Value("#{19 + 1}") // 20
private double add; 

@Value("#{'String1 ' + 'string2'}") // "String1 string2"
private String addString; 

@Value("#{1 == 1}") // true
private boolean equal;

@Value("#{250 > 200 && 200 < 4000}") // true
private boolean and; 

@Value("#{2 > 1 ? 'a' : 'b'}") // "a"
private String ternary;

@Value("#{'100' matches '\\d+' }") // true
private boolean validNumericStringResult;

@Value(#{systemProperties['priority'] ?: 'some default'})
private String priority;
...

SpEL 파싱

SpEL을 활용하여 파싱하고 표현 방식을 기준으로 결과로 변환할 수있습니다.
단순히 값을 지정하는 것이 아닌 표현 규칙에 맞게 변환된 값을 뽑아낼 수 있습니다.

ExpressionParser.class

ExpressionParser 는 문자열 표현을 파싱하는 책임을 가지고 Expression 는 문자열 표현의 평가를 책임집니다.
ExpressionParser, Expression 클래스를 이용하면 다음과 같이 SpEL을 파싱할 수 있습니다.

ExpressionParser expressionParser = new SpelExpressionParser();
Expression expression = expressionParser.parseExpression("'Any string'");
String result = (String) expression.getValue(); // "Any string"

Expression expression = expressionParser.parseExpression("'Any string'.length()");
Integer result = (Integer) expression.getValue(); // 10

EvaluationContext.class

EvaluationContext 는 프로퍼티, 메서드, 필드를 확인하고 타입 변환을 수행하는 표현식을 평가할 때 사용됩니다.
EvaluationContext 는 다음 두가지 구현체를 제공합니다.

  • SimpleEvaluationContext
    • SpEL의 전체 범위가 필요하지 않으며 의미 있게 제한되어야 할 때 사용
    • 자바 타입 참조, 생성자 및 bean 참조를 지원하지 않음
  • StandardEvaluationContext
    • 리플렉션을 기반으로 SpEL의 모든 기능 제공
Car car = new Car();
car.setMake("Good manufacturer");
car.setModel("Model 3");

ExpressionParser expressionParser = new SpelExpressionParser();
Expression expression = expressionParser.parseExpression("model");

EvaluationContext context = new StandardEvaluationContext(car);
String result = (String) expression.getValue(context);  // "Model 3"

출처 : https://devoong2.tistory.com/entry/SpELSpring-Expression-Langauge-%EC%82%AC%EC%9A%A9%EB%B2%95-%EC%96%B4%EB%85%B8%ED%85%8C%EC%9D%B4%EC%85%98%EC%97%90-SpEL%EB%A1%9C-%EB%B3%80%EC%88%98-%EC%A0%84%EB%8B%AC%ED%95%98%EA%B8%B0