스프링 프레임워크의 @Scheduled 어노테이션을 활용한 주기적 작업 수행 방법을 설명합니다.
@Scheduled(cron = "0 0 * * * ?")
public void executeDailyDataBackup() {
try {
logger.info("데이터 백업 시작: " + LocalDateTime.now());
backupDatabase(System.currentTimeMillis(), null);
logger.info("데이터 백업 완료: " + LocalDateTime.now());
} catch (Exception e) {
logger.error("백업 오류 발생", e.getMessage());
}
}
/**
* 2시간 간격 작업 처리
*/
@Scheduled(cron = "0 0 0/2 * * ?")
public void checkSystemStatus() {
try {
log.info("시스템 점검 시작: " + ZonedDateTime.now());
analyzeServerHealth();
log.info("시스템 점검 종료: " + ZonedDateTime.now());
} catch (Exception e) {
log.error("점검 중 예외 발생", e.toString());
}
}
스프링 설정 구성
XML 설정 파일에 다음 네임스페이스를 추가해야 합니다:
<beans xmlns:task="http://www.springframework.org/schema/task"
xsi:schemaLocation="http://www.springframework.org/schema/task
http://www.springframework.org/schema/task/spring-task-4.0.xsd">
성능 최적화를 위한 실행자 설정:
<task:executor id="taskExecutor" pool-size="5-10" />
<task:scheduler id="taskScheduler" pool-size="15" />
<task:annotation-driven executor="taskExecutor" scheduler="taskScheduler" />
작업 실행 방식 비교
- fixedDelay: 이전 작업 완료 후 5초 대기 후 재실행
- fixedRate: 작업 시작 시점 기준 5초 간격 실행
@Scheduled(fixedDelay = 5000)
public void processQueueItems() {
// 대기열 처리 로직
}
@Scheduled(fixedRate = 5000)
public void monitorResourceUsage() {
// 리소스 모니터링
}
cron 표현식 구조
| 요소 | 허용 범위 | 특수 문자 |
|---|---|---|
| 초 | 0-59 | *, -, /, ? |
| 분 | 0-59 | *, -, /, ? |
| 시 | 0-23 | *, -, /, ? |
| 일 | 1-31 | ?, L, W, # |
| 월 | 1-12 | *, -, / |
| 요일 | 1-7 | ?, L, # |
| 년 | 1970-2099 | *, -, / |
표현식 예시
- "0 0 10,14,18 * * ?" → 매일 10, 14, 18시 실행
- "0 0/30 9-17 * * ?" → 9~17시 사이 30분 간격 실행
- "0 0 12 ? * MON-FRI" → 평일 정오 실행
- "0 0 0 L * ?" → 매월 마지막 날 자정 실행
- "0 0 12 ? * 6L" → 매월 마지막 금요일 정오 실행
주의사항: '일'과 '요일' 필드는 반드시 하나만 지정해야 하며, '?'를 사용해 다른 필드를 비워두어야 합니다. 'L'은 해당 달의 마지막 날을 의미하며, 'W'는 가까운 업무일을 나타냅니다.