본문 바로가기
TIL

TIL내일배움캠프 15주차 Spring Scheduler

by 율량동박씨 2024. 7. 23.

오늘의 키워드

  • Spring Scheduler

오늘의 내용

Spring Scheduler는 일정한 시간 간격이나 특정 시간에 코드를 실행할 수 있도록 하는 기능으로 @Scheduled 어노테이션을 사용하여 작업을 예약할 수 있고 Spring Scheduler를 설정하고 사용하는 방법은 다음과 같다

  • Application 클래스에 @EnableScheduling 추가:
@EnableScheduling
@SpringBootApplication
public class SchedulerApplication {
    public static void main(String[] args) {
        SpringApplication.run(SchedulerApplication.class, args);
    }
}
  • 스케줄링 작업을 위해 ScheduleConfig 작성:
@Configuration
@EnableScheduling
public class ScheduleConfig {
    
    @Scheduled(fixedDelay = 1000) // 1초마다 실행
    public void run() {
        System.out.println("Hello World");
    }
}
  • 스프링 빈에 등록된 클래스만 가능하다

 

  •  Scheduled의 속성들
    • fixedDelay : milliseconds 단위로, 이전 Task의 종료 시점으로부터 정의된 시간만큼 지난 후 Task를 실행한다
      @Scheduled(fixedDelay = 1000)
    • fixedDelayString : fixedDelay와 같은데 문자열로 값을 표현한다
      @Scheduled(fixedDelay = "1000")
    • fixedRate : milliseconds 단위로 이전 Task의 시작 시점으로부터 정의된 시간만큼 지난 후 Task를 실행한다
    • fixedRateString : fixedRate와 같은데 문자열로 값을 표현한다
    • fixedRate는 작업 수행시간과 상관없이 일정 주기마다 메서드를 호출하는 것이고 
      fixedDelay는 (작업 수행 시간을 포함하여) 작업을 마친 후부터 주기 타이머가 돌아 메서드를 호출하는 것이다
    • initialDelay : 스케줄러에서 메소드가 등록되자마자 수행하는 것이 아닌 초기 지연시간을 설정하는 것이다
      @Scheduled(fixedRate = 5000, initialDelay = 3000)
    • initialDelayString : 위와 마찬가지로 문자열로 값을 표현하겠다는 의미이다
    • cron : Cron 표현식을 사용해 작업을 예약한다
      @Scheduled(cron = "* * * * * *")

      * : 모든 조건(매시, 매일, 매주처럼 사용)을 의미
      ? : 설정 값 없음 (날짜와 요일에서만 사용 가능)
      - : 범위를 지정할 때 
      , : 여러 값을 지정할 때 
      / : 증분값, 즉 초기값과 증가치 설정에 사용 
      L : 마지막 - 지정할 수 있는 범위의 마지막 값 설정 시 사용 (날짜와 요일에서만 사용 가능) 
      W : 가장 가까운 평일(weekday)을 설정할 때
    • zone : cron 표현식을 사용했을 때 time zone을 따로 설정하지 않으면 기본적으로 Local의 time zone이다
      @Scheduled(cron = "* * * * * *", zone = "Asia/Seoul")
  • 동적 스케줄링 : 애플리케이션 실행 중에 스케줄을 동적으로 변경할 수 있고 Spring에서 제공하는 TaskScheduler를 사용해 런타임에 스케줄을 변경할 수 있다
@Configuration
public class DynamicSchedulerConfig {
    @Bean
    public TaskScheduler taskScheduler() {
        return new ThreadPoolTaskScheduler();
    }
}

@Service
public class DynamicSchedulerService {
    @Autowired
    private TaskScheduler taskScheduler;

    private ScheduledFuture<?> futureTask;

    public void scheduleTask(Runnable task, String cronExpression) {
        if (futureTask != null) {
            futureTask.cancel(true);
        }
        futureTask = taskScheduler.schedule(task, new CronTrigger(cronExpression));
    }
}

오늘의 회고

 최종 프로젝트 기능을 구현하면서 매일매일 도전을 하는 기능을 구현하다가 spring batch와 schedule 중 고민을 했는데 내가 작업하는 기능은 대용량 데이터를 처리하는 게 아니다 보니 schedule을 사용하기로 했고 그에 대해 공부를 해보았다