은은하게 코드 뿌시기

SPEL (Spring Expression Language) / 스프링 표현언어 본문

웹/Spring Boot

SPEL (Spring Expression Language) / 스프링 표현언어

은은하게미친자 2023. 4. 17. 13:00
728x90

1. SPEL 이란?

 

SpEL(Spring Expression Language)은 스프링 프레임워크에서 제공하는 표현 언어로, 스프링 애플리케이션의 설정이나 데이터 처리와 관련된 동적인 표현식을 지원합니다. 스프링 부트는 SpEL을 통해 애플리케이션의 구성과 동작을 유연하게 설정하고 제어할 수 있습니다.

SpEL은 다양한 문법을 제공하여 런타임 시에 표현식을 평가하고 결과를 도출할 수 있습니다. 스프링 부트에서 SpEL은 주로 다음과 같은 용도로 사용될 수 있습니다:

 

2.SPEL  사용 용도

프로퍼티 값 참조 application.properties 또는 application.yml과 같은 설정 파일에서 정의한 프로퍼티 값을 SpEL을 사용하여 동적으로 참조할 수 있습니다. 예를 들어, ${custom.prop.route-master}와 같이 SpEL을 사용하여 프로퍼티 값을 참조하여 URL 패턴을 설정할 수 있습니다.
빈 간의 의존성 주입 SpEL을 사용하여 빈 간의 의존성을 동적으로 주입할 수 있습니다. 예를 들어, @Autowired 애노테이션에 SpEL을 사용하여 빈의 조건에 따라 다른 빈을 주입할 수 있습니다.
조건부 빈 등록 SpEL을 사용하여 특정 조건에 따라 빈을 동적으로 등록할 수 있습니다. 예를 들어, @Conditional 애노테이션에 SpEL을 사용하여 특정 조건에 따라 빈을 등록하거나 제외할 수 있습니다.
메소드 실행 및 데이터 처리 SpEL을 사용하여 메소드 실행이나 데이터 처리를 동적으로 수행할 수 있습니다. 예를 들어, @Value 애노테이션에 SpEL을 사용하여 동적으로 값을 설정하거나, @Cacheable 애노테이션에 SpEL을 사용하여 캐시 키를 동적으로 생성할 수 있습니다.
런타임 프로세싱 SpEL을 사용하여 런타임에 동적으로 표현식을 평가하고 결과를 처리할 수 있습니다. 예를 들어, SpelExpressionParser를 사용하여 동적으로 표현식을 분석하고, StandardEvaluationContext를 사용하여 변수와 함수를 등록하여 런타임에 표현식을 평가할 수 있습니다.

3. SPEL 문법

 

리터럴(Literal) 값을 직접 표현하는 방법입니다. 예를 들어, 정수, 실수, 불리언, 문자열 등을 리터럴로 표현할 수 있습니다.

예시: 42, 3.14, true, 'hello'
프로퍼티 참조(Property Reference)  ${} 형태로 사용되며, 설정 파일에 정의된 프로퍼티 값을 참조하는 방법입니다. 예를 들어, application.properties 파일에서 정의한 프로퍼티 값을 SpEL에서 참조할 수 있습니다.

예시: ${custom.prop.route-master}
빈 참조(Bean Reference)  @{} 형태로 사용되며, 스프링 컨텍스트에 등록된 빈을 참조하는 방법입니다. 예를 들어, 빈의 이름을 사용하여 해당 빈을 참조할 수 있습니다.

예시: @{myBean}
연산자(Operators) 산술, 논리, 비교, 조건 등 다양한 연산자를 사용하여 표현식을 조합하고 계산할 수 있습니다.

예시: +, -, *, /, %, ==, !=, >, <, >=, <=, AND, OR, NOT, ? : 등
메소드 호출(Method Invocation) . 연산자를 사용하여 빈의 메소드를 호출하고, 메소드의 인자를 전달할 수 있습니다. 예를 들어, 빈의 메소드를 호출하여 값을 계산하거나 메소드의 결과를 사용할 수 있습니다.

예시: @{myBean.someMethod()}, @{myBean.calculate(42)}
인덱스(Indexing)  리스트나 배열의 인덱스를 사용하여 특정 위치의 값을 참조할 수 있습니다. 예를 들어, 리스트의 첫 번째 항목이나 배열의 특정 인덱스의 값을 참조할 수 있습니다.

예시: @{myList[0]}, @{myArray[2]}
프로퍼티 접근(Property Access) 연산자를 사용하여 빈의 프로퍼티 값을 참조할 수 있습니다. 예를 들어, 빈의 프로퍼티 값을 참조하여 다른 표현식에 사용할 수 있습니다.

예시: @{myBean.propertyName}

4. SPEL 사용예

프로퍼티 참조(Property Reference) // application.properties 파일에 정의된 프로퍼티 값을 참조하는 예시
@Value("${custom.prop.route-master}")
private String routeMaster;
Request Mapping 설정에 사용하기  1. 메소드 파라미터 값 활용

@RestController
public class MyController {

    @RequestMapping(value = "/myPath/{id}")
    public String myMethod(@PathVariable("id") String id) {
        // id 값을 활용하여 비즈니스 로직 수행
        return "Hello, " + id + "!";
    }
}

2. 프로퍼티 값 활용
@RestController
public class MyController {

    @Value("${my.property.path}")
    private String myPath;

    @RequestMapping(value = "#{T(com.example.MyController).getPath()}")
    public String myMethod() {
        // 프로퍼티 값인 myPath를 활용하여 비즈니스 로직 수행
        return "Hello, " + myPath + "!";
    }

    public static String getPath() {
        return "/myPath";
    }
}

3. 빈 참조

@RestController
public class MyController {

    @Autowired
    private MyService myService;

    @RequestMapping(value = "/myPath")
    public String myMethod() {
        // myService 빈을 활용하여 비즈니스 로직 수행
        return myService.getMessage();
    }
}

@Component
public class MyService {

    public String getMessage() {
        return "Hello from MyService!";
    }
}

4. 매핑 값 application properties 에서 받아 사용하기

@RequestMapping("${custom.prop.route-master}")
public String myMethod() {
    // 요청 매핑 처리 로직
}

빈 참조(Bean Reference) 1. 빈 이름으로 참조

@Autowired
private MyBean myBean;

@Value("#{myBean.someProperty}")
private String someProperty;

연산자(Operators) // SpEL을 사용하여 연산을 수행하는 예시
@Value("#{42 + 3.14}")
private double result;

@Value("#{myBean.propertyName == 'someValue'}")
private boolean result;
메소드 호출(Method Invocation) // SpEL을 사용하여 빈의 메소드를 호출하는 예시
@Value("#{myBean.someMethod()}")
private String result;
조건식(Conditional Expression) // SpEL을 사용하여 조건식을 평가하는 예시
@Value("#{myBean.propertyName != null ? myBean.propertyName : 'defaultValue'}")
private String result;
컬렉션 처리(Collection Processing) // SpEL을 사용하여 컬렉션을 처리하는 예시
@Value("#{myList[0]}")
private String firstElement;

@Value("#{myMap['key']}") 
private String valueForKey;
728x90
Comments