스프링 부트 3에서 스케줄러(Scheduler)는 특정 작업을 주기적으로 실행하거나 정해진 시간에 수행하도록 설정할 수 있는 유용한 기능입니다. 이를 통해 반복 작업을 자동화하거나 백그라운드 프로세스를 효율적으로 처리할 수 있습니다. 이번 포스팅에서는 스케줄러 설정 방법과 다양한 활용 사례를 소개합니다.
1. 스케줄러 활성화
스프링 부트에서 스케줄러를 사용하려면 먼저 애플리케이션에서 스케줄링 기능을 활성화해야 합니다. 이를 위해 설정 클래스에 @EnableScheduling 애너테이션을 추가합니다.
@Configuration
@EnableScheduling
public class SchedulerConfig {
// 추가 설정이 필요하다면 여기에 작성
}
이 애너테이션은 스프링이 프로젝트 내에서 @Scheduled 애너테이션이 붙은 메서드를 탐지하고 실행할 수 있도록 만듭니다.
2. 스케줄링 작업 정의하기
스케줄링 작업은 메서드 위에 @Scheduled 애너테이션을 붙여 정의합니다. **@Scheduled**는 작업 실행 주기를 설정할 수 있는 다양한 옵션을 제공합니다.
주요 옵션
- fixedRate: 이전 작업의 시작 시간부터 지정된 시간 간격으로 작업을 실행합니다.
- fixedDelay: 이전 작업의 완료 시간부터 지정된 시간 간격으로 작업을 실행합니다.
- cron: CRON 표현식을 사용해 더욱 세부적인 주기로 작업을 설정합니다.
간단한 예제
- 10초마다 작업 실행:
@Scheduled(fixedRate = 10000)
public void executeFixedRateTask() {
System.out.println("10초마다 실행되는 작업: " + LocalDateTime.now());
}
- 1분 간격으로 실행, 이전 작업이 끝난 후 대기:
@Scheduled(fixedDelay = 60000)
public void executeFixedDelayTask() {
System.out.println("이전 작업 종료 후 1분 뒤 실행: " + LocalDateTime.now());
}
- 매일 오후 2시 정각에 작업 실행:
@Scheduled(cron = "0 0 14 * * ?")
public void executeCronTask() {
System.out.println("매일 오후 2시에 실행되는 작업: " + LocalDateTime.now());
}
3. 실전 활용 사례
3.1. 로그 파일 정리
애플리케이션 운영 중 쌓이는 로그 파일을 주기적으로 정리하여 저장 공간을 확보하고, 시스템 성능을 유지해야 합니다. 아래 코드는 매일 자정에 로그 파일을 삭제하는 작업을 실행합니다.
@Scheduled(cron = "0 0 0 * * ?")
public void cleanUpLogs() {
System.out.println("로그 파일 정리 작업 시작");
// 파일 삭제 로직 작성
System.out.println("로그 파일 정리 작업 완료");
}
3.2. 데이터 백업
중요한 데이터는 주기적으로 백업하여 데이터 손실에 대비해야 합니다. 다음 코드는 매주 월요일 새벽 3시에 데이터베이스를 백업합니다.
@Scheduled(cron = "0 0 3 ? * MON")
public void backupDatabase() {
System.out.println("데이터 백업 시작: " + LocalDateTime.now());
// 백업 로직 구현
System.out.println("데이터 백업 완료");
}
3.3. 마케팅 이메일 발송
고객에게 정기적으로 뉴스레터나 프로모션 이메일을 발송하는 작업도 스케줄러를 활용하여 자동화할 수 있습니다.
@Scheduled(cron = "0 0 9 * * ?")
public void sendMarketingEmails() {
System.out.println("마케팅 이메일 발송 시작");
// 이메일 발송 로직 작성
System.out.println("마케팅 이메일 발송 완료");
}
4. 고급 설정: 멀티스레드 스케줄링
스프링 부트 기본 스케줄러는 단일 스레드로 실행됩니다. 하지만 다수의 스케줄링 작업이 동시에 실행되거나 시간이 오래 걸리는 작업이 포함되면 스레드 풀을 사용해 병렬 처리가 필요합니다.
스레드 풀 설정 방법
- TaskScheduler 빈 생성:
@Configuration
@EnableScheduling
public class ThreadPoolSchedulerConfig {
@Bean
public TaskScheduler taskScheduler() {
ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
scheduler.setPoolSize(5); // 스레드 풀 크기
scheduler.setThreadNamePrefix("Scheduler-");
return scheduler;
}
}
- 이후 @Scheduled 작업은 자동으로 설정한 스레드 풀을 사용합니다.
5. 트러블슈팅
5.1. CRON 표현식 오류
CRON 표현식이 잘못 작성되면 애플리케이션이 실행되지 않거나 작업이 동작하지 않을 수 있습니다. 신뢰할 수 있는 CRON 생성기를 활용하여 표현식을 작성하세요.
5.2. 작업 중단 문제
스케줄링 작업 중 예외가 발생하면 해당 작업이 중단될 수 있습니다. 이를 방지하려면 예외 처리를 추가하여 오류를 로깅하거나 복구할 수 있도록 설계하세요.
@Scheduled(fixedRate = 10000)
public void safeTask() {
try {
System.out.println("안전한 작업 실행");
// 작업 로직
} catch (Exception e) {
System.err.println("작업 중 오류 발생: " + e.getMessage());
}
}
6. 결론
스프링 부트 3에서 스케줄러는 주기적인 작업이나 특정 시간에 실행해야 하는 작업을 자동화하는 데 매우 유용합니다. 위에서 다룬 로그 파일 정리, 데이터 백업, 이메일 발송과 같은 예제는 실무에서 흔히 사용되는 사례입니다.
스케줄러를 효과적으로 활용하면 애플리케이션의 운영 효율성을 높이고, 반복적인 작업을 자동화하여 개발자 생산성을 극대화할 수 있습니다. 지금 바로 프로젝트에 스케줄러를 적용하여 업무를 더 효율적으로 처리해 보세요!
'스프링 부트3' 카테고리의 다른 글
Swagger를 사용한 API 문서화 (0) | 2024.12.05 |
---|---|
스프링 부트 3의 REST API 문서화 (0) | 2024.12.05 |
비동기 프로그래밍과 스프링 부트 3 (0) | 2024.12.05 |
스프링 부트 3의 캐싱 기법 (0) | 2024.12.05 |
스프링 부트 3와 Redis 통합 (0) | 2024.12.05 |