저번에 스프링 배치에 대해서 이론을 공부했었는데 그 과정에서 새롭게 알게 된 점은
배치와 스케줄러는 각각 다른 역할을 하지만, 결국 스프링 배치를 사용하는 이유는 일정 주기, 시간마다 대량의 데이터를 일괄처리하기 위함이므로, 자동으로 처리하려면 스케줄러는 무조건 사용돼야 된다는 점입니다.
기초적인 이론은 아래 링크에서 확인 가능합니다!
https://hyunily.tistory.com/28
그럼 스프링 배치를 본격적으로 다뤄보기 전에, 스케줄러에 대해서도 확실히 짚고 넘어가 보려 합니다.
스프링 부트에서 사용하는 스케줄러는 특정 작업을 일정 시간 간격으로 자동 실행하기 위해 사용됩니다.
자체적으로도 스케줄링 기능을 지원하며, 기본적으로 @Scheduled 어노테이션을 사용하여 스케줄링 작업을 설정합니다.
스케줄러 활성화
스프링 부트 애플리케이션 클래스나, 설정 클래스에서 @EnableScheduling 어노테이션을 추가해야 합니다.
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;
@SpringBootApplication
@EnableScheduling
public class SchedulerApplication {
public static void main(String[] args) {
SpringApplication.run(SchedulerApplication.class, args);
}
}
@Scheduled 어노테이션
보통 메서드에서 사용되며, 이 어노테이션이 붙은 메서드는 지정된 주기에 따라 자동으로 실행됩니다.
fixedRate : 고정된 시간 간격으로 실행
단위는 밀리초이며, 이전 작업이 시작된 시점부터 일정 시간 후에 새로운 작업이 시작됩니다.
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@Component
public class FixedRateTask {
@Scheduled(fixedRate = 5000) // 5초마다 실행
public void checkTask() {
System.out.println("5초마다 실행: " + System.currentTimeMillis());
}
}
fixedDelay : 작업 종료 후 일정 시간 간격으로 실행
이전 작업이 종료된 시점부터 일정 시간 간격 후에 다음 작업이 시작됩니다.
@Scheduled(fixedDelay = 5000)
public void checkDelayedTask() {
System.out.println("@@이전 작업 종료 후 5초 뒤에 실행: " + System.currentTimeMillis() + "@@");
}
initialDelay : 초기 지연 후 실행
작업 시작 전에 초기 지연 시간을 설정할 수 있습니다. 즉 대기하는 시간을 나타냅니다.
@Scheduled(initialDelay = 20000, fixedRate = 5000) // 20초 대기 후 5초마다 실행
public void performTaskWithInitialDelay() {
System.out.println("20초 대기 후 시작되는 작업: " + System.currentTimeMillis());
}
Cron : cron 표현식을 사용한 스케줄링
cron 속성은 더 복잡한 스케줄링을 설정할 수 있습니다. 특정 시간이나 요일에 작업을 실행하게 할 수 있습니다.
cron 표현식 기본 형식
* * * * * * => 초 분 시 일 월 요일
각 필드의 의미
필드값 | 범위 |
초 | 0 ~ 59 |
분 | 0 ~ 59 |
시 | 0 ~ 23 |
일 | 1 ~ 31 |
월 | 1 ~ 12 |
요일 | 0 ~ 7 (0또는 7은 일요일을 의미) 영어 약어 사용 가능 |
특수 기호
특수 문자 | 설명 | 예시 |
* | 모든 값 | * * * * * *는 매초 실행 |
, | 여러 값 나열 | 0 0 9,18 * * *는 매일 9시와 18시 실행 |
- | 범위 | 0 0 9-17 * * *는 9시부터 17시 사이 매 정시에 실행 |
/ | 주기 | */5 * * * * *는 매 5초마다 실행 |
? | 일, 요일 필드에서 사용 가능 | 0 0 0 1 * ?는 매월 1일 자정에 실행 |
L | 마지막 | 0 0 0 L * *는 매월 마지막 날 자정에 실행 |
W | 가장 가까운 평일 | 0 0 0 15W * *는 매달 15일에 가장 가까운 평일 자정에 실행 |
# | N번째 요일 | 0 0 0 ? * 2#1는 매월 첫 번째 월요일 자정에 실행 |
주요 설정 종류 예시
1. 특정 시간에 작업 실행
- 매일 오전 12시 실행: 0 0 0 * * *
- 매일 오후 2시 실행: 0 0 14 * * *
2. 특정 분마다 실행
- 매 30분마다 실행: 0 */30 * * * *
- 매 15분마다 실행: 0 */15 * * * *
3. 특정 초마다 실행
- 매 5초마다 실행: */5 * * * * *
- 매 10초마다 실행: */10 * * * * *
4. 특정 요일에 실행
- 매주 월요일 오전 8시 실행: 0 0 8 * * MON or 0 0 8 * * 1
- 매주 금요일 오후 6시 실행: 0 0 18 * * FRI or 0 0 18 * * 5
- 보통 개발 코드 스타일이나 가독성을 고려해 약어 또는 숫자를 선택해서 사용하시면 됩니다.
요일 | 숫자 | 영어 약어 |
일요일 | 0 또는 7 | SUN |
월요일 | 1 | MON |
화요일 | 2 | TUE |
수요일 | 3 | WED |
목요일 | 4 | THU |
금요일 | 5 | FRI |
토요일 | 6 | SAT |
5. 특정 월에 실행
- 매년 1월 1일 0시 실행: 0 0 0 1 1 *
- 매년 12월 31일 자정에 실행: 0 0 0 31 12 *
6. 매일 특정 시간 범위에서 실행
- 매일 오전 9시부터 오후 5시까지 매 1시간마다 실행: 0 0 9-17 * * *
- 매일 오후 6시부터 오후 11시까지 30분마다 실행: 0 */30 18-23 * * *
7. 특정 날마다 실행
- 매달 1일 0시 실행: 0 0 0 1 * *
- 매달 15일 자정에 실행: 0 0 0 15 * *
8. 특정 요일의 특정 시간에 실행
- 매주 일요일 자정 실행: 0 0 0 * * SUN
- 매주 월~금 오전 8시 실행: 0 0 8 * * MON-FRI
9. 특정 간격으로 실행
- 매 5일마다 자정 실행: 0 0 0 */5 * *
- 매 3시간마다 실행: 0 0 */3 * * *
10. 특정 기간 실행(범위 설정)
- 매년 1월부터 6월까지 매일 자정 실행: 0 0 0 * 1-6 *
- 매년 3월부터 5월까지 매일 오전 9시 실행: 0 0 9 * 3-5 *
이렇게 특정 작업을 일정 시간 간격으로 자동 실행하게 만들기 위해 스케줄러를 활용하면, 추후 배치 서버로 분리하는 작업에서 한층 더 수월하게 작업을 할 수 있습니다.
'Spring' 카테고리의 다른 글
혼쭐 나기 전, 맛 좀 보자 - Feature Flag (0) | 2024.11.24 |
---|---|
Spring Batch (0) | 2024.09.22 |
Spring Batch란? (1) | 2024.09.09 |
Spring Boot 회원가입 - 이메일(SMTP) 인증 구현하기 (0) | 2024.07.28 |
Spring Boot Profile 설정 (0) | 2024.07.22 |