웹사이트 검색

Node.js에서 예약된 작업을 실행하기 위해 node-cron을 사용하는 방법


소개

cron은 특정 시간 간격으로 작업을 반복하는 방법을 제공합니다. 매일 또는 매주 또는 매월 발생해야 하는 로깅 및 백업 수행과 같은 반복 작업이 있을 수 있습니다.

Node.js 서버에서 cron을 구현하는 한 가지 방법은 node-cron 모듈을 사용하는 것입니다. 이 라이브러리는 이전에 Unix 계열 운영 체제에서 cron을 사용한 경험이 있는 사용자에게 친숙한 crontab 구문을 사용합니다.

이 기사에서는 node-cron을 사용하여 서버에서 로그 파일을 주기적으로 삭제합니다. 또한 데이터베이스 백업 및 예약된 이메일 전송이라는 두 가지 다른 일반적인 사용 사례도 제공됩니다.

전제 조건

이 자습서를 따르려면 다음이 필요합니다.

  • Node.js용 로컬 개발 환경입니다. Node.js 설치 및 로컬 개발 환경 생성 방법을 따르십시오.

이 튜토리얼은 Node v17.2.0, npm v8.1.4, node-cron v2.0.3, shelljs v0.8.4 및 nodemailer v6.7.2.

1단계 — 노드 애플리케이션 생성 및 종속성 설치

시작하려면 터미널을 열고 프로젝트의 새 폴더를 만들어 새 노드 애플리케이션을 만듭니다.

  1. mkdir node-cron-example

다음으로 새 프로젝트 디렉터리로 변경합니다.

  1. cd node-cron-example

그런 다음 초기화하면 종속성을 추적하는 데 사용할 package.json 파일이 생성됩니다.

  1. npm init --yes

다음 명령을 실행하여 node-cron 모듈을 추가합니다.

  1. npm install node-cron@3.0.0

node-cron 모듈은 작업 스케줄러입니다.

프로젝트 종속성이 설치됩니다. 서버를 구축합시다.

2단계 - 작업 예약

이제 서버를 구축하고 node-cron을 사용하여 작업이 매분 실행되도록 예약할 수 있습니다.

cron-ping.js 파일을 만듭니다.

  1. nano cron-ping.js

그런 다음 node-cron을 요구합니다.

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

다음으로 cron-ping.js에 다음 코드 줄을 추가합니다.

// ...

// Schedule tasks to be run on the server.
cron.schedule('* * * * *', function() {
  console.log('running a task every minute');
});

이러한 별표는 다양한 시간 단위를 나타내는 crontab 구문의 일부입니다.

  * * * * * *
  | | | | | |
  | | | | | day of week
  | | | | month
  | | | day of month
  | | hour
  | minute
  second ( optional )

단일 별표는 와일드카드처럼 작동합니다. 해당 시간 단위의 모든 인스턴스에 대해 작업이 실행됨을 의미합니다. 5개의 별표(* * * * *)는 crontab 기본값인 매분 실행을 나타냅니다.

별표 자리의 숫자는 해당 시간 단위의 값으로 취급됩니다. 매일 및 매주 또는 더 복잡한 작업이 발생하도록 예약할 수 있습니다.

참고: Cron을 사용하여 VPS에서 작업을 자동화하는 방법에서 이 표기법이 작동하는 방식에 대해 자세히 알아보십시오.

이제 스크립트를 실행합니다.

  1. node cron-ping.js

몇 분이 지나면 다음과 같은 결과가 나타납니다.

Output
running a task every minute running a task every minute running a task every minute ...

매분 실행되는 예시 작업이 있습니다. CTRL+C(CONTROL+C)를 사용하여 서버를 중지할 수 있습니다.

이제 작업을 실행하는 방법을 자세히 살펴보겠습니다.

3단계 - 오류 로그 삭제

매월 21일에 정기적으로 서버에서 로그 파일을 삭제해야 하는 시나리오를 고려하십시오. node-cron으로 이를 수행할 수 있습니다.

error.log라는 예제 로그 파일을 만듭니다.

  1. nano error.log

그런 다음 테스트 메시지를 추가합니다.

This is an example error message that in a log file that will be removed on the twenty-first day of the month.

cron-delete.js 파일을 만듭니다.

  1. nano cron-delete.js

이 작업은 fs를 사용하여 파일을 연결 해제합니다. 파일 맨 위에 추가하십시오.

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

다음으로 다음 코드 줄을 추가합니다.

// ...

// Remove the error.log file every twenty-first day of the month.
cron.schedule('0 0 21 * *', function() {
  console.log('---------------------');
  console.log('Running Cron Job');
  fs.unlink('./error.log', err => {
    if (err) throw err;
    console.log('Error file successfully deleted');
  });
});

패턴에 주목하세요: 0 0 21 * *.

  • 분과 시간 값을 00("00:00” - 하루의 시작)으로 정의합니다.
  • 일 값을 21로 정의합니다.
  • 월이나 요일을 정의하지 않습니다.

이제 스크립트를 실행합니다.

  1. node cron-delete.js

매월 21일에는 다음과 같은 결과가 표시됩니다.

Output
--------------------- Running Cron Job Error file successfully deleted

작업이 실행되었는지 확인하기 위해 매월 21일을 기다리고 싶지 않을 것입니다. 매분과 같이 더 짧은 시간 간격으로 실행되도록 스케줄러를 수정할 수 있습니다.

서버 디렉토리를 확인하십시오. error.log 파일이 삭제됩니다.

스케줄러 내에서 모든 작업을 실행할 수 있습니다. 파일 생성에서 이메일 전송 및 스크립트 실행에 이르는 다양한 작업. 더 많은 사용 사례를 살펴보겠습니다.

4단계 - node-cron을 사용하여 데이터베이스 백업 탐색

사용자 데이터의 보존을 보장하는 것은 모든 비즈니스의 핵심입니다. 예상치 못한 이벤트가 발생하여 데이터베이스가 손상되거나 손상된 경우 백업에서 데이터베이스를 복원해야 합니다. 비즈니스에 대한 기존 백업 형태가 없다면 심각한 문제에 처하게 될 것입니다.

매일 오후 11시 59분에 데이터베이스 덤프를 정기적으로 백업해야 하는 시나리오를 고려하십시오. node-cron으로 이를 수행할 수 있습니다.

참고: 이 사용 사례는 로컬 SQLite 데이터베이스 설정을 수반합니다. 데이터베이스 설치 및 생성에 대한 자세한 내용은 여기에서 다루지 않습니다. 다른 쉘 명령으로 자유롭게 대체하십시오.

환경에 SQLite가 설치되어 실행 중이라고 가정합니다. database.sqlite라는 데이터베이스가 주어지면 데이터베이스 백업을 위한 셸 명령은 다음과 유사할 수 있습니다.

  1. sqlite3 database.sqlite .dump > data_dump.sql

이 명령은 database.sqlite 데이터베이스를 가져와 .dump 명령을 실행하고 결과를 data_dump.sql 파일로 출력합니다.

다음으로 이전 셸 명령을 실행할 수 있는 노드 모듈인 shelljs를 설치합니다.

  1. npm install shelljs@0.8.4

cron-dump.js 파일을 만듭니다.

  1. nano cron-dump.js

그런 다음 shelljs를 요구합니다.

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

다음으로 다음 코드 줄을 추가합니다.

// ...

// Backup a database at 11:59 PM every day.
cron.schedule('59 23 * * *', function() {
  console.log('---------------------');
  console.log('Running Cron Job');
  if (shell.exec('sqlite3 database.sqlite .dump > data_dump.sql').code !== 0) {
    shell.exit(1);
  }
  else {
    shell.echo('Database backup complete');
  }
});

패턴: 59 23 * * *에 주목하십시오.

  • 분 값을 59로 정의합니다.
  • 시간 값을 23(또는 24시간제에서 오후 11시)로 정의합니다.
  • 일, 월 또는 요일을 정의하지 않습니다.

이 코드는 백업 셸 명령을 실행합니다. 성공하면 메시지를 에코합니다. 그렇지 않고 오류가 있으면 종료됩니다.

이제 스크립트를 실행합니다.

  1. node cron-dump.js

오후 11시 59분에 다음과 같은 결과가 표시됩니다.

Output
--------------------- Running Cron Job Database backup complete

작업이 실행되었는지 확인하기 위해 오후 11시 59분을 기다리고 싶지 않을 것입니다. 더 짧은 시간 간격으로 실행되도록 스케줄러를 수정할 수 있습니다.

서버 디렉토리를 확인하십시오. data_dump.sql 파일이 있을 것입니다.

다음으로 정기 이메일을 보내는 방법을 살펴보겠습니다.

5단계 - node-cron을 사용하여 예약된 이메일 보내기 탐색

흥미로운 링크 목록을 선별한 다음 매주 수요일 구독자에게 이메일로 보내는 시나리오를 생각해 보십시오. node-cron으로 이를 수행할 수 있습니다.

Nodemailer는 Ethereal Email에서 제공하는 테스트 계정을 지원합니다. Ethereal 계정을 만들고 생성된 사용자 이름과 암호를 사용하십시오.

경고: 이 단계에서는 개인 이메일 계정을 사용하지 않는 것이 좋습니다. 개인 이메일 계정에 대한 위험을 방지하려면 새로운 별도의 테스트 계정을 사용하는 것이 좋습니다.

다음으로 이메일을 보낼 수 있는 노드 모듈인 nodemailer를 설치합니다.

  1. npm install nodemailer@6.7.2

cron-mail.js 파일을 만듭니다.

  1. nano cron-mail.js

그런 다음 nodemailer를 요구합니다.

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

메일러를 정의하고 이메일 계정의 사용자 이름과 비밀번호를 설정하는 섹션을 추가합니다.

// ...

// Create mail transporter.
let transporter = nodemailer.createTransport({
  host: 'your_demo_email_smtp_host.example.com',
  port: your_demo_email_port,
  auth: {
    user: 'your_demo_email_address@example.com',
    pass: 'your_demo_email_password'
  }
});

경고: 이 단계는 예시 목적으로만 제공됩니다. 프로덕션 환경에서는 환경 변수를 사용하여 암호를 비밀로 유지합니다. GitHub와 같은 코드 리포지토리에 업로드하는 코드에 암호(자격 증명)를 저장하지 마십시오.

다음으로 다음 코드 줄을 추가합니다.

// ...

// Sending emails every Wednesday.
cron.schedule('0 0 * * 3', function() {
  console.log('---------------------');
  console.log('Running Cron Job');

  let messageOptions = {
    from: 'your_demo_email_address@example.com',
    to: 'your_demo_email_address@example.com',
    subject: 'Scheduled Email',
    text: 'Hi there. This email was automatically sent by us.'
  };

  transporter.sendMail(messageOptions, function(error, info) {
    if (error) {
      throw error;
    } else {
      console.log('Email successfully sent!');
    }
  });
});

패턴: 0 0 * * 3에 주목하십시오.

  • 분과 시간 값을 00("00:00” - 하루의 시작)으로 정의합니다.
  • 일 또는 월을 정의하지 않습니다.
  • 요일 값을 3(수요일)로 정의합니다.

이 코드는 제공된 자격 증명을 사용하여 자신에게 이메일을 보냅니다. 제목 줄: 예약 이메일 및 본문 텍스트: 안녕하세요. 이 이메일은 저희가 자동으로 보냈습니다.. 그렇지 않고 실패하면 오류를 기록합니다.

이제 스크립트를 실행합니다.

  1. node cron-mail.js

수요일에는 다음과 같은 결과가 표시됩니다.

Output
--------------------- Running Cron Job Email successfully sent!

작업이 실행되었는지 확인하기 위해 수요일까지 기다리기를 원하지 않을 것입니다. 더 짧은 시간 간격으로 실행되도록 스케줄러를 수정할 수 있습니다.

Ethereal 이메일 사서함을 엽니다. 받은 편지함에 새 예약 이메일이 있을 것입니다.

결론

이 기사에서는 node-cron을 사용하여 Node.js 서버에서 작업을 예약하는 방법을 배웠습니다. 일관되고 예측 가능한 방식으로 반복 작업을 자동화하는 광범위한 개념을 소개받았습니다. 이 개념은 현재 및 향후 프로젝트에 적용할 수 있습니다.

사용 가능한 다른 작업 스케줄러 도구가 있습니다. 특정 프로젝트에 가장 적합한 도구를 식별하기 위해 평가해야 합니다.

Node.js에 대해 자세히 알아보려면 Node.js 주제 페이지에서 실습 및 프로그래밍 프로젝트를 확인하세요.