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 어노테이션은 주기적인 작업을 자동으로 예약하여 실행할 수 있게 해주는 강력한 도구입니다.
다양한 속성과 크론 표현식을 통해 작업을 세밀하게 제어할 수 있으며, 스프링 빈 관리 시스템과 통합되어 효율적인 스케줄링을 지원합니다. 이를 통해 정기적인 데이터 처리, 유지 관리 작업 등을 자동화하여 효율적인 시스템 운영이 가능합니다.
'Backend > Spring' 카테고리의 다른 글
| Spring Boot에서 WireMock을 사용해서 테스트하기 (0) | 2024.08.30 |
|---|---|
| Failed to validate connection 해결하기 (0) | 2024.08.17 |
| [Spring] ArgumentResolver 사용하기 (0) | 2024.07.20 |
| [Spring] Path Variable과 Query Parameter (2) | 2024.07.18 |
| [Spring] JPA에서 쿼리 사용하는 방법 (0) | 2024.07.11 |