[Spring] SpEL - Spring Expression Language
SpEL(Spring Expression Language)๋?
Spring expression language๋ ๋ณดํต SpEL๋ก ํ๊ธฐํ๋ฉฐ ๊ตฌ๋๋ก๋ ์คํ๋ง EL์ด๋ผ๊ณ ์ง์นญํ๋ค.
SpEL์ ๋ณดํต ๊ฐ์ฒด๋ฅผ ์กฐํํ๊ณ ์กฐ์ํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ์ฌ Unified EL๊ณผ ์ ์ฌํ์ง๋ง ๋ฉ์๋ ํธ์ถ, ๋ฌธ์์ด ํ ํ๋ฆฟ ๊ธฐ๋ฅ ๋ฑ์ ์ฌ๋ฌ๊ฐ์ง ์ถ๊ฐ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ํํ์ ์ธ์ด์ด๋ค.
OGNL, MVEL, JBoss EL ๋ฑ ์๋ฐ์์ ์ฌ์ฉ๊ฐ๋ฅํ ์ฌ๋ฌ EL์ด ์์ง๋ง SpEL์ Spring ํ๋ก์ ํธ ์ ๋ฐ์ ๊ฑธ์ณ ์ฌ์ฉํ๊ธฐ ์ํด ๋ง๋ค์ด์ก์ผ๋ฉฐ ์คํ๋ง 3.0๋ถํฐ ์ง์๋๋ค.
SpEL ํ๊ธฐ๋ฒ
#{ SpELํํ์ }
JSP์์ EL์ ์ฌ์ฉํด์ ๊ฐ์ฒด์ ํ๋กํผํฐ๋ฅผ ๊บผ๋ผ๋ ${ } ์ด๋ผ๊ณ ํ๊ธฐํ๋ฏ SpEL์ #{ }๋ก ํ๊ธฐํ๋ค.
#{ } ์์ ๋ด์ฉ์ SpEL ํํ์์ผ๋ก ์ธ์ํด์ ํํ์์ evaluation(ํ๊ฐ, ์คํ) ํ๋ค.
์ฐธ๊ณ ๋ก ์คํ๋ง์์ ${ } ํ๊ธฐ๋ ์ฌ์ฉ๋๋๋ฐ ์ด๋ SpEL์ด ์๋๋ผ ํ๋กํผํฐ๋ฅผ ์ฐธ์กฐํ ๋ ์ฌ์ฉํ๋ค.
SpEL์ ๊ธฐ๋ณธ์ ์ผ๋ก #{ } ๋ก ํ๊ธฐํ๋ค๋ ๊ฒ์ ๊ธฐ์ตํด๋์.
SpEL ์ง์ ๊ธฐ๋ฅ
- ๋ฆฌํฐ๋ด ํํ์ (Literal Expression)
- Boolean๊ณผ ๊ด๊ณ์ฐ์ฐ์ (Boolean and Relational Operator)
- ์ ๊ท ํํ์ (Regular Expression)
- ํด๋์ค ํํ์ (Class Expression)
- ํ๋กํผํฐ, ๋ฐฐ์ด, ๋ฆฌ์คํธ, ๋งต์ ๋ํ ์ ๊ทผ ์ง์ (Accessing properties, arrays, lists, maps)
- ๋ฉ์๋ ํธ์ถ (Method Invocation)
- ๊ด๊ณ์ฐ์ฐ์ (Relational Operator)
- ํ ๋น (Assignment)
- ์์ฑ์ ํธ์ถ (Calling Constructors)
- Bean ์ฐธ์กฐ (Bean References)
- ๋ฐฐ์ด ์์ฑ (Array Contruction)
- ์ธ๋ผ์ธ ๋ฆฌ์คํธ/๋งต (Inline List/Map)
- ์ผํญ ์ฐ์ฐ์ (Ternary Operator)
- ๋ณ์ (Variables)
- ์ฌ์ฉ์ ์ ์ ํจ์ (User defined functions)
- Collections Projection
- Collections Selection
- Templated expression
@Value ์ ๋ ธํ ์ด์ ์์ SpEL ์ฌ์ฉ
SpEL์ด ์ค์ง์ ์ผ๋ก ๋ง์ด ์ฌ์ฉ๋๋ ๊ณณ ์ค ํ๋๋ @Value ์ ๋ ธํ ์ด์ ์ด๋ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
@Value("#{1+1}")
int value;
@Value("#{'hello ' + 'world'}")
String greeting;
@Value("#{1 eq 5}")
boolean trueOrFalse;
@Value("Literal String")
String literalString;
@Override
public void run(ApplicationArguments args) throws Exception {
System.out.println(value);
System.out.println(greeting);
System.out.println(trueOrFalse);
System.out.println(literalString);
}
|
cs |
์คํ ๊ฒฐ๊ณผ
๋น์ด ๋ง๋ค์ด์ง๋ @Value() ์์ ๊ฐ์ด #{ } ํ๊ธฐ๋ก ๊ฐ์ธ์ ธ์์ผ๋ฉด SpEL๋ก ํ์ฑํ๊ณ ํ๊ฐ(์คํ)ํด์ ๊ฒฐ๊ณผ๊ฐ์ ๋ณ์์ ํ ๋นํ๋ค.
SpEL๊ณผ ํ๋กํผํฐ
SpEL์ ํ๋กํผํฐ๋ฅผ ๊ฐ์ง ์ ์์ง๋ง ๋ฐ๋๋ ๋ถ๊ฐ๋ฅํ๋ค.
1
2
3
4
5
6
7
|
@Value("#{'${my.value}' eq '100'}")
boolean isEqual;
@Override
public void run(ApplicationArguments args) throws Exception {
System.out.println(isEqual);
}
|
cs |
์คํ ๊ฒฐ๊ณผ
true
Bean Reference(๋น ์ฐธ์กฐ) ๋ฐฉ๋ฒ
#{๋นid.ํ๋กํผํฐ} ํ์์ผ๋ก ์ฐธ์กฐํ๋ค.
1
2
3
4
5
6
7
8
9
10
11
|
import org.springframework.stereotype.Component;
@Component
public class Sample {
private int value = 123;
public int getValue() {
return value;
}
}
|
cs |
1
2
3
4
5
6
7
|
@Value("#{sample.Value}")
int sampleValue;
@Override
public void run(ApplicationArguments args) throws Exception {
System.out.println(sampleValue);
}
|
cs |
์คํ ๊ฒฐ๊ณผ
123
Expression์ ์ด์ฉํ SpEL ํ์ฑ
1
2
3
4
|
ExpressionParser parser = new SpelExpressionParser();
Expression expression = parser.parseExpression("1+1");
Object value = expression.getValue();
System.out.println(value); // 2
|
cs |
ExpressionParser์ ๊ตฌํ์ฒด SpelExpressionParser๋ก SpEL์ ๋ด์ฉ์ ํ์ฑ(Parsing) ํ๊ณ Expression์ getValue() ๋ฉ์๋๋ฅผ ์ด์ฉํด ํ์ฑ๋ ๊ฒฐ๊ณผ๊ฐ์ Object ํ์ ์ผ๋ก ์ป์ ์ ์๋ค.
1
2
3
4
|
ExpressionParser parser = new SpelExpressionParser();
Expression expression = parser.parseExpression("1+1");
int value = expression.getValue(Integer.class);
System.out.println(value); // 2
|
cs |
getValue() ํธ์ถ ์ Class์ ๋ณด๋ฅผ ๋๊ธฐ๋ฉด ์๋์ผ๋ก ํ์ ์บ์คํ ์ด ๊ฐ๋ฅํ๋ค.
EvaluationContext๋ฅผ ์ด์ฉํ SpEL ํ์ฑ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
// name, nationality๋ฅผ ํ๋ผ๋ฏธํฐ๋ก ๊ฐ๋ ์์ฑ์
Inventor tesla = new Inventor("Nikola Tesla","Serbian");
ExpressionParser parser = new SpelExpressionParser();
Expression exp = parser.parseExpression("name"); // name ํ๋กํผํฐ
// Context์ tesla๊ฐ์ฒด๋ฅผ ๋ฃ์ด์ค๋ค.
EvaluationContext context = new StandardEvaluationContext(tesla);
String name1 = (String) exp.getValue(context); //name = "Nikola Tesla"
System.out.println(name1); // Nikola Tesla
// getValue ๋ฉ์๋ ํธ์ถ ์ StandardEvaluationContext๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ๊ฐ์ฒด๋ฅผ ์ง์ ์ง์
String name2 = (String) exp.getValue(tesla);
System.out.println(name2); // Nikola Tesla
|
cs |
StandardEvaluationContext์ name ํ๋กํผํฐ๊ฐ ํ๊ฐ ๋ ๊ฐ์ฒด๋ฅผ ์ง์ ํ๋ค. (name1)
StandardEvaluationContext๋ฅผ ์ฌ์ฉํ์ง ์๊ณ getValue()์ ๊ฐ์ฒด๋ฅผ ์ง์ ์ง์ ํ ์๋ ์๋ค.(name2)
StandardEvaluationContext๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์์ฑ ๋น์ฉ์ด ๋ฐ์ํ์ง๋ง ํ๋์ ๋ํด ์บ์ฑํ๊ธฐ ๋๋ฌธ์ ๋ฐ๋ณต์ ์ผ๋ก ์ฌ์ฉํ๋ฉด ํํ์ ํ์ฑ์ด ๋ ๋น ๋ฅด๋ค๋ ์ฅ์ ์ด ์๋ค.
๐ก SpEL๋ ํด๋นํ๋ ํ์ ์ผ๋ก ๋ณํํ ๋ ConversionService๋ฅผ ์ฌ์ฉํ๋ค.
References
์ธํ๋ฐ - ๋ฐฑ๊ธฐ์ ๋์ ์คํ๋ง ํ๋ ์์ํฌ ํต์ฌ ๊ธฐ์
https://docs.spring.io/spring/docs/current/spring-framework-reference/core.html#expressions
https://jaehun2841.github.io/2018/11/21/2018-11-21-spel-expression
'Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์คํ๋ง ๋ถํธ์ ์์กด์ฑ ๊ด๋ฆฌ(Dependency Management) (0) | 2020.03.11 |
---|---|
์คํ๋ง ๋ถํธ ํ๋ก์ ํธ ๋ง๋ค๊ธฐ - Spring Initializr ์น ๋๊ตฌ ์ฌ์ฉ (0) | 2020.03.11 |
[Spring] ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ - PropertyEditor, Converter ๊ทธ๋ฆฌ๊ณ Formatter (1) | 2020.03.06 |
[Spring] Validation ์ถ์ํ (0) | 2020.03.05 |
[Spring] Resource ์ถ์ํ (0) | 2020.03.05 |
๋๊ธ