Spring/Spring_CoreTechnologies

SpringFrameWork CoreTechnition_section4_11부

whyWhale 2020. 11. 20.

SpEL( Spring Expression Language) ※메서드 호출과 기본 문자열 템플릿 기능

 

 

SpEL 

런타임 시 객체 그래프를 조회하고 조각하는 기능을 제공.

Unified EL( $ { }> ...} 비슷하지만, 메소드 호출과 문자열 템플릿 기능 제공.

모든 스프링 프로젝트 전반에 걸쳐 사용할 EL로 만들어졌습니다.

spring 3.0 지원.

 

문법

  • #("표현식")
  • $("프로퍼티")
  • 표현식안에 프로퍼티 사용 가능하지만 프로퍼티 안에 표현식 x.
  • 더 많은 내용은 reference 참고.

-주석 참조-

기본적인 사용방법들, 필드 변수의 기본값을 설정하는 예제

 

 

JavaBean 프로퍼티를 호출하는 예제로 다음에서 보듯이 문자열 프로퍼티 'Bytes'를 호출할 수 있습니다.

ex)

 

ExpressionParser parser = new SpelExpressionParser();

// 'getBytes()' 실행
Expression exp = parser.parseExpression("'Hello World'.bytes");

byte[] bytes = (byte[]) exp.getValue();

 

SpEL은 표준 'dot' 표기법(예: prop1.prop2.prop3)을 사용해서 중첩된 프로퍼티와 프로퍼티의 값 설정도 지원합니다.

 

 

SpEL은 메서드 호출이나 프로퍼티 접근, 생성자 호출같은 넓은 범위의 기능을 지원합니다..
// 빈을 참고하는 것 에 대한 부분은 sample 클래스 안에 멤버변수 data를 만들고 get/set을 만든 다음 진행 한 것입니다.

 

SpEL의 구성.

  • ExpressionParser = new sqelExpressionParserr()

ExpressionParser 인터페이스는 문자열 표현을 파싱하는 책임이 있다. 이 예제에서 문자열 표현은 따옴표로 묶인 문자열 리터럴로 표현됐다.

ex)

//Expression Parser 예제.
ExpressionParser parser=new SpelExpressionParser();
Expression expression=parser.parseExpression("2+100");
Integer value=expression.getValue(Integer.class); // expression도 컨버젼 타입을 사용하는 것.
out.println(value);

 

  • StandardEvaluationContext context=new StandardEvaluationContext(bean)

EvaluationContext 인터페이스

프로퍼티, 메서드, 필드를 처리하고 타입변환을 수행하는 표현식을 평가할 때 EvaluationContext 인터페이스를 사용한다. 새로운 구현체 StandardEvaluationContext는 객체를 조작하려고 리플렉션을 사용하고 성능을 향상시키기 위해서 java.lang.reflect의 Method, Field, Constructor를 캐싱합니다.
 타입변환

    본적으로 SpEL은 스프링 코어에서 사용할 수 있는 변환 서비스를 사용합니다.

    제너릭에 친화적이며 핵심 기능.(SpEL은 타입 유지를 위해 유지하려고 변환 시도.)

 

class Simple { 

public List<Boolean> booleanList = new ArrayList<Boolean>(); } Simple simple = new Simple();

 

simple.booleanList.add(true);

 

StandardEvaluationContext simpleContext = new StandardEvaluationContext(simple); 

// 여기서 false를 문자열로 전달하고 SpEL과 변환 서비스는 Boolean이 되어야 한다는 것을 인식하고 변환 합니다. 

parser.parseExpression("booleanList[0]").setValue(simpleContext, "false"); 

 

Boolean b = simple.booleanList.get(0); // b는 false가 됩니다.



  • Expression expression= parser.parseExpression("표현식")
  • String value=expression.getvalue(context,String.class)

 

실제 사용

  • @Value annotation

-자동연결(Autowired) 메서드나 생성자에서도 사용가능.

ex)

public class SimpleMovieLister { 

private MovieFinder movieFinder; private String defaultLocale; @Autowired public void configure(MovieFinder movieFinder, @Value("#{ systemProperties['user.region'] }"} String defaultLocale) { this.movieFinder = movieFinder; this.defaultLocale = defaultLocale;

}


  • @ConditionalOnExpression annotation -> SPA 지원 (ConditionalOn -> sprinf expression 기반 선별적 빈을 등록 및 설정파일을 읽는 애노테이션.)

+(SPA란 Single Page Application의 약자이다.

  단일 페이지 어플리케이션(SPA)는 현재 웹개발의 트랜드이다.

  기존 웹 서비스는 요청시마다 서버로부터 리소스들과 데이터를 해석하고 화면에 렌더링하는 방식이다. SPA형태는 브    라우저에 최초에 한번 페이지 전체를 로드하고, 이후부터는 특정 부분만 Ajax를 통해 데이터를 바인딩하는 방식

  즉 리로드 방식과는 다르게 ajax와 같은 처리 client-> server 그리고 json형식처리를 서버 -> client 보내주는 방식.

 

  • 스프링 시큐리티 

-hasRole,hasIpaddress 메소드 함수들은 EvaluationContext에서오는것으로빈을만들어주면빈이제공하는함수사용하는    것이가능하다.

- 메소드 시큐리티를 사용,@PreAuthorize,@PostAutorize,@PreFilter,@PostFilter

- xml 에서의 URL 설정. 

  • 스프링 데이터  -> Query 애노테이션

참조-docs.spring.io/spring-framework/docs/5.1.0.RELEASE/spring-framework-reference/core.html#expressions-language-ref

 

댓글