[Express] Node Cron 모듈로 Job Scheduling하기

JuseungL·2024년 2월 19일
0

Node.js

목록 보기
8/8
post-thumbnail

왜 사용하게 됐나?

창업 동아리에서 하루에 한번 사용할 수 있는 구독형 어플리케이션을 제작했었는데 하루에 한번 사용하면 DB의 한 테이블에 available 필드를 False로 해놓고 정오에 모든 필드를 True로 초기화 시켜서 매일 구독권을 사용 가능하도록 해야했다.
결국 나는 매일 특정 시간에 해당 필드를 초기화 할 수 있는 API를 짜야했는데 어떻게 할지 많은 고민을 하다가 구글링 중에 특정 시간마다 Request를 보낼 수 있는 node-cron를 알게 되어 사용해보게 됐다.

node-cron에 대해서

Cron이란?

Cron은 유닉스 계열 컴퓨터 운영 체제의 시간 기반 Job 스케줄러이다.
즉, 유닉스에서 Cron을 통해 스케줄러를 실행한다.
소프트웨어 환경을 설정하고 관리하는 사람들은 작업을 고정된 시간, 날짜, 간격에 주기적으로 실행할 수 있도록 스케줄링하기 위해 cron을 사용한다.

node-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 표현식에서 빈도를 정의해주고 두번째 인자에 해당 시간에 실행할 콜백 함수가 들어간다.

크론 표현식(cron expression)

크론 표현식을 통해 실행 주기(빈도)를 설정해주게 된다. 각각 가능한 값이 다음과 같다. 보통은 second는 생략하고 `* * * * *`이렇게 5개로 사용하는 것 같다.

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);
  }
});
profile
기록

0개의 댓글