MyShop API 애플리케이션은 만료된 쿠폰에 대해 매일 00시에 삭제하는 기능이 있다. 이 기능은 스프링 배치를 이용하기 때문에 사용자가 직접 삭제하지 않아도 자동으로 삭제가 된다.
들어가기 앞서 Cron 표현식에 대해 알아야 한다.
Cron 표현식은 리눅스 및 유닉스 기반 시스템에서 주기적인 작업을 수행하기 위해 사용하는 표현식이다. 이를 이용해 일, 시, 분, 초 등을 지정해 특정 시간에 작업을 실행하도록 스케줄링할 수 있다.
Cron 표현식의 형태
*** * * * * ***
| | | | │ └─── 요일 (0 - 7) (0, 7은 일요일)
| | | | └───── 월 (1 - 12)
| | | └─────── 일 (1 - 31)
| | └───────── 시 (0 - 23)
| └─────────── 분 (0 - 59)
└───────────── 초 (0 - 59)
# 매일 자정마다 작업을 수행하는 스케줄링
0 0 0 * * *
Cron 표현식은 다양한 옵션을 제공해 세밀한 스케줄링을 구성할 수 있다.
# 매월 1일부터 5일까지 매일 자정에 작업을 수행하는 스케줄링
0 0 1-5 * *
다음 코드는 @Scheduled 어노테이션으로 cron 표현식을 이용해 스케줄러를 등록해 매일 자정에 만료된 쿠폰을 삭제하는 코드다.
@Component
public class CouponScheduler {
@PersistenceContext
private EntityManager entityManager;
QCoupon qCoupon = QCoupon.coupon;
@Transactional
**@Scheduled(cron = "0 0 0 * * *") // 매일 자정(00시)**
public void deleteCouponExpirationDates() {
LocalDate today = LocalDate.now();
JPAQueryFactory jpaQueryFactory = new JPAQueryFactory(entityManager);
jpaQueryFactory.delete(qCoupon)
.where(qCoupon.expirationDate.loe(today))
.execute();
}
}