본문 바로가기

개발기술/Spring

Spring 스케쥴러

Spring Scheduler

Spring Scheduler는 Spring Framework의 구성 요소로, 개발자가 특정 간격이나 시간에 작업을 수행할 수 있도록 도와줍니다. Spring Task API의 일부로, 외부 라이브러리에 의존하지 않고도 작업을 스케줄링할 수 있습니다. 백그라운드 작업 실행, 주기적인 데이터 처리, 작업 자동화, 정기적인 유지 보수 작업에 유용하게 사용할 수 있습니다.

Spring Scheduler의 주요 기능

  1. 간단한 설정:
    • 주석(annotation) 또는 XML 설정을 통해 스케줄 작업을 구성할 수 있어 간단하게 설정하고 관리할 수 있습니다.
  2. Spring Boot와의 통합:
    • Spring Boot에서는 최소한의 설정으로도 사용 가능하며, 많은 설정이 자동으로 구성됩니다.
  3. Fixed Delay와 Fixed Rate:
    • 지정된 간격으로 작업을 실행하거나, 이전 작업 완료 후 일정 시간 대기 후 실행할 수 있습니다.
  4. Cron 표현식 지원:
    • 복잡한 스케줄 패턴을 정의할 수 있는 Cron 표현식을 지원합니다.

 

Scheduler's Role

 

  • Fetching the list of participations eligible for deposit return is triggered periodically, making it a natural responsibility for a scheduler.
  • The scheduler is not performing the core business logic; it is merely triggering and coordinating the execution of this logic.

 

 

Spring Scheduler 설정

Spring Scheduler를 사용하려면 Spring Boot 애플리케이션에서 스케줄링을 활성화해야 합니다.

import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@EnableScheduling
public class MyApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }
}
  • @EnableScheduling 주석은 Spring의 스케줄링 기능을 활성화합니다.

작업 스케줄링

@Scheduled 주석을 사용하여 메서드를 스케줄 작업으로 표시할 수 있습니다. @Scheduled는 실행 주기를 구성하기 위한 다양한 옵션을 제공합니다.

1. Fixed Rate

  • 이전 작업의 시작 시점부터 지정된 간격으로 작업을 실행합니다.
  • 예: 5초마다 실행.
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
public class MyScheduledTask {

    @Scheduled(fixedRate = 5000)
    public void performTask() {
        System.out.println("5초마다 작업 실행");
    }
}

2. Fixed Delay

  • 이전 작업이 끝난 후 지정된 간격이 지난 뒤 작업을 실행합니다.
  • 예: 이전 작업이 끝난 후 5초 후 실행.
@Scheduled(fixedDelay = 5000)
public void performTaskWithFixedDelay() {
    System.out.println("이전 작업 종료 후 5초 후 작업 실행");
}

3. Cron 표현식

  • Cron 표현식을 사용하여 복잡한 스케줄을 정의할 수 있습니다.
  • 예: 매일 오전 10시에 실행.
@Scheduled(cron = "0 0 10 * * ?")
public void performTaskWithCron() {
    System.out.println("매일 오전 10시에 작업 실행");
}
 
  • Cron 표현식 형식:  특정한 시점에 수행을 시작. 초 분 시간 일 월 요일 [연도(선택)]
  • Cron :  유닉스 및 유닉스 계열 운영 체제(예: Linux)에서 사용되는 시간 기반 작업 스케줄러입니다. Cron을 사용하면 사용자가 반복적인 작업을 자동으로 실행할 수 있습니다. Cron은 space로 단위를 구분하며, *은 wildcard로 전체를 표현함.
  • 키워드
    • * :  모든수, ? : 조건없음, - : 범위지정
    • , : 특정 여러시간 지정, / : 시작시간과 반복간격, L : 지정할 수 있는 범위의 마지막 값 (날짜와 요일에만 사용)

예시)

0 0 * * * * : 매 시각

*/10 * * * * * : 10초마다

0 0 8-10 * * * : 매일 8시, 9시, 10시

 

 

@Scheduled의 주요 매개변수

  • fixedRate: 이전 작업의 시작 시점부터 지정된 간격으로 작업을 실행.
  • fixedDelay: 이전 작업이 끝난 후 지정된 간격 후에 작업을 실행.
  • initialDelay: 첫 작업 실행을 지정된 시간(ms)만큼 지연.
  • cron: Cron 표현식을 사용하여 복잡한 스케줄 패턴을 정의.

Spring Scheduler의 일반적인 사용 사례

  1. 알림 발송:
    • 사용자에게 정기적인 알림이나 리마인더 자동 발송.
  2. 데이터 처리:
    • 정기적으로 데이터 배치 처리(예: 통계 업데이트, 보고서 생성).
  3. 시스템 유지 관리:
    • 데이터베이스 정리나 파일 관리 같은 정기적인 유지 관리 작업 수행.
  4. API 폴링:
    • 정해진 간격으로 외부 API에서 데이터 가져오기.
  5. 보고서 생성:
    • 일별 또는 주별 보고서와 같은 정기적인 보고서 생성.

Spring Scheduler에서 스레드 처리

  • 기본적으로 모든 스케줄 작업은 단일 스레드에서 실행되며, 작업이 순차적으로 실행됩니다.
  • 동시에 여러 작업을 실행하려면 커스텀 TaskScheduler나 TaskExecutor를 구성해야 합니다.
 
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;

@Configuration
public class SchedulerConfig {

    @Bean
    public ThreadPoolTaskScheduler taskScheduler() {
        ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
        scheduler.setPoolSize(5); // 스레드 풀 크기 설정
        scheduler.setThreadNamePrefix("ScheduledTask-");
        return scheduler;
    }
}

스케줄 작업에서의 에러 처리

  • 스케줄 작업 중 예외가 발생하면 작업이 더 이상 실행되지 않을 수 있습니다. 이를 방지하려면 적절히 예외를 처리해야 합니다.
 
@Scheduled(fixedRate = 5000)
public void performTaskWithExceptionHandling() {
    try {
        // 작업 로직
    } catch (Exception e) {
        System.err.println("스케줄 작업 중 오류 발생: " + e.getMessage());
    }
}

요약

Spring Scheduler는 Spring 애플리케이션 내에서 작업을 스케줄링하기 위한 강력한 도구입니다. Fixed Delay, Fixed Rate, Cron 표현식 등을 지원하여 다양한 스케줄링 요구를 충족할 수 있습니다. 에러와 스레드 처리를 적절히 관리하여 안정적이고 신뢰할 수 있는 작업 실행을 보장하는 것이 중요합니다

 

 

 

스케쥴링

 

프로그램 내에서 특정 행위를 예약해두고 싶을때 스케쥴링 기능을 사용한다. Spring은 해당 기능을 각 메소드 별로 @Scheduled annotation으로 지원한다. @Scheduled annotation scan을 위해서 Spring Application class에 @EnableScheduling을 포함한다.

 

scheduling에는 3가지 방법이 있다.

fixedDelay - 이전에 수행이 완료된 지점으로부터 특정시간이 넘어간다면 수행을 시작

fixedRate - 이전 수행이 시작된 지점으로부터 특정시간이 넘어간다면 수행을 시작 (이전 수행이 아직 안끝났을때 충돌가능성있음)

 

 

'개발기술 > Spring' 카테고리의 다른 글

스프링 환경설정 ; 스프링 부트  (0) 2025.01.25
비동기 Web Flux  (0) 2024.11.19
MSA도입을 위한 Spring Cloud  (0) 2024.11.04
Spring 동시성이슈 해결  (0) 2024.07.30
스프링 전체구조  (0) 2024.07.24