Spring 스케줄링 기능과 @Scheduled 어노테이션 사용법

스프링 프레임워크의 @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'는 가까운 업무일을 나타냅니다.

태그: spring-scheduling cron-expression background-task task-scheduler

7월 29일 23:02에 게시됨