'엄빠도 어렸다' 서버 개발을 하며, 매일 특정시간에 특정 조건을 만족할 때마다 푸시알림을 보내는 스케줄링 작업을 구현해야 했다.
푸시알림 기능을 구현하기에 앞서 Spring Batch, Spring Scheduler 등의 라이브러리를 이용할 수 있다는 것을 알고 각각에 대한 공부 후 더 효율적이고 적합한 것을 선택하고자 하였다.
사용자와의 상호작용 없이 여러 개의 작업을 미리 정해진 순서에 따라 중단 없이 처리하는 것
*배치 = 일괄처리
→ Spring Batch
Spring Batch는 스케줄러가 아니므로, 고려 대상이 아니었다!
배치 작업을 관리하지만, 이 작업(Job)을 구동하거나 실행시키는 기능은 지원하지 않는다. 스프링에서 배치 작업을 실행시키려면 Quartz, Scheduler, Jenkins 등 전용 스케줄러를 사용해야 한다.
스케줄링 작업의 효율적인 관리를 위해서 Spring Batch를 사용할 수 있다!
참고 - https://gimmesome.tistory.com/204
일정한 시간 간격 또는 시각에 특정 로직을 돌리기 위해 사용하는 것
→ Spring Scheduler, Quartz
@Component
+ @Scheduled
@Scheduled
규칙Application 클래스에 @EnabledScheduling
추가
실제 스케줄링 작업할 클래스가 스프링 빈에 등록된 클래스여야 함
Scheduler에 등록할 클래스는 IoC 컨테이너에 등록되어 있어야 한다. → @Service로 등록해줌
스케줄러 메소드는 void 타입으로 지정 & 매개변수 사용 X
+) 비동기 방식으로 실행시키고 싶다면, @EnableAsync
어노테이션을 이용할 수 있다
@Scheduled
설정 옵션fixedDay - 이전 작업이 종료된 후 설정 시간만큼 기다린 후에 시작 (ms)
ex. @Scheduled(fixedDelay = 1000)
fixedRate - 이전 작업이 종료되지 않아도 설정된 시간마다 시작 (ms)
ex. @Scheduled(fixedRate = 1000)
initialDelay - 작업 시작 시, 설정된 시간만큼 기다린 후 시작 (ms)
ex. @Scheduled(fixedRate = 1000, initialDelay = 2000)
cron 표현식 - 원하는 시간대를 설정하여 작업 실행
ex. @Scheduled(cron = "* * * * * *")
→ 6자리 설정만 허용하며, 연도 설정을 할 수 있다.
기호 | 의미 |
---|---|
* | 모든 값을 의미 |
? | 해당 항목을 사용하지 않음 |
- | 기간 설정 |
, | 여러 값을 지정해 나열 시 사용 |
/ | 시작과 반복간격을 지정 |
모든 요일 8 AM에 실행 : 0 0 8 * * *
모든 요일 4 PM에 실행: 0 0 16 * * *
모든 요일 9AM, 9PM에 실행: 0 0 9,21 * * *
모든 요일 8AM,9AM,10AM, 11AM에 실행: 0 0 8-11 * * *
모든 요일 21PM,22PM,23PM, 0AM에 실행: 0 0 21-00 * * *
모든 요일 6:30 AM, 9:30PM에 실행: 0 30 6,21 * * *
모든 시간 0초 0분에 실행: 0 0 * * * *
모든 시간 15초에 실행: 15 * * * * *
모든 요일 0시 15초에 실행: 15 0 0 * * *
매년 8월 25일 9AM에 실행: 0 0 9 25 8 *
매달 7일 9시 30AM에 실행: 0 30 9 7 * *
매년 2월 14일 9AM이 화요일, 일요일이면 실행: 0 0 9 14 2 SUN, TUE
모든 요일 모든 시간 30분에 실행: 0 30 0-23 * * *
매분 0초마다 실행: 0 * * * * ?
매분 0초, 1초, 2초, 3초에 실행: 0-3 * * * * ?
매분 0초, 3초, 6초에 실행: 0, 3, 6, * * * * ?
0초에 시작해 3초마다 실행: 0/3 * * * * ?
zone - 시간대 설정 (디폴트: 로컬 시간대)
ex. @Scheduled(cron = "* * * * * *", zone = "Asia/Seoul")