현재 진행하고 있는 프로젝트에 데이터를 생성한 후에 특정 시간이 지나면 자동으로 데이터를 삭제하는 로직을 구현했어야 했다.
어떻게 해야할 지 고민하다가 Spring Scheduler
라는 것을 알게 되었다.
먼저, Spring Scheduler를 사용하려면 @EnableScheduling
어노테이션을 명시해 Scheduling을 활성화시켜야 한다.
나는 아래와 같이 global 패키지에 config파일을 하나 추가해 설정해놨다.
@EnableScheduling
@Configuration
public class SchedulingConfig {}
이제 Scheduler를 어떻게 쓰는 지 알아보자
보통 실행하고자 하는 메소드명 위에 @Scheduled
어노테이션을 명시해 사용할 수 있다.
@Scheduled
의 옵션으로 해당 메소드를 어떤 스케줄에 따라 실행시킬 건지 설정할 수 있다.
@Scheduled(fixedRate=1000) // 단위: ms
public void fixedRateScheduler() {
System.out.println("나는 작업이 끝날때 까지 기다리지 않고 1000ms 마다 실핼될거야");
}
fixedRate는 작업의 시작부터 시간을 카운트한다.
작업의 완료유무는 신경 쓰지 않고, 설정한 시간이 될 때마다 해당 메소드를 실행한다.
@Schedueld(fixedDelay=1000) // 단위: ms
public void fixedDelayScheduler() {
System.out.println("나는 이 작업이 끝나고 나서 다시 1000ms 후에 실행될거야");
}
fixedDelay는 작업이 끝난 시점부터 시간을 카운트한다.
따라서 작업이 끝날 때까지 카운트하지 않다가, 작업이 끝나고 난 뒤에 메소드를 실행한다. (메소드 실행 주기가 일정하지 않을 수 있다)
@Scheduled(cron="0/60 * * * * ?")
public void cronScheduler() {
System.out.println("나는 시스템 시간을 기준으로 1분 마다 주기적으로 실행될거야");
}
cron은 개발자가 초, 분, 시, 일, 월, 주, (년)
을 지정해 스케줄러를 동작시킨다.
👀 cron 이용법
* : 모든 값
? : 설정 없음
, : 배열 설정 ex) 1,3,5
- : 범위 설정 ex) 3-5
/ : 특정 값을 기준으로 특정값 마다 반복
0 0 0 * * : 매일 00시 00분 00초에 실행
0 0 2 MON : 월요일 새벽 2시에 실행
0/30 * * * ? : 30초 마다 실행
@Service
@RequiredArgsConstructor
public class SchedulerService {
private final GroupPromotionRepository groupPromotionRepository;
@Transactional
@Async
@Scheduled(cron = "0 0 12 * * *")
public void autoDelete() {
groupPromotionRepository.deleteByCreatedAtLessThanEqual(LocalDateTime.now().minusDays(7));
}
}
나는 위와 같이 적용해놨다.
cron
을 이용해 매일 오후 12시에 해당 메소드가 동작하도록 설정해놨고, 메소드는 group_promotion
이라는 테이블 안의 데이터 중, 생성일에서 7일이 지난 데이터가 있으면 삭제 처리한다.
참고로 스케줄링을 위해서는 Spring Scheduler를 사용하는 방법 외에도 Quartz
라는 Job Scheduling 라이브러리를 이용하는 방법도 있다.