오늘은 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을 이용해서 작업을 스케쥴링하는 방법에 대해 정리해 보았습니다.
'NodeJS, NPM, Koa > NodeJS, NPM, Express' 카테고리의 다른 글
NodeJS Import 방법 정리 # CommonJS ES (0) | 2023.04.19 |
---|---|
서버가 되는 맥컴퓨터의 IP Address 보기 # Mac (0) | 2023.04.18 |
NodeJS 에서 CSV 읽어들이기 # JS (0) | 2022.05.05 |
Pug (구 Jade) 설치 및 기본 문법들 정리 # NodeJS (0) | 2021.11.25 |
NPM 의 package.json 을 이용한 효율적 설치 방법 #NodeJS (0) | 2020.03.21 |
댓글