생각해 보자 님의 블로그

node-cron: 왜 외부 스케줄러 대신 노드에서 직접 관리하는 것이 더 나을까? 본문

테크 지식

node-cron: 왜 외부 스케줄러 대신 노드에서 직접 관리하는 것이 더 나을까?

woohyuntak 2024. 12. 26. 17:39

 

1. node-cron이란?

node-cron은 Node.js 환경에서 주기적인 작업을 설정하고 실행할 수 있는 간단하고 가벼운 스케줄러이다. 유닉스 기반 시스템에서 주로 사용되는 cron 명령어의 기능을 그대로 Node.js에서 사용할 수 있도록 해주는 라이브러리로, 서버 측에서 정기적인 작업을 자동으로 처리할 수 있다.

기본적인 사용법은 아주 간단하다. 예를 들어, 매일 자정에 특정 작업을 실행하고 싶다면 아래와 같이 설정할 수 있다:

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

// 매일 자정에 작업 실행
cron.schedule('0 0 * * *', () => {
  console.log('매일 자정에 실행됩니다!');
});

2. 배경 - 스케줄링의 필요성

최근 진행 중인 프로젝트에서 매일 주기적으로 데이터베이스를 읽고, 특정 레코드에 관련된 사용자에게 알림을 생성하는 작업이 필요했다. 알림 시스템을 구현하면서, 자연스럽게 스케줄링에 대한 고민이 하게 되었다.

처음에는 단순히 매일 한 번씩 특정 작업을 실행하기 위한 목적이었지만, 프로젝트가 확장되면서 스케줄링의 중요성이 점점 커졌다. 예를 들어, 사용자에게 알림을 보내는 작업 외에도 주기적으로 데이터를 분석하거나, 외부 API에서 정보를 가져오는 등의 다양한 작업들이 추가될 가능성이 있었다. 이때마다 **어떤 방식으로 작업을 주기적으로 실행할 것인가?**에 대한 고민이 필요해졌다.

단기적인 목적은 알림 시스템이었지만, 추후 확장성을 고려한 스케줄링 방식에 대한 고민은 프로젝트 전반에 중요한 요소가 되었다.


3. 왜 node-cron을 사용했나? - 외부 스케줄러의 사용 시 고려할 점

프로젝트에서 스케줄링 기능을 구현해야 한다는 점은 명확했지만, 이를 위해 외부 스케줄러나 서비스를 사용할지, 아니면 서버 내에서 직접 처리할지를 결정하는 데 많은 고민이 있었다. 여러 대안들이 있었지만, 결국 node-cron을 선택한 이유는 다음과 같다.

  1. 외부 서비스 의존성
    AWS Lambda와 같은 외부 스케줄러를 사용할 경우, 네트워크 장애나 외부 서비스의 문제로 작업이 누락될 수 있다. 이러한 외부 의존성은 우리가 직접 관리할 수 없기 때문에 안정성 측면에서 불안정한 요소가 될 수 있다. node-cron은 서버 내에서 실행되므로, 외부 서비스에 의존하지 않고 모든 작업을 관리할 수 있다.
  2. 비용 문제
    AWS Lambda나 Google Cloud Scheduler는 사용량에 따라 비용이 발생한다. 매일 반복되는 작업이라면 비용이 계속 발생할 수 있어 예산에 부담이 될 수 있다. 반면, node-cron은 무료로 제공되며, 서버 내에서 직접 스케줄링을 처리하기 때문에 비용이 발생하지 않는다.
  3. 성능과 확장성
    데이터베이스 내장 스케줄러를 사용하면 DB 서버에 부하가 생길 수 있다. 특히 트래픽이 많아지면 성능 저하를 일으킬 위험이 있다. node-cron은 서버 내에서 작업을 처리하므로, 데이터베이스 성능에 영향을 미치지 않으며, 대규모 트래픽에도 확장성이 좋다.

이러한 이유들로, node-cron이 외부 스케줄러에 비해 더 적합한 선택으로 다가왔다. 외부 서비스 의존성, 비용 문제, 성능 등 여러 측면을 고려했을 때, node-cron이 가장 효율적이었다.


4. node-cron의 장점

node-cron을 사용한 결정에는 여러 장점이 있었다. 물론 몇 가지 단점도 있지만, 이를 보완할 수 있는 방법이 있기 때문에 큰 문제 없이 작업을 관리할 수 있었다.

장점

  1. 가벼운 라이브러리
    node-cron은 설치가 간편하고, 사용하기에도 매우 직관적이다. 복잡한 설정 없이 바로 사용할 수 있어 서버의 부하를 최소화하면서 필요한 작업을 처리할 수 있다.
  2. 유연한 스케줄링
    node-cron은 cron 표현식을 사용하여 매우 유연하게 작업을 예약할 수 있다. 예를 들어, 매일 자정, 매주 월요일, 매달 1일 등 다양한 시간대에 작업을 설정할 수 있어 주기적인 작업을 세밀하게 관리할 수 있다.
  3. 서버 내에서 관리 가능
    외부 서비스에 의존하지 않고 서버 내에서 작업을 관리할 수 있어, 네트워크 장애나 외부 서비스의 문제를 걱정할 필요가 없다. 모든 작업을 서버에서 처리하므로 더 안정적이고 효율적이다.
  4. 비용 절감
    node-cron은 무료로 제공되며, 별도의 비용이 들지 않는다. 매일 실행되는 작업이라도 비용이 발생하지 않기 때문에 예산을 아끼고, 장기적으로 운영비용을 절감할 수 있다.

단점 및 보완 방법

  1. 단일 서버 의존성
    단일 서버에서만 스케줄러가 동작하기 때문에, 서버 장애가 발생하면 스케줄러 작업이 멈출 수 있다. 이를 해결하기 위해 서버 클러스터링이나 장애 대응 시스템을 마련하는 방법이 필요할 수 있다.
  2. 확장성 문제
    매우 많은 스케줄러 작업을 처리해야 하는 경우, 서버 성능에 영향을 미칠 수 있다. 이럴 경우, 별도의 작업 큐 시스템을 도입하거나, 여러 서버에서 분산 처리하는 방법을 고려할 수 있다.