-
SpringBoot에서 Scheduling 사용하기Spring Boot 2023. 10. 22. 17:55
스케줄링은 특정 시간 동안 작업을 실행하는 프로세스이다.
Spring Boot를 통해 Spring에서 지원하는 스케줄러를 간편하게 작성할 수 있다.스펙 요구사항

Schedule 기능 켜기
- 자바 설정(Java configuration) 관련 클래스에 @EnableScheduling 를 추가하면 기능을 사용할 수 있다.
package com.example.schedulingtasks; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.scheduling.annotation.EnableScheduling; @SpringBootApplication @EnableScheduling public class SchedulingTasksApplication { public static void main(String[] args) { SpringApplication.run(SchedulingTasksApplication.class); } }- 스케줄링 태스크을 만들어주고, 반복 주기와 어떤 메소드가 반복될 것인지 아래와 같이 설정한다. 주의할 점은, Class가 Component로 등록돼 있어야 한다.
package com.example.schedulingtasks; import java.text.SimpleDateFormat; import java.util.Date; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; @Component public class ScheduledTasks { private static final Logger log = LoggerFactory.getLogger(ScheduledTasks.class); private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss"); @Scheduled(fixedRate = 5000) public void reportCurrentTime() { log.info("The time is now {}", dateFormat.format(new Date())); } }어노테이션 내부 프라퍼티
- @Scheduled 어노테이션을 메소드에 선언하며 실행이 가능하며 실행주기는 아래와 같은 속성으로 구성돼 있다.
- cron
- fixedDelay
- fixedRate
- cron 으로 실행주기 설정하기.

- fixedDelay, fixedRate로 실행주기 설정하기.
- fixedDelay => 이전 수행이 종료된 시점부터 delay 후에 재호출
- fixedRate => 이전 수행이 시작된 시점부터 delay 후에 재호출된다.
- 그러므로 fixedRate 로 지정 시 동시에 여러개가 돌 가능성이 존재한다.
Thread pool 설정
- 기본적으로 모든 @Scheduled 작업은 Spring에 의해 생성 된 한개의 스레드 풀에서 실행된다.
- 그렇기 때문에 하나의 Scheduled이 돌고 있다면 그것이 다 끝나야 다음 Scheduled이 실행되는 문제가 있다.
- 스프링 부트에서 설정을 통해 Schedule에 대한 쓰래드 풀을 생성하고 그 쓰레드 풀을 사용하여 모든 스케줄 된 작업을 실행하도록 할 수 있다.
아래는 설정 방법에 대한 예제이다.
@Configuration public class SchedulerConfig implements SchedulingConfigurer { @Override public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { // Thread Pool 설정 ThreadPoolTaskScheduler threadPool = new ThreadPoolTaskScheduler(); // Thread 개수 설정 int n = Runtime.getRuntime().availableProcessors(); threadPool.setPoolSize(n); threadPool.initialize(); taskRegistrar.setTaskScheduler(threadPool); } }스케줄이 돌고있는 메소드에서 현재 스레드의 이름을 출력하면 아래와 같은 출력이 표시된다.

'Spring Boot' 카테고리의 다른 글
어노테이션 생성해서 Bean 컨테이너 생성 자체 관리하기 (0) 2024.01.10 스프링부트 3.0으로 전환 (0) 2023.10.22 @ConfigurationProperties 사용법 (1) 2023.10.22 @Bean vs @Component 차이점 및 사용법 (1) 2023.10.22