DeveloPiano

[Spring] Spring Boot 에서 Scheduler 사용하기 본문

Develop/Spring

[Spring] Spring Boot 에서 Scheduler 사용하기

DevPi 2024. 9. 24. 10:14
반응형

Scheduler(스케줄러)는 애플리케이션에서 특정 작업을 정해진 시간, 간격, 주기로 자동 실행되도록 설정하는 기능입니다. Spring Boot에서는 스케줄러를 사용하여 배치 작업, 정기 보고서 생성, 데이터 백업 등의 반복 작업을 손쉽게 구현할 수 있습니다.

Spring Boot에서는 @Scheduled 어노테이션을 활용하여 작업을 쉽게 예약할 수 있습니다. 다양한 표현식과 옵션을 통해 복잡한 스케줄링 요구사항을 간단하게 구현할 수 있습니다.


Scheduler의 주요 특징

  • 간편한 설정 : @Scheduled 어노테이션을 사용해 간단하게 주기적인 작업을 설정할 수 있습니다.
  • 다양한 주기 표현 : 고정된 간격, 특정 시간, cron 표현식 등을 사용하여 다양한 스케줄링이 가능합니다.
  • 멀티 스레드 지원 : 멀티 스레드를 통해 여러 스케줄 작업을 동시에 처리할 수 있습니다.
  • Spring과의 완벽한 통합 : Spring Boot에서 제공하는 스케줄러는 Spring의 다른 기능과 쉽게 통합됩니다.

Spring Boot에서 Scheduler 설정하기

Spring Boot에서 스케줄링을 사용하려면 다음 단계를 따라 설정할 수 있습니다.

 

1. 스케줄링 활성화

스케줄링을 사용하려면 애플리케이션에 @EnableScheduling 어노테이션을 추가해야 합니다. 일반적으로 메인 클래스에 추가합니다.

// DemoApplication.java
package com.example.demo;

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

@SpringBootApplication
@EnableScheduling  // 스케줄링 활성화
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

 

2. 스케줄러 구현하기

스케줄링 작업을 실행할 메서드에 @Scheduled 어노테이션을 추가하여 구현할 수 있습니다.

 

기본적인 스케줄링 예제

아래는 간단한 스케줄러 예제입니다. 메서드가 특정 간격으로 실행되도록 설정할 수 있습니다.

// TaskScheduler.java
package com.example.demo.scheduler;

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

import java.time.LocalDateTime;

@Component
public class TaskScheduler {

    // 5초마다 실행
    @Scheduled(fixedRate = 5000)
    public void fixedRateTask() {
        System.out.println("Fixed Rate Task: " + LocalDateTime.now());
    }

    // 이전 작업이 끝난 후 5초 뒤에 실행
    @Scheduled(fixedDelay = 5000)
    public void fixedDelayTask() {
        System.out.println("Fixed Delay Task: " + LocalDateTime.now());
    }

    // 처음에는 2초 후에 시작하고 이후에는 5초 간격으로 실행
    @Scheduled(initialDelay = 2000, fixedRate = 5000)
    public void initialDelayTask() {
        System.out.println("Initial Delay Task: " + LocalDateTime.now());
    }

    // Cron 표현식을 사용한 스케줄링 (매 분마다 실행)
    @Scheduled(cron = "0 * * * * *")
    public void cronTask() {
        System.out.println("Cron Task: " + LocalDateTime.now());
    }
}

@Scheduled 어노테이션 속성 설명

  • fixedRate : 이전 작업이 시작된 시점부터 설정된 시간 간격으로 작업을 실행합니다. 예를 들어, @Scheduled(fixedRate = 5000)은 5초마다 작업을 실행합니다.
  • fixedDelay : 이전 작업이 종료된 후 설정된 시간 간격 후에 작업을 실행합니다. 예를 들어, @Scheduled(fixedDelay = 5000)은 이전 작업이 끝난 후 5초 뒤에 다음 작업을 실행합니다.
  • initialDelay : 스케줄링 작업이 처음 시작할 때 지연 시간을 설정합니다. 이후에는 fixedRate 또는 fixedDelay에 따라 주기적으로 실행됩니다.
  • cron : 복잡한 스케줄을 표현하기 위해 사용됩니다. Cron 표현식을 사용하여 작업이 언제 실행될지 상세히 정의할 수 있습니다. 예를 들어, @Scheduled(cron = "0 * * * * *")은 매 분의 0초에 작업을 실행합니다.

 

Cron 표현식 설명

Cron 표현식은 시간을 표현하기 위한 매우 유연한 방식으로, 6개의 필드로 구성됩니다:

  • 초 (Seconds): 0-59
  • 분 (Minutes): 0-59
  • 시간 (Hours): 0-23
  • 일 (Day of Month): 1-31
  • 월 (Month): 1-12 또는 JAN-DEC
  • 요일 (Day of Week): 0-7 (0 또는 7은 일요일) 또는 MON-SUN

예제

  • "0 0 12 * * *": 매일 12시 0분 0초에 실행
  • "0 0/5 * * * *": 매 5분마다 실행
  • "0 0 8-10 * * *": 매일 오전 8시, 9시, 10시에 실행

 

Scheduler 사용 시 주의사항

  • 작업 실행 시간 관리 : 스케줄링 작업이 너무 길어지면 다음 주기의 작업에 영향을 줄 수 있습니다. 가능한 한 비동기 처리나 별도의 작업 큐를 사용하는 것이 좋습니다.
  • 멀티 스레드 환경 설정 : 스케줄링 작업이 동시에 여러 개 실행되거나 여러 작업을 관리해야 할 때는 TaskScheduler 또는 ThreadPoolTaskScheduler를 사용하여 스레드 풀을 관리할 수 있습니다.
  • 성능 모니터링 : 스케줄링 작업이 시스템에 어떤 영향을 미치는지 모니터링하는 것이 중요합니다. 작업의 실행 시간을 측정하거나 로깅하여 문제를 사전에 파악하는 것이 좋습니다.

마무리

Spring Boot의 Scheduler는 애플리케이션에서 반복 작업을 간편하게 처리할 수 있는 강력한 도구입니다. @Scheduled 어노테이션과 함께 다양한 옵션을 활용하여 원하는 주기와 타이밍에 작업을 실행할 수 있습니다. 이를 통해 배치 작업, 알람 시스템, 데이터 동기화 등 다양한 기능을 쉽게 구현할 수 있습니다.

스케줄러를 처음 사용해 본다면 위의 간단한 예제부터 시작해 보세요. 더 복잡한 스케줄링이 필요하다면 Cron 표현식을 활용해 다양한 스케줄을 구현할 수 있습니다. 이 포스팅이 Spring Boot 스케줄러를 사용하는 데 도움이 되길 바랍니다.

반응형