창업 동아리에서 하루에 한번 사용할 수 있는 구독형 어플리케이션을 제작했었는데 하루에 한번 사용하면 DB의 한 테이블에 available
필드를 False
로 해놓고 정오에 모든 필드를 True
로 초기화 시켜서 매일 구독권을 사용 가능하도록 해야했다.
결국 나는 매일 특정 시간에 해당 필드를 초기화 할 수 있는 API를 짜야했는데 어떻게 할지 많은 고민을 하다가 구글링 중에 특정 시간마다 Request를 보낼 수 있는 node-cron
를 알게 되어 사용해보게 됐다.
Cron은 유닉스 계열 컴퓨터 운영 체제의 시간 기반 Job 스케줄러이다.
즉, 유닉스에서 Cron을 통해 스케줄러를 실행한다.
소프트웨어 환경을 설정하고 관리하는 사람들은 작업을 고정된 시간, 날짜, 간격에 주기적으로 실행할 수 있도록 스케줄링하기 위해 cron을 사용한다.
node-cron 모듈은 GNU crontab을 기반으로 하는 node.js용 순수 자바 스크립트의 가벼운 작업 스케줄러이다. 이 모듈을 사용하면 전체 crontab 구문을 사용하여 node.js에서 작업을 예약할 수 있다. 쉽게 말해 해당 모듈을 사용하면 주기적으로 반복되는 작업을 예약하고 실행할 수 있다.
npm Document를 참고해보자.
이것은 npm document에서 주어진 예시 코드이다.
// Import node-cron and schedule a task
var cron = require('node-cron');
cron.schedule('* * * * *', () => {
console.log('running a task every minute');
});
cron.schedule()
메소드의 첫번째 인자로는 cron 표현식이 나온다. '* * * * *'
이 부분인데 cron 표현식에서 빈도를 정의해주고 두번째 인자에 해당 시간에 실행할 콜백 함수가 들어간다.
npm 다큐먼트를 참고해보면
아래와 같이 다양하게 표현 가능하다.
1,2,3,4,5 * * * *
: 매 1, 2, 4, 5분 마다 실행1-10 * * * *
: 매 1~10분 실행하라고 범위를 지정1-10/2 * * * *
: 매 2, 4, 6, 7, 10분 마다 실행*/2 * * * *
: 매 2분 마다 실행* * * Jan,Sep Sun
or* * * January,September Sunday
: 1월과 9월의 일요일 마다 실행
아래 코드를 통해 매일 정오에 구독권 사용 여부를 초기화하는 코드를 썼다.
import cron from "node-cron";
// 매일 정오(12시)에 함수 실행
cron.schedule("0 12 * * *", async () => {
try {
// 구독한 유저들의 서비스 이용상태 초기화
const [updateResult] = await conn.execute(
"UPDATE user_profile SET available = true WHERE subscribed = true"
);
// const currentTime = new Date();
// console.log(`[${currentTime}] ${updateResult.affectedRows}개의 레코드 업데이트 완료`);
} catch (err) {
console.error("available 필드 업데이트 중 오류 발생:", err);
}
});