[Spring] Spring Scheduler

조시현·2024년 6월 27일
0

SpringBatch(Scheduler)

목록 보기
1/4
post-thumbnail

Spring Scheduler란?

Spring Scheduler는 주기적으로 특정 작업을 수행할 수 있도록 스케줄링 기능을 제공합니다.
Spring의 스케줄링 기능은 Cron 표현식, 고정된 간격, 고정된 지연 등을 사용하여 작업을 예약할 수 있습니다.
Java 애플리케이션에서 작업 예약 프로세스를 단순화하여 단순하고 복잡한 예약 요구 사항 모두에 대한 강력한 지원을 제공합니다.

종속성 추가

Spring Scheduler를 사용하려면 프로젝트에 필요한 종속성을 포함해야 합니다.

  • Gradle
dependencies {
    implementation 'org.springframework.boot:spring-boot-starter'
}
  • Maven
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
</dependency>

스케줄링 활성화

스프링 프로젝트의 시작을 맡아주는 메인 애플리케이션 클래스나 스프링 프로젝트의 설정을 구성해주는 Configuration 클래스에 @EnableScheduling 어노테이션 추가를 하여서 추후에 사용할 @Scheduled 어노테이션을 활성화시켜 스프링 스케줄링을 활성화 시켜줍니다.

import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;

@Configuration
@EnableScheduling
public class SchedulerConfig {
}

or

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

주요 기능

  1. 주기적인 작업 실행
  2. 지연된 작업 실행
  3. Cron 표현식 지원: Unix Cron 표현식을 사용하여 복잡한 일정 표현이 가능합니다.
  • 가장 앞부터 순서대로 아래 순서대로 의미합니다.
  1. 초: (0 - 59)
  2. 분: (0 - 59)
  3. 시: (0 - 23)
  4. 일: (1 - 31)
  5. 월: (1 - 12 or JAN-DEC)
  6. 요일: (0 - 7 or SUN-SAT, 여기서 0과 7은 모두 일요일을 나타냅니다.)
@Component
public class ScheduledTasks {

	// 첫 메서드가 호출된 24시간 이후에 실행해줍니다.
	@Scheduled(initialDelay= 86400000)
    public void cleanupLogs() {
        System.out.println("로그를 청소합니다.");
    }
    
    // 처음 바로 실행해 주고 실행을 시작 시점을 기준으로 1시간 마다 이 작업을 실행시켜줍니다.
	@Scheduled(fixedRate = 3600000) 
    public void sendEmailNotifications() {
        System.out.println("이메일 알림을 보냅니다.");
    }
    
    // 처음 바로 실행해 주고 실행이 끝난 시점을 기준으로 1시간 마다 이 작업을 실행시켜줍니다.
	@Scheduled(fixedDelay = 3600000) 
    public void sendEmailNotifications() {
        System.out.println("이메일 알림을 보냅니다.");
    }
    
    // 매일 자정에 이 작업을 실행해줍니다.
    @Scheduled(cron = "0 0 0 * * ?")
	public void addDailyInterest() {
    	System.out.println("매일 자정에 실행됩니다.");
	}
}

부가 기능

TaskScheduler 인터페이스: 보다 복잡한 스케줄링 요구사항을 위해 TaskScheduler 인터페이스를 사용할 수 있습니다.

  • 특정 작업 이후 지연 작업을 진행 할 수 있습니다.
  • TaskScheduler는 인터페이스이지만, 내부 메서드가 defualt 메서드로 구현되어 있어서 interface를 상속받아 구현하지 않아도 직접 사용할 수 있습니다.
@Component
@RequiredArgsConstructor
public class DelayedTaskExecutor {

    private final TaskScheduler taskScheduler;
    private final AlertService alertService;

    public void sendDelayedAlert(String message, long delayInSeconds) {
        taskScheduler.schedule(
                () -> alertService.postAlert(message),
                Instant.now().plusSeconds(delayInSeconds)
        );
    }
}

@Service
@RequiredArgsConstructor
public class DeliveryService() {
	private final DelayedTaskExecutor delayedTaskExecutor;
	private final DeliveryRepository deliveryRepository;
    
	public void makeDelivery() {
    	Delivery delivery = deliveryRepository.startDelivery();
        delayedTaskExecutor.sendDelayedAlert("Your delivery is arriving soon!", 60*10); // 10분 후 메시지 보내기
	}
}
  • schedule()에서 Date를 사용하는 방식도 있지만 이 방식은 지원이 종료된 방식이여서 안전하지 않습니다.

Transaction, Spring Batch, ThreadPoolTaskScheduler 등을 활용한 다면 더욱 풍성한 Spring Scheduler를 사용 할 수 있을거 같습니다.

profile
소프트웨어 관련 고민을 좋아하고 상황에 맞는 답을 함께 찾아가는 과정을 좋아합니다. 😀

0개의 댓글