Develop/JAVA

Spring Framework의 @Scheduled 어노테이션 완벽 가이드

issuemaker99 2025. 2. 14. 15:52
728x90

Spring Framework는 애플리케이션에서 일정한 주기로 작업을 실행할 수 있도록 @Scheduled 어노테이션을 제공합니다. 이를 활용하면 크론(Cron) 작업이나 일정 시간 간격으로 실행되는 백그라운드 작업을 손쉽게 구현할 수 있습니다.
이 글에서는 @Scheduled의 개념, 설정 방법, 다양한 사용법과 실용적인 예제를 소개합니다.


1. @Scheduled란?

@Scheduled 어노테이션은 특정 시간 간격이나 정해진 일정에 따라 메서드를 실행하도록 설정하는 Spring의 기능입니다.
이를 활용하면 일정한 간격으로 데이터베이스를 정리하거나, 정기적인 알림을 전송하는 등의 기능을 쉽게 구현할 수 있습니다.


2. @Scheduled 사용을 위한 설정

@Scheduled 어노테이션을 사용하려면 Spring의 스케줄링 기능을 활성화해야 합니다.
이를 위해 @EnableScheduling 어노테이션을 설정 클래스에 추가해야 합니다.

(1) 기본 설정

import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;

@Configuration
@EnableScheduling
public class SchedulerConfig {
}

위와 같이 @EnableScheduling을 추가하면, @Scheduled이 적용된 메서드가 실행될 수 있도록 Spring이 관리합니다.


3. @Scheduled 사용 방법

@Scheduled 어노테이션을 사용하면 여러 방식으로 작업을 스케줄링할 수 있습니다.

(1) fixedRate: 일정 간격으로 실행 (이전 실행 완료 여부 무관)

fixedRate는 이전 실행 완료 여부와 상관없이 설정된 간격마다 실행됩니다.

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
public class FixedRateScheduler {

    @Scheduled(fixedRate = 5000) // 5초마다 실행
    public void runTask() {
        System.out.println("fixedRate 실행: " + System.currentTimeMillis());
    }
}

설명: 5초마다 메서드가 실행됩니다. (이전 작업이 끝나지 않았어도 실행됨)


(2) fixedDelay: 이전 실행이 끝난 후 일정 시간 후 실행

fixedDelay는 이전 실행이 끝난 후 설정된 시간이 지난 후 실행됩니다.

@Component
public class FixedDelayScheduler {

    @Scheduled(fixedDelay = 5000) // 이전 실행 완료 후 5초 뒤 실행
    public void runTask() {
        System.out.println("fixedDelay 실행: " + System.currentTimeMillis());
    }
}

설명: 이전 실행이 끝난 후 5초 후에 다시 실행됩니다.


(3) initialDelay: 애플리케이션 시작 후 일정 시간 후에 실행

initialDelay는 애플리케이션 시작 후 일정 시간이 지나고 처음 실행됩니다.

@Component
public class InitialDelayScheduler {

    @Scheduled(initialDelay = 10000, fixedRate = 5000) 
    public void runTask() {
        System.out.println("initialDelay 실행: " + System.currentTimeMillis());
    }
}

설명: 애플리케이션이 시작되고 10초 후에 처음 실행되고 이후 5초마다 실행됩니다.


(4) cron: 정해진 일정에 실행

cron 속성을 사용하면 리눅스의 크론 표현식을 사용해 정교한 스케줄링이 가능합니다.

@Component
public class CronScheduler {

    @Scheduled(cron = "0 0 12 * * ?") // 매일 12시 정각 실행
    public void runTask() {
        System.out.println("cron 실행: " + System.currentTimeMillis());
    }
}

설명: 매일 정오(12:00:00) 에 실행됩니다.

크론 표현식 설명

표현식 의미
* * * * * * 초, 분, 시, 일, 월, 요일
0 0 12 * * ? 매일 12시(정오)에 실행
0 0/5 * * * ? 매 5분마다 실행
0 0 9-18 * * ? 매일 오전 9시~오후 6시 사이 매 정각 실행

 


4. 멀티 스케줄러 실행 시 주의사항

(1) 스레드 풀을 사용하여 동시 실행 제어

Spring의 기본 @Scheduled은 싱글 스레드에서 실행됩니다.
즉, 하나의 작업이 끝날 때까지 다른 @Scheduled 작업이 대기해야 합니다.

멀티 스레드 환경에서 여러 작업을 동시에 실행하려면 TaskScheduler를 사용한 풀 설정이 필요합니다.

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;

@Configuration
public class SchedulerConfig {

    @Bean
    public ThreadPoolTaskScheduler taskScheduler() {
        ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
        scheduler.setPoolSize(5); // 5개의 스레드 사용
        scheduler.setThreadNamePrefix("Scheduler-Thread-");
        scheduler.initialize();
        return scheduler;
    }
}

설명: 스레드 풀을 활용하여 동시에 여러 스케줄링 작업을 실행할 수 있도록 설정합니다.


5. @Scheduled 활용 예제

(1) 매일 특정 시간에 이메일 발송

@Component
public class EmailScheduler {

    @Scheduled(cron = "0 0 9 * * ?") // 매일 오전 9시 실행
    public void sendDailyEmail() {
        System.out.println("이메일 발송: " + System.currentTimeMillis());
    }
}

설명: 매일 오전 9시에 이메일을 발송하는 작업을 수행합니다.

(2) 일정 간격으로 DB 백업 실행

@Component
public class DatabaseBackupScheduler {

    @Scheduled(fixedRate = 3600000) // 1시간마다 실행
    public void backupDatabase() {
        System.out.println("DB 백업 실행: " + System.currentTimeMillis());
    }
}

설명: 1시간마다 데이터베이스 백업 작업을 실행합니다.


Spring의 @Scheduled 어노테이션을 사용하면 간단한 설정만으로 강력한 스케줄링 기능을 구현할 수 있습니다.

  • fixedRate와 fixedDelay를 사용하면 일정 간격으로 실행 가능
  • cron을 활용하면 정교한 스케줄링 설정 가능
  • ThreadPoolTaskScheduler을 설정하면 멀티 스레드에서 동시에 실행 가능
LIST