본문 바로가기

Study Information Technology

Spring Boot와 Scheduled Tasks 자동화된 작업 처리

728x90
반응형

Spring Boot와 Scheduled Tasks: 자동화된 작업 처리

Overview

Spring Boot를 사용한 스케줄링은 자동화된 작업을 구현할 때 매우 유용합니다. 예를 들어, 주기적으로 데이터베이스를 백업하거나 매일 이메일 보고서를 발송하는 등의 작업을 자동으로 처리할 수 있습니다. 이 과정에서 Spring Boot의 @Scheduled 애너테이션을 활용하여 손쉽게 주기적인 작업을 설정할 수 있습니다. 이번에는 Spring Boot에서 스케줄링 작업을 어떻게 설정하고, 어떻게 오류를 처리할 수 있는지 자세히 설명해 보겠습니다.

Spring Boot의 스케줄링 설정

1. 기본 설정

Spring Boot에서 스케줄링을 사용하기 위해서는 @EnableScheduling 애너테이션을 사용하여 스케줄링 기능을 활성화해야 합니다. 이 애너테이션은 주로 애플리케이션의 메인 클래스에 추가됩니다.

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

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

위 코드에서 @EnableScheduling 애너테이션은 스케줄링 기능을 활성화시킵니다. 이 설정을 통해 Spring Boot는 애플리케이션이 시작될 때 스케줄링된 작업을 관리하고 실행합니다.

2. 주기적인 작업 구현

주기적인 작업을 구현하기 위해서는 @Scheduled 애너테이션을 사용합니다. 이 애너테이션을 메서드에 추가하면, 해당 메서드는 특정 주기로 호출됩니다. 주기는 fixedRate, fixedDelay, cron 등을 사용하여 설정할 수 있습니다.

2.1. fixedRate 사용하기

fixedRate는 이전 작업이 시작된 시점으로부터 일정 시간이 지나면 다음 작업이 시작되는 방식입니다.

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

@Component
public class ScheduledTasks {

@Scheduled(fixedRate = 60000) // 60초마다 실행
public void reportCurrentTime() {
System.out.println("현재 시간: " + System.currentTimeMillis());
}
}

위 예제에서는 reportCurrentTime 메서드가 60초마다 호출됩니다. 이 방식은 작업의 실행 간격을 일정하게 유지하고 싶을 때 유용합니다.

2.2. fixedDelay 사용하기

fixedDelay는 이전 작업이 완료된 시점으로부터 일정 시간이 지나면 다음 작업이 시작됩니다.

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

이 방식은 작업이 완료된 후의 대기 시간을 설정하므로, 작업이 실행되는 시간이 불규칙할 수 있습니다.

2.3. cron 표현식 사용하기

cron 표현식은 더 복잡한 스케줄을 설정할 수 있게 해줍니다. 예를 들어 매일 오전 1시에 실행되는 작업을 설정할 수 있습니다.

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

@Component
public class ScheduledTasks {

@Scheduled(cron = "0 0 1 * * *") // 매일 오전 1시
public void performTask() {
System.out.println("매일 오전 1시에 수행되는 작업");
}
}

cron 표현식은 6개의 필드를 사용하여 상세한 스케줄을 정의할 수 있습니다.

3. 오류 처리

스케줄링 작업 중에 오류가 발생할 수 있으며, 이 경우 적절한 오류 처리가 필요합니다. 오류를 처리하는 방법은 주로 예외를 잡아서 로그를 남기고, 필요시 재시도 로직을 구현하는 것입니다.

3.1. 예외 처리 예제

스케줄링 메서드에서 예외가 발생할 경우, 예외를 로그로 기록할 수 있습니다.

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
public class ScheduledTasks {

private static final Logger logger = LoggerFactory.getLogger(ScheduledTasks.class);

@Scheduled(fixedRate = 10000)
public void performTask() {
try {
// 예제 작업
throw new RuntimeException("테스트 예외");
} catch (Exception e) {
logger.error("작업 실행 중 오류 발생: ", e);
}
}
}

이렇게 하면 작업이 실패하더라도 애플리케이션이 중단되지 않고, 오류 메시지가 로그에 기록됩니다.

3.2. 재시도 로직

작업 실패 시 재시도할 필요가 있는 경우, Spring Retry 라이브러리를 사용할 수 있습니다. 이 라이브러리를 사용하면 자동으로 재시도 로직을 설정할 수 있습니다.

<dependency>
  <groupId>org.springframework.retry</groupId>
  <artifactId>spring-retry</artifactId>
</dependency>
import org.springframework.retry.annotation.Backoff;
import org.springframework.retry.annotation.Recover;
import org.springframework.retry.annotation.Retryable;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
public class ScheduledTasks {

@Scheduled(fixedRate = 10000)
@Retryable(value = { RuntimeException.class }, maxAttempts = 3, backoff = @Backoff(delay = 2000))
public void performTask() {
// 예제 작업
throw new RuntimeException("테스트 예외");
}

@Recover
public void recover(RuntimeException e) {
// 재시도 실패 후 호출될 메서드
System.out.println("재시도 실패: " + e.getMessage());
}
}

@Retryable 애너테이션을 사용하여 재시도 로직을 설정하고, @Recover 애너테이션을 사용하여 재시도 실패 시 호출될 메서드를 정의합니다.

참고문서

이 문서들은 Spring Boot에서 스케줄링 작업을 설정하고 관리하는 데 필요한 정보를 제공합니다.

728x90
반응형