본문 바로가기

Study Information Technology

Spring Boot에서 스케줄링 기능 활용하기

728x90
반응형

Spring Boot에서 스케줄링 기능 활용하기

Overview

Spring Boot에서 스케줄링은 주기적으로 특정 작업을 수행해야 할 때 유용하게 사용할 수 있는 기능입니다. Spring Boot의 스케줄링 기능을 활용하면 복잡한 작업을 단순하게 설정하고 관리할 수 있습니다. 이 글에서는 Spring Boot에서 스케줄링을 설정하는 방법, 주요 개념, 그리고 자주 발생할 수 있는 에러와 그 해결 방법에 대해 자세히 설명하겠습니다.

Spring Boot 스케줄링 설정하기

1. 의존성 추가

Spring Boot에서 스케줄링 기능을 사용하려면, 먼저 spring-boot-starterspring-boot-starter-scheduling 의존성을 pom.xml 파일에 추가해야 합니다. Maven을 사용하는 경우, 다음과 같이 설정합니다:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-scheduling</artifactId>
</dependency>

Gradle을 사용하는 경우 build.gradle 파일에 다음과 같이 추가합니다:

implementation 'org.springframework.boot:spring-boot-starter'
implementation 'org.springframework.boot:spring-boot-starter-scheduling'

2. 스케줄링 활성화

Spring Boot 애플리케이션에서 스케줄링을 활성화하려면, @EnableScheduling 애너테이션을 메인 애플리케이션 클래스에 추가해야 합니다. @SpringBootApplication 애너테이션이 붙은 클래스에 다음과 같이 추가합니다:

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);
}
}

3. 스케줄러 설정

이제 스케줄링을 설정할 수 있습니다. 스케줄링 작업은 @Scheduled 애너테이션을 사용하여 정의합니다. 다음은 @Scheduled 애너테이션을 사용하여 특정 시간 간격으로 메서드를 실행하는 예제입니다:

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

@Component
public class ScheduledTasks {

@Scheduled(fixedRate = 5000)
public void reportCurrentTime() {
System.out.println("현재 시간: " + System.currentTimeMillis());
}
}

위 예제에서 @Scheduled(fixedRate = 5000)은 메서드가 5초 간격으로 실행되도록 설정합니다. fixedRate는 이전 작업이 완료된 후 다음 작업이 시작되는 주기를 정의합니다.

4. 다양한 스케줄링 옵션

Spring의 @Scheduled 애너테이션은 여러 가지 옵션을 제공합니다:

  • fixedRate: 일정 시간 간격으로 작업을 실행합니다. (위 예제 사용)
  • fixedDelay: 이전 작업이 완료된 후 지연 시간을 두고 작업을 실행합니다.
  • cron: CRON 표현식을 사용하여 작업을 실행합니다.

다음은 fixedDelaycron을 사용하는 예제입니다:

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

@Component
public class ScheduledTasks {

@Scheduled(fixedDelay = 10000)
public void taskWithFixedDelay() {
System.out.println("이전 작업 완료 후 10초 후 실행");
}

@Scheduled(cron = "0 0 * * * *")
public void taskWithCron() {
System.out.println("매 정각에 실행");
}
}
  • fixedDelay = 10000은 이전 작업이 완료된 후 10초 지연 후 실행합니다.
  • cron = "0 0 * * * *"은 매 정각에 실행되도록 설정합니다.

5. 스케줄링 설정 조정

스케줄링 주기를 외부에서 설정할 수 있습니다. 예를 들어, application.properties 파일에 설정을 추가하여 스케줄링 간격을 조정할 수 있습니다:

scheduler.fixedRate=5000
scheduler.fixedDelay=10000
scheduler.cron=0 0 * * * *

이러한 설정을 코드에서 참조하여 사용할 수 있습니다. 예를 들어, @Scheduled 애너테이션을 사용하는 대신 프로그래밍적으로 설정을 적용할 수 있습니다:

import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
public class ConfigurableScheduledTasks {

@Value("${scheduler.fixedRate}")
private long fixedRate;

@Scheduled(fixedRateString = "${scheduler.fixedRate}")
public void taskWithConfigurableRate() {
System.out.println("설정된 fixedRate로 실행: " + fixedRate);
}
}

자주 발생하는 에러 및 해결 방법

에러 1: IllegalArgumentException (CRON 표현식 오류)

CRON 표현식의 문법 오류로 인해 IllegalArgumentException이 발생할 수 있습니다. 예를 들어, @Scheduled(cron = "0 0 25 * * ?")는 유효하지 않은 CRON 표현식입니다.

해결 방법:

CRON 표현식의 문법을 확인하고 올바른 표현식을 사용합니다. Spring의 CRON 표현식 문법은 Spring 공식 문서에서 확인할 수 있습니다.

에러 2: ScheduledTaskRegistrar 관련 오류

스케줄링 설정 중 ScheduledTaskRegistrar 관련 오류가 발생할 수 있습니다. 이는 설정이 잘못되었거나 빈 등록에 문제가 있을 때 발생합니다.

해결 방법:

  • @EnableScheduling 애너테이션이 애플리케이션의 메인 클래스에 추가되었는지 확인합니다.
  • @Scheduled 애너테이션이 붙은 메서드가 public이어야 합니다.
  • 메서드가 void를 반환해야 합니다.

에러 3: TaskScheduler 빈 등록 문제

TaskScheduler 빈이 등록되지 않아 스케줄링이 작동하지 않는 경우가 있습니다. 이 경우, @EnableScheduling 애너테이션이 누락된 경우가 많습니다.

해결 방법:

@EnableScheduling 애너테이션이 메인 애플리케이션 클래스에 추가되어 있는지 확인합니다. 또한, 애플리케이션 컨텍스트에 TaskScheduler가 제대로 등록되어 있는지 확인합니다.

참고문서

728x90
반응형