[Node.js] scheduler

Main·2024년 10월 9일
0

Node.js

목록 보기
18/20
post-thumbnail

Scheduler ?

스케줄러(Scheduler)는 특정 시간이나 간격에 따라 작업을 자동으로 실행할 수 있게 해주는 기능입니다. 이는 주기적인 작업(예: 백업, 이메일 전송, 데이터 수집 등)을 자동으로 처리하는 데 유용하며, 다양한 스케줄링 방식이 존재합니다. Node.js에서 주로 사용되는 스케줄링 방법에는 setTimeout, setInterval, 그리고 타사 라이브러리(예: node-schedule, cron)를 이용한 방법이 있습니다.


기본 내장 스케줄러 setTimeout, setInterval

setTimeout

setTimeout은 특정 시간이 지난 후 한 번만 작업을 실행하는 함수입니다.

setTimeout(() => {
  console.log('3초 후에 이 메시지가 출력됩니다.');
}, 3000); // 3초 후에 실행

setInterval

setInterval은 일정한 시간 간격마다 반복적으로 작업을 실행하는 함수입니다.

clearInterval()을 사용하여 멈출 수 있습니다.

const intervalId = setInterval(() => {
  console.log('이 메시지는 5초마다 출력됩니다.');
}, 5000);

setTimeout(() => {
  clearInterval(intervalId);
  console.log('더 이상 반복되지 않습니다.');
}, 15000); // 15초 후에 멈춤

스케줄러 라이브러리

1 ) node-schedule 라이브러리

node-schedule은 크론(Cron) 스타일로 정교한 스케줄링 작업을 설정할 수 있는 라이브러리입니다. 복잡한 주기적인 작업을 쉽게 설정할 수 있도록 해줍니다.

node-schedule의 주요 기능과 특징

  • 크론 스타일의 스케줄링: node-schedule은 크론 스타일의 문자열을 사용하여 작업을 예약할 수 있습니다. 예를 들어, 매일 특정 시간에 작업을 실행하거나 매주 특정 요일에 작업을 예약하는 것이 가능합니다.
  • 정확한 시간에 실행: node-schedule은 시스템 시간이 바뀌지 않는 한 정확하게 설정된 시간에 작업을 실행합니다. 이는 특정한 시간에 작업을 해야 하는 경우에 유용합니다.
  • 특정 날짜 및 시간: 특정 날짜나 시간에 한 번만 작업을 실행하도록 설정할 수도 있습니다. 예를 들어, 특정 이벤트가 발생할 날짜에만 작업을 실행하는 것이 가능합니다.
  • 복잡한 스케줄 처리: node-schedule은 다양한 반복 작업 및 복잡한 일정 처리를 지원합니다. 예를 들어, 매주 월요일과 수요일 오후 2시에만 작업을 실행하거나 매년 특정 월과 일에 작업을 실행하도록 할 수 있습니다.
  • 작업 취소 및 재예약: 실행 예정인 작업을 언제든지 취소하거나 다시 예약할 수 있습니다. 즉, 유동적인 스케줄 관리가 가능하다는 뜻입니다.

스케줄 설정 방법 (Cron 스타일)

node-schedule에서 사용하는 크론 스타일의 문자열은 다음 형식을 따릅니다:

  • 분 (0-59): 작업을 실행할 분 (예: 0, 30)
  • 시 (0-23): 작업을 실행할 시간 (예: 14는 오후 2시)
  • 일 (1-31): 달의 날짜 (예: 15는 15일)
  • 월 (1-12): 달 (예: 3은 3월)
  • 요일 (0-6): 요일 (0은 일요일, 6은 토요일)

💡 크론 표현식

* * * * *
| | | | |
| | | | └─ 요일 (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()을 호출하여 설정된 작업을 취소할 수 있습니다.

2 ) cron 라이브러리

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)를 사용하여 일정 시간 간격마다 현재의 시간을 파일에 저장하는 코드를 작성해보겠습니다.

1 ) node-schedule

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분마다 현재 시간을 저장하는 작업이 시작되었습니다.');

2 ) cron

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분마다 현재 시간을 저장하는 작업이 시작되었습니다.');
profile
함께 개선하는 프론트엔드 개발자

0개의 댓글