본문 바로가기
별밤 일지/개발

[Spring] Spring Scheduler 를 활용한 스케쥴러 만들기

by 별밤 에디터 2024. 10. 14.

개요 및 배경

별헤는밤 어플에서는 관측지에 대한 관측적합도를 매일 계산하여 사용자들에게 제공하고 있다. 이를 위해 스프링부트에서 제공하는 스케쥴러 기능을 사용하였는데 이에 대해 정리해보려고 한다.
 

Spring Scheduler

스프링 스케쥴러를 사용하기 위해선 먼저 Application 클래스에 @EnableScheduling을 설정해주어야 한다.
 
@EnableScheduling
public class TourApiProjectApplication {
	public static void main(String[] args) {
		SpringApplication application = new SpringApplication(TourApiProjectApplication.class);
		application.addListeners(new ApplicationPidFileWriter());
		application.run(args);
	}
}

 

아래는 실제 스케쥴러를 구현한 Scheduler 클래스이다.

이때 스케쥴러 클래스는 스프링 빈에 등록되어야 하기 때문에 @Component 를 달아두었다.

아래 코드는 매일 7시에 관측적합도를 구하여 DB 에 저장하는 기능의 스케쥴러이다.

 

@Slf4j
@Component
@RequiredArgsConstructor
public class Scheduler {

    private final ObservationalFitService observationalFitService;

    /**
     * 실행 주기 : 매일 7시
     * JOB : 시간별 관측적합도 정보 호출
     */
    @Scheduled(cron = "${scheduler.observationalFit.save.time}")
    public void saveHourObservationalFit() {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        String today = LocalDate.now().format(formatter);
        log.info("Start Save ObservationalFit Scheduler | {}", today);
        observationalFitService.setObservationFit(today);
    }

 

 

@Scheduled 어노테이션

위 코드에서 saveHourObservationalFit() 메서드에 @Scheduled 어노테이션을 사용한 것을 볼 수 있는데, @Scheduled 어노테이션이 제공하는 여러 옵션을 사용하여 스케쥴 옵션을 설정할 수 있다.

  • fixedRate: 일정 주기마다 작업 실행
  • 아래 코드는 run() 메서드의 시작 시점으로부터 1000 ms 후 run() 메서드 실행
@Scheduled(fixedRate = 1000)
public void run() {
	log.info("Task 실행");
}

 

  • fixedDelay: 작업을 마친 후부터 주기 타이머가 돌아 작업 실행
    아래 코드는 run() 메서드의 종료 시점으로부터 1000 ms 후 run() 메서드 실행
@Scheduled(fixedDelay = 1000)
public void run() {
	log.info("Task 실행");
}
 
  • initialDelay: 스케줄러 등록 시 초기 지연시간 설정
    아래 코드는 메서드 등록 후 3000 ms 후 1000 ms 마다 작업 실행
@Scheduled(fixedRate = 1000, initialDelay = 3000)
public void run() {
	log.info("Task 실행");
}

 

  • cron: 크론 표현식을 사용하여 작업 주기 설정
    cron 은 스케쥴링의 정규 표현식으로, 보통 이 옵션을 많이 사용하는 듯 하다
@Scheduled(cron = "${scheduler.observationalFit.save.time}")
public void saveHourObservationalFit() {
	// task 코드
}

 

scheduler:
  observationalFit:
    save:
      time: "0 0 7 * * *"

application.yaml

 

 

cron 표현식은 6자리로, 왼쪽부터 순서대로 초, 분, 시, 일, 월, 요일을 의미한다.

예를 들면 아래와 같다.

0 0 7 * * * → 매일 7시 실행

0 0 8 1 * * → 매달 1일 8시 실행

 

Spring Batch? Spring Scheduler?

스프링 스케쥴러를 검색하다보면, 스프링 배치와 같이 결과가 나오는 경우가 많다. 필자도 처음에 배치와 스케쥴러의 개념이 헷갈렸기에 이번 기회에 둘의 차이점에 대해 알아보았다.

  • Spring Batch 란?
    여러 개의 작업을 한꺼번에 처리하는 일괄 처리를 의미하며 대용량 데이터 처리를 위해 설계된 배치 처리 프레임 워크이다.
    데이터베이스, 파일, 큐 등을 사용해 데이터를 읽고 처리, 저장하는 데이터 처리에 중점을 둔다.
  • Spring Scheduler 란?
    작업을 일정한 시간에 실행하기 위한 도구로 주기적인 작업을 간단하게 실행할 때 사용한다.
    예를 들어 특정 시간의 이메일 발송, API 호출 작업 등의 작업을 처리할 때 사용한다.

 

별헤는밤 구경가기

 

별 헤는 밤: 밤하늘, 별자리, 여행정보와 날씨예보까지 - Google Play 앱

오늘부터 별잘알! 오늘밤 별자리 정보, 날씨·광공해·월령까지 고려한 '관측적합도', 주변 관측지 검색으로 누구나 쉽게 밤하늘을 즐겨보세요.

play.google.com