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에서 스케줄링 작업을 설정하고 관리하는 데 필요한 정보를 제공합니다.
'Study Information Technology' 카테고리의 다른 글
Spring Boot의 프로파일 개발 환경에 맞는 설정 관리하기 (0) | 2024.08.22 |
---|---|
전역 인터프리터 잠금GIL과 동시성에 미치는 영향 (0) | 2024.08.22 |
Spring Boot와 Kafka를 활용한 메시징 시스템 구축 (0) | 2024.08.22 |
Spring Boot와 Testcontainers 통합 테스트의 최적화 (0) | 2024.08.22 |
ROS 기반 로봇 진단 도구 개발 (0) | 2024.08.22 |