서버가 하나뿐인 환경에서는 고려할 필요가 없습니다.
그러나 둘 이상의 서버를 사용하는 분산 환경에서는 클러스터링이 필요합니다. 세션 기반 로그인을 분산 환경에서 사용해보았다면 레디스나 JDBC를 이용해서 세션 클러스터링을 고민해보거나 시도해본 경험이 있을 것입니다.
스케줄러도 동일합니다. 분산 환경에서 스케줄링한 작업이 동시에 한 번만 실행하는 것을 보장해주기 위해 클러스터링이 필요합니다.
이에 대한 해결방법은 두 가지입니다.
첫째, 스케줄러 락을 제공하는 라이브러리인 shedlock을 사용하는 것
둘째, 스프링이 제공하는 스케줄러 대신 quartz를 사용하여 스케줄러 클러스터링을 하는 것
저는 전자의 방법인 shedlock을 이용해보겠습니다. 현재 진행중인 프로젝트에 빠르게 적용할 수 있고 quartz를 사용하기 위해서는 추가 학습을 진행해야 합니다. 추후 프로젝트를 끝낸 후 quartz에 대한 학습을 진행해보는 것으로 하겠습니다.
shedlock은 공통의 저장소에 스케줄러 락에 대한 정보를 저장하는 기능을 제공하는 심플한 라이브러리입니다. 어노테이션 기반으로 동작하기 때문에 설정 정보를 제외하면 따로 코드를 추가할 필요도 없습니다.
해당 라이브러리를 사용하기 위해서 다음과 같이 의존성을 추가해줍시다.
build.gradle
//scheduler
implementation 'net.javacrumbs.shedlock:shedlock-spring:5.7.0'
implementation 'net.javacrumbs.shedlock:shedlock-provider-jdbc-template:5.7.0'