개요 및 배경
별헤는밤 어플에서는 관측지에 대한 관측적합도를 매일 계산하여 사용자들에게 제공하고 있다. 이를 위해 스프링부트에서 제공하는 스케쥴러 기능을 사용하였는데 이에 대해 정리해보려고 한다.
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 호출 작업 등의 작업을 처리할 때 사용한다.
'별밤 일지 > 개발' 카테고리의 다른 글
[SpringBoot] Repository 테스트 하기 (1) | 2024.10.01 |
---|---|
[flutter] Flutter 민감정보 숨기기 (0) | 2024.10.01 |
[Flutter] 우리는 언제 GestureDetector가 필요할까? (2) | 2024.09.23 |
[Flutter] macOS에서 vscode로 flutter 개발환경 구축하기 (0) | 2024.06.10 |
[Java] JsonPath, ObjectMapper (0) | 2024.06.10 |