Spring Boot Scheduler 사용 - 특정 기간이 지난 데이터 자동 삭제

haaaalin·2023년 3월 28일
0

현재 진행하고 있는 프로젝트에 데이터를 생성한 후에 특정 시간이 지나면 자동으로 데이터를 삭제하는 로직을 구현했어야 했다.
어떻게 해야할 지 고민하다가 Spring Scheduler 라는 것을 알게 되었다.

Spring Scheduler

먼저, Spring Scheduler를 사용하려면 @EnableScheduling 어노테이션을 명시해 Scheduling을 활성화시켜야 한다.
나는 아래와 같이 global 패키지에 config파일을 하나 추가해 설정해놨다.

@EnableScheduling
@Configuration
public class SchedulingConfig {}

이제 Scheduler를 어떻게 쓰는 지 알아보자

보통 실행하고자 하는 메소드명 위에 @Scheduled 어노테이션을 명시해 사용할 수 있다.

@Scheduled

@Scheduled 의 옵션으로 해당 메소드를 어떤 스케줄에 따라 실행시킬 건지 설정할 수 있다.

fixedRate

@Scheduled(fixedRate=1000) // 단위: ms
public void fixedRateScheduler() {
  System.out.println("나는 작업이 끝날때 까지 기다리지 않고 1000ms 마다 실핼될거야");
}

fixedRate는 작업의 시작부터 시간을 카운트한다.
작업의 완료유무는 신경 쓰지 않고, 설정한 시간이 될 때마다 해당 메소드를 실행한다.

fixedDelay

@Schedueld(fixedDelay=1000) // 단위: ms 
public void fixedDelayScheduler() {
  System.out.println("나는 이 작업이 끝나고 나서 다시 1000ms 후에 실행될거야");
}

fixedDelay는 작업이 끝난 시점부터 시간을 카운트한다.
따라서 작업이 끝날 때까지 카운트하지 않다가, 작업이 끝나고 난 뒤에 메소드를 실행한다. (메소드 실행 주기가 일정하지 않을 수 있다)

cron

@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 라이브러리를 이용하는 방법도 있다.

✏️ 참고

profile
한 걸음 한 걸음 쌓아가자😎

0개의 댓글