스케줄러(Scheduler)는 특정 시간이나 간격에 따라 작업을 자동으로 실행할 수 있게 해주는 기능입니다. 이는 주기적인 작업(예: 백업, 이메일 전송, 데이터 수집 등)을 자동으로 처리하는 데 유용하며, 다양한 스케줄링 방식이 존재합니다. Node.js에서 주로 사용되는 스케줄링 방법에는
setTimeout
,setInterval
, 그리고 타사 라이브러리(예:node-schedule
,cron
)를 이용한 방법이 있습니다.
setTimeout
, setInterval
setTimeout
은 특정 시간이 지난 후 한 번만 작업을 실행하는 함수입니다.
setTimeout(() => {
console.log('3초 후에 이 메시지가 출력됩니다.');
}, 3000); // 3초 후에 실행
setInterval
은 일정한 시간 간격마다 반복적으로 작업을 실행하는 함수입니다.
clearInterval()
을 사용하여 멈출 수 있습니다.
const intervalId = setInterval(() => {
console.log('이 메시지는 5초마다 출력됩니다.');
}, 5000);
setTimeout(() => {
clearInterval(intervalId);
console.log('더 이상 반복되지 않습니다.');
}, 15000); // 15초 후에 멈춤
node-schedule
은 크론(Cron) 스타일로 정교한 스케줄링 작업을 설정할 수 있는 라이브러리입니다. 복잡한 주기적인 작업을 쉽게 설정할 수 있도록 해줍니다.
node-schedule
의 주요 기능과 특징
node-schedule
은 크론 스타일의 문자열을 사용하여 작업을 예약할 수 있습니다. 예를 들어, 매일 특정 시간에 작업을 실행하거나 매주 특정 요일에 작업을 예약하는 것이 가능합니다.node-schedule
은 시스템 시간이 바뀌지 않는 한 정확하게 설정된 시간에 작업을 실행합니다. 이는 특정한 시간에 작업을 해야 하는 경우에 유용합니다.node-schedule
은 다양한 반복 작업 및 복잡한 일정 처리를 지원합니다. 예를 들어, 매주 월요일과 수요일 오후 2시에만 작업을 실행하거나 매년 특정 월과 일에 작업을 실행하도록 할 수 있습니다.스케줄 설정 방법 (Cron 스타일)
node-schedule
에서 사용하는 크론 스타일의 문자열은 다음 형식을 따릅니다:
💡 크론 표현식
* * * * *
| | | | |
| | | | └─ 요일 (0 - 7) (일요일 0 또는 7, 월요일 1, ..., 토요일 6)
| | | └─── 월 (1 - 12)
| | └───── 일 (1 - 31)
| └─────── 시 (0 - 23)
└───────── 분 (0 - 59)
0 0 * * *
: 매일 자정(00:00)에 실행0 9 * * 1
: 매주 월요일 오전 9시에 실행30 17 * * 1-5
: 매주 월요일부터 금요일까지 오후 5시 30분에 실행/10 * * * *
: 매 10분마다 실행사용 예시 코드
// node-schedule 모듈 불러오기
const schedule = require('node-schedule');
// 특정 시간(매일 오전 9시)에 작업을 실행
const job = schedule.scheduleJob('0 9 * * *', function(){
console.log('매일 오전 9시에 실행되는 작업입니다!');
});
// 작업을 취소하고 싶다면 아래 코드 실행
// job.cancel();
schedule.scheduleJob()
함수는 첫 번째 인자로 스케줄을 설정할 때 사용할 크론(cron) 스타일의 문자열을 받습니다. '0 9 * * *'
는 "매일 오전 9시"를 의미합니다.분 시 일 월 요일
의 형식으로 작성됩니다.0 9 * * 1
는 매주 월요일 오전 9시를 의미합니다.job.cancel()
을 호출하여 설정된 작업을 취소할 수 있습니다.cron
라이브러리는 크론(cron) 표현식을 사용하여 특정 시간이나 주기에 작업을 자동으로 실행할 수 있게 해주는 스케줄링 라이브러리입니다. cron
은 Unix/Linux 시스템에서 널리 사용되는 일정 관리 시스템에서 파생된 것으로, 주기적으로 실행해야 하는 작업(예: 백업, 이메일 전송, 데이터 갱신)을 매우 간편하게 설정할 수 있습니다.
cron
의 주요 기능과 특징
타임존 설정
cron
라이브러리는 작업을 특정 시간대에 맞춰 실행할 수 있도록 타임존을 지원합니다. 타임존을 지정하려면 아래와 같이 설정할 수 있습니다.
const job = new CronJob('0 0 * * *', function() {
console.log('매일 자정에 실행됩니다.');
}, null, true, 'Asia/Seoul');
사용 예시 코드
const CronJob = require('cron').CronJob;
// 매일 오전 8시에 실행되는 작업
const job = new CronJob('0 8 * * *', function() {
console.log('매일 오전 8시에 실행되는 작업입니다.');
});
job.start();
const job = new CronJob(new Date(2024, 9, 10, 14, 30, 0), function() {
console.log('특정 시간에 한 번만 실행되는 작업입니다.');
});
job.start();
job.start()
: 예약된 작업을 시작합니다.job.stop()
: 작업을 중지합니다.job.running
: 현재 작업이 실행 중인지 확인할 수 있는 플래그입니다.스케줄러 | 특징 및 장점 | 사용 시기 및 예시 |
---|---|---|
setTimeout | 일정 시간이 지난 후 한 번만 작업을 실행 | 짧은 지연 후 한 번만 실행해야 할 때 (예: 알림 표시) |
setInterval | 일정한 간격으로 작업을 반복적으로 실행 | 주기적으로 반복 실행해야 하는 간단한 작업 (예: 주기적 데이터 갱신) |
node-schedule | 크론 표현식을 사용한 정교한 스케줄 작업 설정 | 매일, 매주, 매월 같은 주기적 작업이 필요한 경우 |
cron | 간단한 크론 스케줄을 사용할 수 있는 모듈 | Unix/Linux 크론 스타일로 작업을 주기적으로 실행할 때 |
스케줄러 라이브러리(node-schedule, cron)를 사용하여 일정 시간 간격마다 현재의 시간을 파일에 저장하는 코드를 작성해보겠습니다.
npm i node-schedule
const schedule = require('node-schedule');
const fs = require('fs');
const path = require('path');
// 파일 경로 설정
const filePath = path.join(__dirname, 'current_time_node_schedule.txt');
// 5초마다 현재 시간을 파일에 저장하는 작업
const job = schedule.scheduleJob('*/5 * * * * *', function() {
const currentTime = new Date().toLocaleString();
fs.appendFile(filePath, `현재 시간: ${currentTime}\n`, (err) => {
if (err) throw err;
console.log(`현재 시간이 저장되었습니다: ${currentTime}`);
});
});
console.log('5분마다 현재 시간을 저장하는 작업이 시작되었습니다.');
npm i cron
const CronJob = require('cron').CronJob;
const fs = require('fs');
const path = require('path');
// 파일 경로 설정
const filePath = path.join(__dirname, 'current_time_cron.txt');
// 5초마다 현재 시간을 파일에 저장하는 작업
const job = new CronJob('*/5 * * * * *', function() {
const currentTime = new Date().toLocaleString();
fs.appendFile(filePath, `현재 시간: ${currentTime}\n`, (err) => {
if (err) throw err;
console.log(`현재 시간이 저장되었습니다: ${currentTime}`);
});
});
// 작업 시작
job.start();
console.log('5분마다 현재 시간을 저장하는 작업이 시작되었습니다.');