updated_at: 2025-09-22 11:00

Node.js Cron 완전 분석 가이드: node-cron vs cron

Node.js 환경에서 특정 시간에 또는 주기적으로 코드를 실행해야 하는 경우, 스케줄링 라이브러리는 필수적입니다. 그중 가장 널리 사용되는 두 라이브러리인 **node-cron**과 **cron**에 대해 설치부터 고급 사용법, 장단점, 그리고 어떤 상황에 어떤 라이브러리를 선택해야 하는지 상세하게 비교 분석하여 정리했습니다.


1. cron (cron.CronJob) - 전통적이고 안정적인 스케줄러

cron 패키지는 Node.js에서 오랫동안 사용되어 온 안정적이고 신뢰성 있는 스케줄링 라이브러리입니다. CronJob 생성자를 통해 작업을 명시적으로 생성하고 제어하는 방식을 사용합니다.

1.1. 설치 방법

npm install cron

1.2. 기본 사용법

cron 패키지는 CronJob 객체를 생성한 후, .start() 메서드를 호출하여 작업을 시작해야 합니다.

const CronJob = require("cron").CronJob;

// 매초 실행되는 CronJob 생성
// new CronJob('크론 표현식', 실행할 함수, 완료시 실행될 함수, 즉시 시작 여부, 타임존);
const job = new CronJob(
  "* * * * * *", // 6자리 표현식으로 매초 실행
  function () {
    console.log(`[cron] 매초 실행됩니다: ${new Date().toLocaleTimeString()}`);
  },
  null, // onComplete 콜백
  true, // true로 설정 시 job.start()를 호출하지 않아도 바로 시작
  "Asia/Seoul" // 타임존
);

console.log("[cron] 작업이 설정되었습니다.");
// 만약 네 번째 인자가 false였다면 아래와 같이 수동으로 시작해야 합니다.
// job.start();

1.3. 주요 특징 및 고급 사용법

  • 초 단위 스케줄링: * * * * * * 와 같이 6개의 필드를 사용하여 초 단위의 정밀한 스케줄링이 가능합니다.
  • 명시적인 작업 제어: 생성된 job 객체를 통해 스케줄을 수동으로 시작(job.start())하거나 중지(job.stop())할 수 있습니다.
  • 타임존 지원: 생성자의 마지막 인자에 'America/Los_Angeles'와 같은 IANA 타임존 형식을 지정할 수 있습니다.
  • 완료 콜백 (onComplete): 작업이 stop() 메서드로 중지되었을 때 실행되는 콜백 함수를 정의할 수 있습니다.
  • 다음 실행 시간 확인: job.nextDates() 메서드를 사용하여 다음 실행 예정 시간을 확인할 수 있습니다.

고급 사용 예제:

const job = new CronJob(
  "*/2 * * * * *", // 2초마다 실행
  function () {
    console.log(`2초마다 실행! 다음 실행 시간: ${this.nextDates()}`);
  },
  function () {
    // 이 작업이 stop()으로 중지되면 이 함수가 실행됩니다.
    console.log("작업이 중지되었습니다.");
  },
  false, // 수동으로 시작하기 위해 false로 설정
  "Asia/Seoul"
);

console.log("작업을 시작합니다.");
job.start();

// 10초 후에 작업을 중지시킵니다.
setTimeout(function () {
  console.log("10초가 지나 작업을 중지합니다.");
  job.stop();
}, 10000);

1.4. 장점

  • 안정성과 신뢰성: 오랫동안 사용되어 온 만큼 매우 안정적입니다.
  • 명시적인 제어: 작업을 객체로 생성하고 start(), stop()으로 명확하게 제어하여 코드의 흐름을 이해하기 쉽습니다.
  • 유연한 시간 설정: 크론 표현식 외에 JavaScript의 Date 객체를 전달하여 특정 시간에 한 번만 실행되는 작업을 만들 수도 있습니다.

1.5. 단점

  • 다소 번거로운 문법: node-cron에 비해 객체를 생성하고 시작 메서드를 호출하는 과정이 조금 더 길게 느껴질 수 있습니다.
  • 내장 오류 처리 부재: 실행 함수 내에서 발생하는 오류는 반드시 try...catch 등으로 직접 처리해야 합니다.

2. node-cron - 간결하고 현대적인 스케줄러

node-cron은 순수 자바스크립트로 작성된 가볍고 직관적인 API를 제공하는 현대적인 스케줄링 라이브러리입니다. 많은 개발자들이 간결함 때문에 선호합니다.

2.1. 설치 방법

npm install node-cron

2.2. 기본 사용법 및 파라미터

cron.schedule() 메서드 하나로 작업 예약이 완료됩니다.

cron.schedule(크론_시간, 실행할_함수, { 옵션 });

  • 첫 번째 인자 (크론_시간): '* * * * *' (매분)처럼 반복 시간을 지정하거나, '30 59 8 27 10 *'처럼 특정 시간에 한 번만 실행되는 작업을 동적으로 생성할 수 있습니다.
  • 두 번째 인자 (실행할_함수): 예약된 시간이 되었을 때 실행될 콜백 함수입니다.
  • 세 번째 인자 (옵션):
    • scheduled: true: true(기본값)는 생성 즉시 스케줄을 활성화합니다. false로 설정하면 나중에 task.start()를 호출해야만 시작됩니다.
    • timezone: 'Asia/Seoul': 서버 위치와 상관없이 모든 시간을 특정 타임존(예: 한국 시간) 기준으로 계산합니다. 시간 동기화가 중요한 서비스에서는 필수적인 옵션입니다.
const cron = require("node-cron");

cron.schedule(
  "* * * * *", // 매분 실행
  () => {
    console.log(
      `[node-cron] 매분 실행됩니다: ${new Date().toLocaleTimeString()}`
    );
  },
  {
    scheduled: true,
    timezone: "Asia/Seoul",
  }
);

console.log("[node-cron] 스케줄러가 실행 중입니다.");

2.3. 고급 기능: ScheduledTask를 이용한 동적 작업 제어

cron.schedule()을 호출하면 ScheduledTask라는 객체(리모컨)가 반환됩니다. 이 객체를 변수에 저장하면 스케줄을 동적으로 제어할 수 있습니다.

1. task.start(): 작업 시작 또는 재개

스케줄을 시작하거나, stop()으로 일시 정지된 작업을 다시 시작합니다.

console.log("작업을 정의하지만 아직 시작하지는 않습니다.");

const task = cron.schedule(
  "*/2 * * * * *",
  () => {
    console.log("2초마다 실행되는 중...");
  },
  { scheduled: false } // 중요: 처음에는 시작하지 않음
);

// 5초 후에 스케줄을 시작합니다.
setTimeout(() => {
  console.log("이제 작업을 시작합니다!");
  task.start();
}, 5000);

2. task.stop(): 작업 일시 정지

실행 중인 스케줄을 일시적으로 중지시킵니다. 작업은 메모리에 남아있어 나중에 start()로 재개할 수 있습니다.

let runCount = 0;
const task = cron.schedule("* * * * * *", () => {
  runCount++;
  console.log(`작업 실행! (횟수: ${runCount})`);

  if (runCount >= 5) {
    console.log("5번 실행되었으므로 스케줄을 중지합니다.");
    task.stop();
  }
});

3. task.destroy(): 작업 완전 삭제

stop()과 달리 스케줄을 완전히 제거하여 메모리에서 해제합니다. destroy() 호출 후에는 start()로 재개할 수 없습니다. 더 이상 필요 없는 작업을 정리하여 리소스를 확보할 때 사용합니다.

const task = cron.schedule("* * * * * *", () => {
  console.log("이 작업은 3.5초 후에 영원히 사라집니다...");
});

setTimeout(() => {
  console.log("스케줄을 완전히 제거합니다.");
  task.destroy();
}, 3500);

작업 제어 메서드 요약

메서드 설명 재시작 가능 여부 주요 용도
task.start() 스케줄을 시작하거나 재개합니다. - scheduled: false로 생성된 작업을 활성화하거나, stop()된 작업을 다시 실행할 때
task.stop() 스케줄을 일시 정지합니다. 작업은 메모리에 남아 있습니다. 가능 특정 조건 하에 작업을 잠시 멈추고 싶을 때
task.destroy() 스케줄을 완전히 제거하여 메모리에서 해제합니다. 불가능 작업이 영구적으로 더 이상 필요 없을 때 (리소스 관리)

2.4. 기타 편의 기능

  • 유효성 검사: cron.validate() 메서드를 제공하여 크론 표현식이 유효한지 미리 확인할 수 있습니다.
    const isValid = cron.validate("59 * * * *"); // true
    const isInvalid = cron.validate("60 * * * *"); // false (분은 0-59까지만 가능)
    console.log(`'59 * * * *' is valid: ${isValid}`);
    console.log(`'60 * * * *' is valid: ${isInvalid}`);
    

2.5. 장단점

  • 장점:
    • 간결함과 가독성: 코드가 매우 짧고 직관적이어서 빠르게 스케줄링 기능을 구현할 수 있습니다.
    • 편의 기능: 유효성 검사, 동적 작업 제어 등 개발 편의성을 높여주는 부가 기능을 제공합니다.
    • 제로 의존성: 순수 자바스크립트로 작성되어 다른 라이브러리에 대한 의존성이 없습니다.
  • 단점:
    • 오류 처리의 한계: 기본적인 오류 처리는 제공되지만, 복잡한 재시도 로직이나 로깅은 개발자가 직접 try...catch 구문을 작업 함수 내에 구현해야 합니다.

3. node-cron vs cron 핵심 비교

특징 cron (cron.CronJob) node-cron
문법 및 사용성 CronJob 객체를 생성하고 .start()로 수동 시작. 다소 장황하지만 명시적. cron.schedule() 메서드로 즉시 스케줄링. 매우 직관적이고 간결.
핵심 기능 초 단위 스케줄링, Date 객체 지원, 명시적 작업 제어에 강점. 크론 표현식 유효성 검사 등 다양한 편의 기능 제공.
작업 제어 job.start(), job.stop() 으로 제어. task.start(), task.stop(), task.destroy() 로 더 세밀한 제어 가능.
타임존 지원 생성자 인자로 타임존 전달. 안정적으로 동작. 옵션 객체로 타임존 전달. 사용이 간편.
오류 처리 내장 기능 없음. 전적으로 개발자의 try-catch에 의존. 기본적인 오류 처리를 제공하나, 견고한 로깅 및 재시도 로직은 직접 구현 필요.
의존성 luxon 등 최소한의 의존성을 가짐. 의존성 없는 순수 자바스크립트 라이브러리.
프로세스 종속성 Node.js 프로세스가 실행 중일 때만 작동. 앱이 중단되면 스케줄도 중지. cron과 동일하게 Node.js 프로세스에 종속적. 앱 재시작 시 스케줄이 초기화됨.

4. 어떤 것을 선택해야 할까? (결론)

두 라이브러리 모두 훌륭하며, 선택은 프로젝트의 요구사항과 개발자의 선호도에 따라 달라집니다.

  • cron (cron.CronJob)을 선택해야 하는 경우:

    • 초 단위의 매우 정밀한 스케줄링이 반드시 필요할 때
    • 오랜 기간 검증된 안정성과 신뢰성이 최우선 순위일 때
    • new 키워드를 사용한 명시적인 객체 생성 및 제어 방식을 선호할 때
  • node-cron을 선택해야 하는 경우:

    • 대부분의 일반적인 경우에 추천됩니다.
    • 빠르고 간결한 코드로 스케줄링 기능을 구현하고 싶을 때
    • 동적으로 생성/일시정지/삭제되는 작업과 같이 유연한 제어가 필요할 때
    • 마이크로서비스나 간단한 자동화 스크립트 등 가벼운 프로젝트에 적용할 때

현재 개발 트렌드와 사용 편의성을 고려할 때, 특별히 cron 라이브러리의 초 단위 스케줄링이 반드시 필요한 경우가 아니라면 node-cron이 더 나은 선택이 될 수 있습니다. 신규 프로젝트에서 node-cron을 사용하는 것은 매우 합리적인 결정입니다.

평점을 남겨주세요
평점 : 2.5
총 투표수 : 1

질문 및 답글