개발/Spring Boot
Spring Boot 시리즈 13편 – 스케줄러와 배치 처리 전략: Spring Task와 Quartz 실전 가이드
B컷개발자
2025. 4. 26. 00:07
728x90
SMALL
Spring Boot에서 스케줄러와 배치 작업을 처리하는 전략을 소개합니다. @Scheduled, Spring Task, Quartz를 활용한 실무 배치 구현 구조를 단계별로 설명합니다.
Spring Boot 시리즈 13편 – 스케줄러와 배치 처리 전략: Spring Task와 Quartz 실전 가이드
실시간으로 처리할 필요는 없지만, 반드시 처리해야 하는 작업들이 있습니다.
예를 들어 매일 자정에 통계 집계, 3시간마다 이메일 전송, 주간 리포트 생성 등.
이런 작업은 스케줄링 시스템과 배치 처리 시스템으로 관리해야 유지보수성과 안정성이 높아집니다.
이번 글에서는 Spring Boot에서 간단한 배치 처리부터 고정밀 예약 작업까지 실무적으로 설계하고 구현하는 전략을 소개합니다.
📌 1. 어떤 작업이 배치로 적합할까?
작업 유형예시
주기적 실행 | 통계 집계, 인기글 랭킹 업데이트, 포인트 지급 |
대량 처리 | 오래된 로그 삭제, 데이터 백업 |
예약 실행 | 특정 시간 마다 리포트 전송, 알림 푸시 |
비동기 분산 | 병렬 처리 가능한 대규모 연산 |
✅ 2. 기본 스케줄링 –
@Scheduled
사용하기
1️⃣ 설정 활성화
@SpringBootApplication
@EnableScheduling
public class MyApp {}
2️⃣ 스케줄러 메서드 작성
@Component
public class StatisticsScheduler {
@Scheduled(cron = "0 0 0 * * *") // 매일 0시
public void generateDailyStats() {
log.info("일간 통계 생성 시작...");
// 통계 로직
}
}
기본 스케줄은 cron, fixedRate, fixedDelay 모두 지원합니다.
3️⃣ 다른 주기 표현 예시
표현 방식설명
@Scheduled(fixedRate = 60000) | 이전 실행 시작 60초 후 재실행 |
@Scheduled(fixedDelay = 60000) | 이전 실행 종료 후 60초 대기 |
@Scheduled(cron = "0 0/10 * * * ?") | 매 10분마다 실행 (Quartz cron 표현식) |
🛠️ 3. 실행 환경 분리 및 병렬 제한
1️⃣ 멀티 스레드 허용
@Configuration
public class TaskConfig {
@Bean
public TaskScheduler taskScheduler() {
ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
scheduler.setPoolSize(4);
scheduler.setThreadNamePrefix("Scheduled-");
return scheduler;
}
}
- 여러 작업을 동시에 실행하고 싶을 때 유용
- 기본은 단일 스레드 → 병렬 작업 필요 시 풀 구성 필수
⚙️ 4. Quartz를 활용한 고정밀 스케줄링
Quartz란?
- 정밀한 스케줄 제어가 가능한 오픈소스 Job Scheduler
- DB 기반 Job 관리 가능 (persisted job)
- 분산 환경, 지연 실행, 트리거 관리에 적합
1️⃣ 의존성 추가
implementation 'org.springframework.boot:spring-boot-starter-quartz'
2️⃣ Quartz Job 정의
@Component
public class ReportJob implements Job {
@Override
public void execute(JobExecutionContext context) {
log.info("주간 리포트 생성 작업 실행");
// 비즈니스 로직 실행
}
}
3️⃣ Job 등록 및 스케줄링
@Configuration
public class QuartzJobConfig {
@Bean
public JobDetail reportJobDetail() {
return JobBuilder.newJob(ReportJob.class)
.withIdentity("weeklyReportJob")
.storeDurably()
.build();
}
@Bean
public Trigger reportJobTrigger() {
return TriggerBuilder.newTrigger()
.forJob(reportJobDetail())
.withIdentity("weeklyReportTrigger")
.withSchedule(CronScheduleBuilder.cronSchedule("0 0 8 ? * MON")) // 매주 월요일 8시
.build();
}
}
🧠 실무 설계 팁
항목전략
단순 주기 작업 | @Scheduled + @EnableScheduling |
병렬/스레드 조절 | ThreadPoolTaskScheduler로 구성 |
Job 관리 필요 | Quartz + DB 연동으로 영속성 확보 |
작업 실패 추적 | 로그 + Job 상태 테이블 활용 |
보안 고려 | 민감한 배치 작업은 인증된 관리자만 접근 허용 |
🧪 테스트 전략
테스트 대상방법
단순 스케줄러 | 로그 출력, mock 서비스 호출 여부 확인 |
Quartz Job | JobLauncherTestUtils 또는 직접 JobContext 주입 |
시간 기반 로직 | @TestClock 또는 시간 주입 구조 설계로 단위 테스트 가능 |
✅ 마무리 요약
항목정리
간단 스케줄 | @Scheduled로 즉시 구현 가능 |
고급 스케줄 | Quartz 활용으로 트리거 제어 및 DB 연동 가능 |
병렬 실행 | TaskScheduler로 스레드 풀 구성 |
운영 고려 | 실패 로그, 관리자 대시보드, Job 관리 API 필요 |
확장 방향 | Kafka 등 메시지 기반 배치 연동도 가능 |
📌 다음 편 예고
Spring Boot 시리즈 14편: API 테스트 자동화 전략 – RestAssured, MockMvc, TestContainers를 활용한 안정적 품질 보장
728x90
LIST