Backend/Spring

[Spring] @Scheduled 주기적인 작업 처리하기

누구세연 2024. 7. 27. 18:50

Spring Framework는 다양한 기능을 제공하지만, 그중에서도 주기적인 작업을 관리하는 기능인 @Scheduled 어노테이션에 대해 알아보겠습니다. 🤓

이 어노테이션을 사용하면 정해진 주기마다 특정 작업을 자동으로 실행할 수 있습니다.

 

@Scheduled 란?

@Scheduled를 Spring 스케줄링 기능을 제공하는 어노테이션입니다.

메서드에 붙여서 주기적으로 실행될 작업을 정의할 수 있게 해 줍니다.

예를 들어, 매일 자정에 특정 작업을 실행하거나 매주 월요일에 백업을 자동으로 수행할 수 있습니다.

 

@Scheduled 어노테이션 기본 사용법

@Sheduled를 사용하려면 Spring의 스케줄링 기능을 활성화해야 합니다.

이를 위해 @EnableScheduling 어노테이션을 사용하여 스케줄링 기능을 활성화할 수 있습니다.

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;

@SpringBootApplication
@EnableScheduling
public class MyApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }
}

 

이제 @Scheduled를 사용하여 주기적인 작업을 정의할 수 있습니다.

@Scheduled를 사용할 때 @Component, @Service 같은 어노테이션과 함께 사용해야 합니다.

스프링의 빈 관리 시스템과 통합되어 스케줄링 메서드를 주기적으로 호출할 수 있도록 하기 위해서입니다.

(이 조합을 통해 스프링의 강력한 관리 기능과 자동화된 작업 실행 기능을 함께 활용할 수 있습니다.🤗)

 

그리고 @Scheduled에는 다양한 옵션을 설정할 수 있습니다.

1. fixedRate

주어진 밀리초(ms) 간격으로 메서드를 호출합니다.

이 속성은 마지막 호출이 완료된 후에 주기적으로 호출됩니다.

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

@Component
public class ScheduledTasks {

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

 

2. fixedDelay

이전 작업이 완료된 후 주어진 밀리초(ms) 간격으로 메서드를 호출합니다.

즉, 메서드 실행이 완료된 후 주기적으로 호출됩니다.

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

@Component
public class ScheduledTasks {

    @Scheduled(fixedDelay = 5000) // 이전 작업이 완료된 후 5초 대기 후 실행
    public void performTask() {
        System.out.println("작업 실행 시간: " + System.currentTimeMillis());
    }
}

 

3. initalDelay

애플리케이션 시작 후 첫 번째 작업 실행 전에 대기할 밀리초(ms)의 시간입니다.

fixedRate나 fixedDelay와 함께 사용됩니다.

@Scheduled(fixedRate = 5000, initialDelay = 10000) // 애플리케이션 시작 후 10초 대기 후 5초마다 실행
public void performTask() {
    // 작업 내용
}

 

 

4. cron 표현식

크론 표현식을 사용하여 작업을 예약합니다. 크론 표현식은 매우 세밀한 제어가 가능하여, 분 단위, 시간 단위, 월 단위 등으로 작업 예약이 가능합니다.

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

@Component
public class ScheduledTasks {

    @Scheduled(cron = "0 0 0 * * *") // 매일 자정에 실행
    public void performTask() {
        System.out.println("매일 자정 작업 실행");
    }
}

 

크론 표현식은 다음과 같은 구조를 가집니다.

┌───────────── second (0-59)
│ ┌───────────── minute (0-59)
│ │ ┌───────────── hour (0-23)
│ │ │ ┌───────────── day of month (1-31)
│ │ │ │ ┌───────────── month (1-12 or JAN-DEC)
│ │ │ │ │ ┌───────────── day(s) of week (0-6 or SUN-SAT)
│ │ │ │ │ │
│ │ │ │ │ │
* * * * * *

 

 

주의 사항

  • 스레드 안전성
    @Scheduled 메서드는 기본적으로 스프링의 스케줄링 스레드에서 실행됩니다.
    따라서 스레드 안전성을 고려해야 합니다.
  • 오류 처리
    스케줄링 작업에서 예외가 발생하면 스케줄러가 다음 작업을 계속 수행할 수 있도록 적절한 오류 처리가 필요합니다.

 

💡 @Scheduled 어노테이션은 주기적인 작업을 자동으로 예약하여 실행할 수 있게 해주는 강력한 도구입니다.
다양한 속성과 크론 표현식을 통해 작업을 세밀하게 제어할 수 있으며, 스프링 빈 관리 시스템과 통합되어 효율적인 스케줄링을 지원합니다. 이를 통해 정기적인 데이터 처리, 유지 관리 작업 등을 자동화하여 효율적인 시스템 운영이 가능합니다.