본문 바로가기

Java/Spring Boot

스케줄러 cron 설정을 Global Properties 값으로 변경

스케줄러의 실행 시점을 설정해주는 cron 설정에 Enum상수의 필드값을 사용할 수 없었습니다.

private String every30Minutes = ServerProperties.SCHEDULER_CRON.getValue();

@Scheduled( cron = every30Minutes, zone = "Asia/Seoul" )
    @Transactional
    public void findExpiredMembers(){
실행 결과 : 
error: element value must be a constant expression
    @Scheduled( cron = every30Minutes, zone = "Asia/Seoul" )
                       ^

이는 컴파일 타임에 @Scheduled 어노테이션이 cron 설정 값을 필요로 하는데,

getValue() 메서드를 통해 값을 얻는 것은 런타임에 수행되므로 컴파일 타임 상수가 아니기 때문에 발생하는 문제입니다.

@Value 와 Property를 이용하는 방법도 마찬가지로 사용할 수 없었습니다.

 

→ 해결방법 : Property를 이용하는 방법

Application.yml 파일에 다음과 같이 작성합니다

cron:
  expression: 0 0/30 * * * ?
  timezone: Asia/Seoul

 

cron설정에 @Value 를 사용할 때 처럼 “${}”를 이용하여 주입합니다

@Scheduled( cron = "${cron.expression}", zone = "${cron.timezone}" )
@Transactional
public void findExpiredMembers(){