1. 의존성 확인

spring-boot-starter에 스케줄링 기능이 포함되어 있어 별도의 의존성 추가가 필요하지 않습니다.

 

2. 스케줄링 활성화

@EnableScheduling 애노테이션을 사용하여 스케줄링을 활성화합니다.

메인 애플리케이션 클래스나 설정 클래스에 추가합니다.

@SpringBootApplication
@EnableScheduling
public class TestApplication {
    public static void main(String[] args) {
        SpringApplication.run(TestApplication.class, args);
    }
}

 

3. @Scheduled 어노테이션 사용

스케줄링하려는 메서드에 @Scheduled 애노테이션을 추가합니다. 

주의사항으로 메서드에 인자를 받지 않는 void 리턴 타입의 메서드에만 적용할 수 있습니다.

  • fixedRate: 고정된 주기로 메서드를 실행합니다. (밀리초 단위)
  • fixedDelay: 이전 호출이 끝난 후 고정된 시간이 지난 후에 다음 메서드를 실행합니다. (밀리초 단위)
  • cron: CRON 표현식을 사용하여 메서드 실행 시간을 정의합니다.
 *      *      *      *      *      *
초(0-59) 분(0-59)  시간(0-23)  일(1-31)  월(1-12)  요일(0-7)

각 별 위치에 따라 주기를 다르게 설정 할 수 있음.
요일설징: 1~6(월요일~토요일) 0,7(일요일)

 

기본적으로 스프링 스케줄러는 단일 스레드에서 동작합니다. 

한 작업이 오래 걸리면 다른 스케줄링 작업이 지연될 수 있어 필요한 경우 스레드 풀을 설정이 필요합니다.

@Component
@Slf4j
public class ScheduledTasks {

    @Scheduled(fixedRate = 30000)
    public void taskAtThirtySeconds() {
        log.info("task at 30 seconds");
    }

    @Scheduled(cron = "0 0 12 * * ?")
    public void runAtNoonEveryDay() {
        System.out.println("Every day at noon");
    }
}

 

4. TaskScheduler Bean 설정

ThreadPoolTaskScheduler 사용하여 스레드 풀을 설정할 수 있습니다.

아래와 같이 Config 클래스에 TaskScheduler Bean 정의합니다.

메인 어플리케이션 클래스에서 @EnableScheduling 어노테이션은 생략 가능합니다.

@Configuration
@EnableScheduling
public class SchedulerConfig {

    @Bean
    public TaskScheduler taskScheduler() {
        ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
        // 원하는 스레드 풀 크기를 설정합니다.
        scheduler.setPoolSize(10); 
        // 로그 접두사를 설정합니다.
        scheduler.setThreadNamePrefix("scheduled-task-");        
        // shutdown 되기 전 task 모두 처리 될때까지 대기합니다. (30초)
        scheduler.setWaitForTasksToCompleteOnShutdown(true);
        scheduler.setAwaitTerminationSeconds(30);
        
        return scheduler;
    }
}

 

5. 동작 원리

@EnableScheduling 애노테이션이 설정 클래스에 추가되면 ScheduledAnnotationBeanPostProcessor가

애플리케이션 컨텍스트에 등록됩니다.

  • Bean 초기화 후 추가 작업으로 postProcessAfterInitialization 메서드가 실행됩니다.
  • @Scheduled 애노테이션이 붙은 메서드를 찾으면 해당 메서드의 스케줄링 정보(: fixedRate, cron )를
    읽어와 스케줄링 작업을 등록합니다.
  • 스케줄링 작업은 내부적으로 TaskScheduler를 사용하여 실행됩니다.

 

읽어주셔서 감사합니다.

 

레퍼런스
반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기