Spring Scheduler
Spring Scheduler는 Spring Framework의 구성 요소로, 개발자가 특정 간격이나 시간에 작업을 수행할 수 있도록 도와줍니다. Spring Task API의 일부로, 외부 라이브러리에 의존하지 않고도 작업을 스케줄링할 수 있습니다. 백그라운드 작업 실행, 주기적인 데이터 처리, 작업 자동화, 정기적인 유지 보수 작업에 유용하게 사용할 수 있습니다.
Spring Scheduler의 주요 기능
- 간단한 설정:
- 주석(annotation) 또는 XML 설정을 통해 스케줄 작업을 구성할 수 있어 간단하게 설정하고 관리할 수 있습니다.
- Spring Boot와의 통합:
- Spring Boot에서는 최소한의 설정으로도 사용 가능하며, 많은 설정이 자동으로 구성됩니다.
- Fixed Delay와 Fixed Rate:
- 지정된 간격으로 작업을 실행하거나, 이전 작업 완료 후 일정 시간 대기 후 실행할 수 있습니다.
- 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의 일반적인 사용 사례
- 알림 발송:
- 사용자에게 정기적인 알림이나 리마인더 자동 발송.
- 데이터 처리:
- 정기적으로 데이터 배치 처리(예: 통계 업데이트, 보고서 생성).
- 시스템 유지 관리:
- 데이터베이스 정리나 파일 관리 같은 정기적인 유지 관리 작업 수행.
- API 폴링:
- 정해진 간격으로 외부 API에서 데이터 가져오기.
- 보고서 생성:
- 일별 또는 주별 보고서와 같은 정기적인 보고서 생성.
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 |