상세 컨텐츠

본문 제목

SpEL (Spring Expression Language)의 간략한 이해

IT이야기/Java

by Rahs 2017. 2. 28. 10:07

본문











Spring Reference 링크 : 원문보기

공식 사이트의 Reference 문서를 보면 상기 표제에 대해서 아래와 같이 정의가 되어 있습니다.



10. Spring Expression Language (SpEL)


§ 10.1 Introduction


The Spring Expression Language (SpEL for short) is a powerful expression language that supports querying and manipulating an object graph at runtime. The language syntax is similar to Unified EL but offers additional features, most notably method invocation and basic string templating functionality.



대부분의 방문자들께서 영어는 싫어하시니 토익 955점의 제가 정확하게 번역해보자면 (어이..)


스프링 표현언어(이하 SpEL)는 실행 중인 1)object graph에 질의를 하여 원하는 값을 얻거나 2)object graph 자체의 값을 변경하는데 사용되는 매우 강력한 표현어입니다.  언어의 문법은 범용 EL과 유사하지만 문자열을 다루는 부분과 메서드를 실행시키는 부분에 특화된 추가적인 기능들을 제공합니다.


...라고 합니다.


이제 object graph가 무슨 뜻인지만 알면 되겠네요. 검색 결과는 아래와 같습니다.


object graph 출처: 윅셔너리

(software) A view of an object system at a particular point in time that details the relationships between class instances.


어느 특정 시점을 기준으로 한, 클래스 인스턴스 간의 관계를 알 수 있도록 하는 객체 시스템의 어떤 단면 또는 성질 정도로 의역할 수 있겠는데 내용 이해만이 목적이라면 뒤에 graph는 잘라내도 상관없습니다. 모두가 잘 아는 객체라고 이해하시고 넘어가면 되겠습니다.


즉, 이 SpEL이라는 것은 실행 시에, 1) 객체로부터 원하는 값을 얻어내거나, (≒getter) 2) 객체의 값을 조작하는데 (≒setter) 사용되는 어떤 도구라는 의미죠. 물론 getter와 setter가 있어야 되겠죠! 검색을 하셨다는 것은 이미 용도는 알고 계실거라 생각되니 예시 코드들을 보시면서 사용법 위주로 접근하시면 되겠습니다.


 본문에서는 개인적으로 SpEL에 대한 감을 잡는데 가장 도움이 많이 된 10.3 Expression Evaluation using Spring's Expression Interface의 첫번째, 여섯번째 예시 코드와 10.5.11 Variables 부분의 예시 코드를 살펴볼 것입니다.

시작해볼까요?


우선 아래 코드는 Inventor 클래스에 대한 정의입니다. (해당 문서 가장 아래쪽에 나와 있습니다.)


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

import java.util.Date;

import java.util.GregorianCalendar;

 

public class Inventor {

 

    private String name;

    private String nationality;

    private String[] inventions;

    private Date birthdate;

    private PlaceOfBirth placeOfBirth;

 

    public Inventor(String name, String nationality) {

        GregorianCalendar c= new GregorianCalendar();

        this.name = name;

        this.nationality = nationality;

        this.birthdate = c.getTime();

    }

 

    public Inventor(String name, Date birthdate, String nationality) {

        this.name = name;

        this.nationality = nationality;

        this.birthdate = birthdate;

    }

    // getters and setters

}

Colored by Color Scripter

cs



10.3 Expression Evaluation using Spring's Expression Interface의 첫 번째 예시 코드


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

ExpressionParser parser = new SpelExpressionParser();

// parser 역할을 할 ExpresssionParser 클래스의 인스턴스를 생성했습니다.

 

Expression exp = parser.parseExpression("'Hello World'");

// parsing 대상을 넣어준 것처럼 보이죠? 정확합니다.

// 현재 'Hello World' 라는 내부 값을 가진 String 객체 하나를 재료로 넣은 겁니다.

// 그 결과값이 무엇이 되었든 그 상태로 exp라는 객체에 넣어둔 거죠.

 

String message = (String) exp.getValue();

// 자, 이제 exp라는 객체에서 getValue 메서드를 통해 결과값을 추출해냅니다.

// 메서드의 반환타입을 확인해보면 Object 타입을 반환할 것으로 추측되네요.

// 우리는 안에 들어있던 값이 String 이었다는 것을 알고 있기 때문에 형변환 연산자를 통해,

// 추출된 결과값을 String으로 형변환을 해줍니다.

 

//message 라는 변수에는 이제 'Hello World'라는 문자열 값이 저장됩니다.

cs



10.3 Expression Evaluation using Spring's Expression Interface의 여섯번째 예시 코드


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

// SpEL : 객체에서 원하는 값 얻어내기 (querying)

// Create and set a calendar

GregorianCalendar c = new GregorianCalendar();

c.set(185679);

 

// The constructor arguments are name, birthday, and nationality.

Inventor tesla = new Inventor("Nikola Tesla", c.getTime(), "Serbian");

 

ExpressionParser parser = new SpelExpressionParser();

// parser 를 생성해줍니다.

 

Expression exp = parser.parseExpression("name");

// name이라는 값을 parsing하도록 설정합니다.

 

EvaluationContext context = new StandardEvaluationContext(tesla);

// parsing 대상이 될 객체를 context에 셋팅합니다.

 

String name = (String) exp.getValue(context);

// 매개변수로 주어진 context에서 이미 설정된 name이라는 값을 찾아내어 반환해줍니다.

// name에는 "Nikola Tesla"라는 문자열이 저장되게 됩니다.

cs



10.5.11 Variables의 예시 코드


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

// SpEL : 변수를 이용한 객체 값 조작 (manipulating)

 

Inventor tesla = new Inventor("Nikola Tesla""Serbian");

 

StandardEvaluationContext context = new StandardEvaluationContext(tesla);

// parsing의 대상이 될 객체를 context에 설정했습니다.

 

context.setVariable("newName""Mike Tesla");

// context안에 변수를 선언했습니다. 변수명은 newName, 값은 Mike Tesla가 되겠습니다.

 

parser.parseExpression("Name = #newName").getValue(context);

// 이제 parser 설정을 합니다. 이 parser는 name이라는 이름으로 할당된 공간을 찾아서,

// 그 곳에 자신이 가지고 있는 변수 중 newName이라는 이름을 가진 변수의 값을 채워넣을겁니다.

 

// 지금 context에는 tesla가 들어가있죠. tesla의 name에는 Nikola Tesla가 들어가있는 상태입니다.

// 또, context에는 newName이라는 변수가 설정되어 있고, 그 값은 Mike Tesla라는 문자열이죠.

 

System.out.println(tesla.getName()) // "Mike Tesla"

// 타-란! 그래서 위의 객체 조작을 거친 tesla라는 인스턴스의 name 변수에는

// Nikola Tesla가 아닌, Mike Tesla가 들어있게 되는 것입니다.

cs



처음에 접하고 이해하는데 조금 시간이 걸렸던 부분이고, 또 사용을 하지 않다가 보면 까맣게

잊어버릴 수도 있으니 한번 정리해 보았습니다.

혹시 잘못된 부분이나 추가할 부분이 있으면 알려주시면 대단히 감사드리겠습니다 :)


그럼 이만 모두 안녕히~


'IT이야기 > Java' 카테고리의 다른 글

네티 4.x 유저 가이드(Netty Uesr guide for 4.x)  (2) 2018.02.26
Thread를 생성하는 3가지 방법  (0) 2017.02.08

관련글 더보기

댓글 영역