[Spring][JAVA] Spring에서 주중(월~금)만 스케줄러 실행하기
현재 내가 진행하고 관련 프로젝트에서 매 1분 단위로 DB에 데이터 수집하고 있다. 하지만, 예외 사항으로 매 1분씩 데이터 수집이 안될 때가 있다. 즉, 결측이 발생할 수 있다. 이에 대해서 결측 이력을 별도로 DB에 저장하고 있다. 이 저장된 결측 이력을 매일 아침마다 이메일 템플릿을 통해 메일로 전달받는 서비스를 구현하고 운영 중이다. 원래 같은 경우 매일 아침 8시 15분에 실행되게 하였는데 회사에서 주말에 메일 받는 걸 꺼려해서(어차피 보지도 않을 거면서 참) 주중(월~금)에만 메일이 가도록 설정하고자 한다.
1. ✅ Spring cron 표현식 구조
앞서 Spring cron 표현식에 대해 알아보자.
Srping에서 사용하는 cron 표현식은 총 6개의 필드로 구성된다.
초 분 시 일 월 요일
예를 들면 아래와 같다. 매일 오전 8시 15분에 대한 예시이다.
@Scheduled(cron = "0 15 8 * * *")
위에 얘기한 것처럼 처음엔 이렇게 설정되어 있었다.
2. 🔍 Quartz cron 표현식과의 차이
자료를 찾아보다가 Spring 표현식과 Quartz 표현식이 다르다고 해서 정리해 본다.
항목 | Spring cron | Quartz cron |
필드 수 | 6개 (초 분 시 일 월 요일) | 7개 (초 분 시 일 월 요일 연도) |
표현 범위 | 기본적인 표현 중심 | 고급 표현(예: L, W, # 등) 지원 |
사용 위치 | @Scheduled 등 Spring 전용 | Quartz Job 설정 등 Quartz 전용 |
가장 큰 차이는 필드 수이다. Spring cron 에서는 연도가 빠져있다.
3.🧑💻 주중(월~금) 08:15에만 실행하기
이제 주중에만 실행되도록 설정해보자.
두 가지 방식이 있다. 요일 부분에 문자로 설정할 수 있고, 숫자로 표현할 수 있다.
// 문자로 표현
@Scheduled(cron = "0 15 8 ? * MON-FRI")
// 숫자로 표현
@Scheduled(cron = "0 15 8 ? * 1-5")
cron에서 요일 부분에 MON-FRI 처럼 월-금으로 설정하면 된다.
숫자로도 표현을 할 수 있다.
일요일은 0 또는 7이고, 월요일부터 1이다.
실제 예시로 작성하자면 아래와 같다.
@Scheduled(cron = "0 15 8 ? * 1-5")
// @Scheduled(cron = "0 15 8 ? * MON-FRI")
public void executeJob() {
// 여기에 실행할 작업 로직 작성
}
지금까지 주중 스케줄러 설정에 대해 알아보았다.
참고로 CronMaker 이 사이트는 cron 테스트를 할 수 있는 사이트이다. 그리고 내가 원하는 조건에 맞게 cron 값 생성도 할 수 있다. 약간 오류?(가 있지만 그래도 cron 값 맞게 설정했는지 확인할 때 참고한다.
다음엔 자바의 Mail Sender 관련해서 메일 전송 서비스에 대해 작성해볼까 한다. (언제 작성할지는...)