반응형
Quartz란?
- 언어: Java 기반으로 작성된 오픈소스 스케줄러 라이브러리
- 용도: 특정 시간이나 주기에 맞춰 작업(Job)을 실행할 수 있게 해줌
- 활용 범위: 단순 반복 작업(cron)부터, 여러 Job을 조합한 복잡한 워크플로우까지 지원
Quartz Job이란?
- Quartz에서 실행할 “작업 단위”
- org.quartz.Job 인터페이스를 구현해야 하며, execute(JobExecutionContext context) 메소드 안에 실행할 로직을 정의
- 스케줄러는 Job과 Trigger를 매핑해서, 특정 시점에 Job이 실행되도록 함
예시
public class CompleteReservationJob implements Job {
@Autowired
private SqlSession sqlSession;
@Override
public void execute(JobExecutionContext context) {
Map<String, Object> param =
(Map<String, Object>) context.getJobDetail().getJobDataMap().get("param");
sqlSession.update("scheduleMapper.updateStsToComplete", param);
}
}
장점
- 강력한 스케줄링 기능
- 단순 cron 표현식부터, 캘린더 기반 스케줄링까지 지원
- 특정 요일 제외, 공휴일 제외 등 유연한 조건 처리 가능
- 클러스터링 지원
- 여러 서버에서 같은 스케줄러를 공유해서 실행 가능
- 대규모 서비스에서도 안정적으로 동작
- Job 데이터 관리
- JobDataMap을 통해 실행 시점마다 데이터 전달 가능
- 상태 기반 Job도 구현할 수 있음
- 스프링과 통합 용이
- SchedulerFactoryBean을 통해 Spring 환경에서 바로 사용 가능
- Spring Boot Starter도 제공됨
단점
- 무겁다
- 단순히 “매일 자정에 실행” 같은 간단한 작업에는 오버킬일 수 있음
- 라이브러리 크기가 크고 설정이 복잡해짐
- 학습 난이도
- Job, Trigger, Scheduler, JobFactory 등 개념이 많아서 처음에는 진입 장벽이 있음
- 대체제 존재
- 단순 스케줄링이라면 Spring의 @Scheduled가 더 간단하고 코드량도 적음
Quartz가 필요한 상황
- 단순 반복이 아니라, 정교한 스케줄링이 필요한 경우
- 예: 특정 요일 제외, 동적으로 Job 등록/해제, 클러스터 환경에서 스케줄 관리
- Job 실행이 DB 기반으로 관리되어야 할 때 (Quartz는 Job/Trigger 정보를 DB에 저장 가능)
- 하나의 서비스에서 수백 개 이상의 스케줄을 동시에 안정적으로 관리해야 할 때
요약
- Quartz는 Java 기반 스케줄러 라이브러리
- Quartz Job은 실제로 실행할 작업 단위
- 장점은 강력한 스케줄링/클러스터링/데이터 관리, 단점은 무겁고 복잡하다는 점
- 단순 반복은 @Scheduled, 복잡한 스케줄 관리가 필요하면 Quartz
Spring @Scheduled vs Quartz 비교
구분 Spring @Scheduled Quartz
| 언어/환경 | Spring 전용 (Java, Spring Boot에서 기본 제공) | Java 오픈소스 라이브러리 (Spring 외에도 단독 사용 가능) |
| 사용 방법 | 메서드 위에 @Scheduled(cron = "...") 어노테이션만 붙이면 됨 | Job 클래스 구현 + Trigger/Scheduler 설정 필요 |
| 설정 난이도 | 매우 단순 (코드 몇 줄) | 상대적으로 복잡 (Job, Trigger, Scheduler, JobFactory 등 개념 많음) |
| 기능 범위 | cron 기반 반복 실행, fixedDelay, fixedRate 정도 | cron + 캘린더 기반 스케줄링, Job 데이터 관리, Job 상태 저장, 여러 Trigger 조합 등 훨씬 강력 |
| 클러스터링 | 기본 지원 안 함 (단일 인스턴스에서만 실행) | 클러스터 모드 지원 (여러 서버에서 같은 스케줄 공유 가능) |
| 상태 관리 | Job 상태/이력 저장 불가 | DB에 Job/Trigger 상태 저장 가능 |
| 확장성 | 간단한 주기적 작업에 적합 | 대규모/복잡한 스케줄 관리에 적합 |
| 학습 곡선 | 낮음 | 높음 |
요약
- 단순히 “매일 0시에 실행” 같은 간단한 반복 작업 → @Scheduled
- Job 상태를 DB에 저장하거나, 클러스터 환경에서 정교한 스케줄 관리가 필요 → Quartz
다음글
2025.08.27 - [기술 공부/Spring] - [spring boot] Spring @Scheduled vs Quartz _ 사용법
반응형
'기술 공부 > Spring' 카테고리의 다른 글
| [spring boot] Spring @Scheduled vs Quartz _ 사용법 (1) | 2025.08.27 |
|---|---|
| spring boot & next http 통신 커넥트 (0) | 2025.08.27 |
| [Java + Spring Boot] Transactional Outbox Pattern 으로 mileage 적립 로직 설계에 대한 고찰 (3) | 2025.07.31 |
| [Spring Boot] 전역 예외 처리, 에러코드 설계 전략 (1) | 2025.05.30 |
| [Spring Boot] 트러블 슈팅 _ Swagger와 @RestControllerAdvice 충돌 문제 해결 (0) | 2025.05.30 |