-
Spring Boot 시리즈 13편 – 스케줄러와 배치 처리 전략: Spring Task와 Quartz 실전 가이드개발/Spring Boot 2025. 4. 26. 00:07
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를 활용한 안정적 품질 보장
LIST'개발 > Spring Boot' 카테고리의 다른 글