SpEL
JSP 프로그래밍을 했다면 한 번쯤 봤을법한 <c:out>
등을 EL(Expression Language)라고 한다.
이렇게 런타임에 여러 값들을 읽을 수 있는 스크립트를 제공하는데, 스프링에서도 3.0부터 지원하고 있다.
아무래도 가장 SpEL이 자주 사용된다고 생각되는 것은, @Value
어노테이션으로 각종 속성 값을 읽어 오는 것이다.
@Component
public class AppRunner implements ApplicationRunner {
@Value("${spring.profiles.active}")
private String activeProfile;
@Value("#{systemProperties['user.region']}")
private String region;
@Override
public void run(ApplicationArguments args) throws Exception {
System.out.println("--------------");
System.out.println(activeProfile);
System.out.println(region);
System.out.println("--------------");
}
}
위 같은 경우 $
구문으로 시작하는 것은 프로퍼티 값에 접근하는 것이다.
#
으로 시작하는 것은 SpEL 구문을 의미하며, 여기서는 시스템 프로퍼티에 정의된 값을 읽어오는 것이다.
또한 JSP에서도 이를 활용하여 프로퍼티 값을 읽어 올 수 있다.
<spring:eval expression="@environment.getProperty('spring.profiles.active')" var="activeProfile" />
이 외에도 자바의 라이브러리에서는 기본 메소드만으로 해결하기 어려운 경우 SpEL을 사용하여 강력한 기능을 만들어 낼 수 있다. 아래는 각각 Spring Data JPA와 Spring Security에서 사용되는 구문이다.
@Query("select u from User u where u.firstname like %?1")
List<User> findByFirstnameEndsWith(String firstname);
@PreAuthorize("hasPermission(#contact, 'admin')")
public void deletePermission(Contact contact, Sid recipient, Permission permission);
참고