본문 바로가기
Back-end/Node.js

[Node.js] node-cron을 이용한 NodeJS 스케줄러 설정

by 며루치꽃 2021. 3. 20.

1. Cron 이란? 

 

어느 작업을 특정한 간격이나 시간, 날짜에 반복해서 수행하고 싶을 때 사용하는 것이 스케줄러입니다. 

저는 프로젝트를 하다 매일 특정 시간마다 함수를 실행하여 MySQL의 쿼리를 실행하여 테이블을 업데이트 하고 싶었습니다.

예를 들면 매일 4시간 간격으로 사용자 인풋을 체크하여, 인풋에 따라 테이블을 자동으로 4시간마다 업데이트하는 요구사항이 있었습니다. 

이 때 사용한 것이 바로 Cron 입니다.

 

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

 

https://www.npmjs.com/package/node-cron

 

node-cron

A simple cron-like task scheduler for Node.js

www.npmjs.com

저는 node에서 작업하고 있기 때문에 node-cron 을 사용하였습니다. 

 

node-cron 설치

npm install --save node-cron

모듈을 설치한 이후에, schedule 변수에 모듈을 아래와 같이 require 해줍니다.

const cron = require('node-cron');

2. node-cron 사용 

 

설치가 완료되면 해당 NodeJS 프로젝트에서 node-cron 모듈을 사용할 수 있습니다. 저는 테스트를 위해 index.js 파일에서 실행하였습니다.

 

var cron = require('node-cron');

cron.schedule('* * * * *', () => {
  console.log('node-cron 실행 테스트');
});

콜백 함수 안에 실행할 작업을 작성하면 됩니다. ' * * * * * ' 을 적용하게 되면 매 1분마다 콜백함수를 실행하게 됩니다.

 

3. Scheduling 사용하기 

 

node-cron 모듈은 GNU crontab을 기반으로 하는 node.js용 순수 자바 스크립트의 가벼운 작업 스케줄러입니다. 이 모듈을 사용하면 전체 crontab 구문을 사용하여 node.js에서 작업을 예약할 수 있습니다.

 

* 대신에 들어갈 값은 다음과 같습니다.

 

field value
second 0-59
minute 0-59
hour 0-23
day of month 1-31
month 1-12 (or names)
day of week 0-7 (or names, 0 or 7 are Sunday)

 

허용되는 값은 위와 같으며 아래 사이트에서도 쉽게 crontab 구문을 만들 수가 있습니다. 

 

https://crontab.guru

 

Crontab.guru - The cron schedule expression editor

loading... Cron job failures can be disastrous! We created Cronitor because cron itself can't alert you if your jobs fail or never start. Cronitor is easy to integrate and provides you with instant alerts when things go wrong. Learn more about cron job mon

crontab.guru

 

Using multiples values

콤마(,)를 사용해 다중 값을 사용할 수 있습니다.

 

// 다중 값 사용
var cron = require('node-cron');
 
cron.schedule('1,2,4,5 * * * *', () => {
  console.log('매 1, 2, 4, 5분 마다 실행');
});

Using ranges

값의 범위를 사용할 수 있습니다.

 

// 범위 값 사용
var cron = require('node-cron');
 
cron.schedule('1-5 * * * *', () => {
  console.log('매 1-5분 마다 실행');
});

Using step values

숫자 범위와 '/' 다음에 숫자와 함께 사용할 수 있습니다.

 

// 숫자 범위 + / + 숫자
var cron = require('node-cron');
 
cron.schedule('1-10/2 * * * *', () => {
  console.log('매 2,4,6,8,10분 마다 실행');
});

 

Using names

month와 week day 항목에는 이름이나 약어를 사용할 수 있습니다.

// 이름 사용
var cron = require('node-cron');
 
cron.schedule('* * * January,September Sunday', () => {
  console.log('1월과 9월의 일요일 마다 실행');
});
// 약어 사용
var cron = require('node-cron');
 
cron.schedule('* * * Jan,Sep Sun', () => {
  console.log('1월과 9월의 일요일 마다 실행');
});

4. Scheduling 취소

var cron = require('node-cron');

var task = cron.schedule('* * * * *', () =>  {
  console.log('will execute every minute until stopped');
});

task.stop();

다시 시작하지 않으면 스케줄링 해둔 작업이 실행되지 않습니다.

 

5. node-cron 에서 사용할 수 있는 옵션

 

- scheduled: 작업이 예약되도록 하는 boolean 타입, default는 true로 설정되어 있다고 합니다.

- timezone: 시간대 설정입니다. 저는 Seoul 시간대를 사용하였기 때문에 아래와 같이 세팅해주었습니다. 

 var cron = require('node-cron');

 cron.schedule('0 1 * * *', () => {
   console.log('Running a job at 01:00 at Asia/Seoul');
 }, {
   scheduled: true,
   timezone: "Asia/Seoul"
 });

 

6. 제가 사용한 프로젝트 예시

var cron = require('node-cron');

cron.schedule('0 0-23/4 1-31 * *', [사용할 콜백함수], 
    {
        timezone: "Asia/Seoul"
    }); 

사용할 콜백함수를 Controller에 지정해두고, Controller에서 사용할 쿼리를 정의해준 뒤, 마지막으로 Controller를 사용하는 route에 위의 cron 스케줄링을 이용하여 매일 4시간마다 콜백함수를 사용할 수 있도록 해줬습니다. 

댓글