본문 바로가기
NodeJS, NPM, Koa/NodeJS, NPM, Express

node-cron 이용한 작업 예약 방법 정리

by Developer88 2025. 2. 6.
반응형

오늘은 NodeJS의 node-cron 모듈을 이용한 작업 예약 방법에 대해 정리하겠습니다.

 

1. 모듈 인스톨과 require 해 주기

가장 먼저해야할 것은 모듈을 인스톨 하는 것 이지요.

아래 명령어로 node-cron 모듈을 설치해 줍니다.

 

npm install --save node-cron

 

 

설치한 node-cron을,

코드에서 사용하기 위해,

아래와 같이 require()명령어로 불러와 줍니다.

 

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

 

3. Cron 표현식

본격적으로 node-cron으로 job을 설정하기 전에 알아둘 것이 있는데요.

예약할 작업의 실행시간을 설정하는,

크론표현식입니다.

6자리로 나와있지만,

가장 앞의 초단위는 선택사항으로,

거의 사용하지 않으니, 5자리라고 생각하시면 됩니다.

 

┌────────────── 초 (선택사항)
│ ┌──────────── 분 (0~59분)
│ │ ┌────────── 시 (0~23분)
│ │ │ ┌──────── 일 (1~31분)
│ │ │ │ ┌────── 월 (1~12월)
│ │ │ │ │ ┌──── 요일 (0 - 7) (0과 7은 일요일)
│ │ │ │ │ │
* * * * * *

 

 

크론 탭 설정에 대한 자세한 내용은,

리눅스의 크론잡을 정리한 아래 글을 참조하시면,

좀 더 많은 예와 함께 도움을 받으실 수 있습니다.

 

>> Linux 크론탭으로 작업 예약 마스터하기: Crontab 스케쥴링

 

Linux 크론탭으로 작업 예약 마스터하기: Crontab 스케쥴링

특정한 시간에 스크립트로 작성한 작업들을 실행시키도록 하려고 할 때, 필요한 것이 리눅스의 크론탭인데요. 오늘은 이것을 활용하여 작업을 예약하는 방법에 대해서 정리해 보겠습니다. 1. Cro

developer88.tistory.com

 

4. Schedule

위에서 본 표현식을 이용해서,

크론잡을 설정할 수 있는데요.

schedule()함수를 이용해서 아래와 같이 설정할 수 있습니다.

 

아래와 같이 크론 표현식에서,

모든 자리를 '*'로 표시할 경우는,

매분마다 실행하라는 의미가 됩니다.

 

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

cron.schedule('* * * * *', () => {
  console.log('running a task every minute');
});

 

아래와 같이 한 자리에,

',(콤마)'를 이용해서 구분하면,

여러 주기를 넣을 수 있는데요.

아래는 매 1,2,4,5분마다 실행되도록 하는 크론잡을 등록하는 것 입니다.

 

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

cron.schedule('1,2,4,5 * * * *', () => {
  console.log('running every minute 1, 2, 4 and 5');
});

 

 

5. 비동기 함수 실행 예약

비동기 함수의 실행 예약도 크게 다르지 않습니다.

 

먼저 비동기 함수를 하나 작성하겠습니다.

 

async function asyncTask() {
  try {
    // 비동기 작업 수행
    await someAsyncOperation();
    console.log("비동기 작업 완료");
  } catch (error) {
    console.error("오류 발생:", error);
  }
}

 

아래와 같이 async, await키워드를 붙여서,

비동기 함수의 실행도 등록할 수 있습니다.

 

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

cron.schedule('* * * * *', async () => {
  await asyncTask();
});

 

 

5. 타임존 설정

시간을 설정할 때 타임존은 매우 중요합니다.

특히 해당서버의 시간이 작업하는 사람의 시간과 다르다면 더욱 그러하구요.

이럴 때 절대적인 타임존 기준으로 설정해 주면 좋을 텐데요.

scheduled와 timezone을 아래와 같이 설정해 줍니다.

 

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

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

 

아래에서는 한국시간 새벽3시에 데이터베이스 클린업을 설정하였습니다.

 

const cron = require('node-cron');
const logger = require('../utils/logger');

function initCleanupJob(db) {
    // 한국 시간 새벽 3시에 실행(UTC 18:00 -> KST 03:00으로 수정)
    cron.schedule('0 3 * * *', async () => {  
        try {
            if (!db) {
                throw new Error('Database connection not available');
            }
            await cleanupExpiredData(db);
        } catch (err) {
            logger.error('Scheduled cleanup failed:', {
                error: err.message,
                stack: err.stack,
                timestamp: new Date().toISOString()
            });
        }
    }, {
        scheduled: true,
        timezone: "Asia/Seoul"  // timezone 설정
    });

    logger.info('Cleanup job initialized');
}

 

 

6. 작업의 시작과 중지

6-1. start함수를 이용한 시작

위에서 본 것처럼,

schedule함수를 이용해 쉽게 작업을 등록할 수 있는데요.

 

아래와 같이 일단 schedule을, 

변수에 담아놓았다가,

특정한 시점에 start()함수를 사용해 등록할 수 있습니다.

이 때, scheduled를 'false'로 해 주어야 합니다.

 

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

const task = cron.schedule('* * * * *', () =>  {
  console.log('stopped task');
}, {
  scheduled: false
});

task.start();

 

6-2. stop()함수를 이용한 정지

이번에는 stop()함수를 이용한 정지 방법도 알아보겠습니다.

작업을 등록하면서 아래와 같이 변수에 담아놓은 다음,

특정 시점에 stop()함수를 실행하게 되면,

아래와 같이 멈출 수 있습니다.

 

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

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

task.stop();

 

이상으로 node-cron을 이용해서 작업을 스케쥴링하는 방법에 대해 정리해 보았습니다.

728x90

댓글