cron과 node-schedule이란?

cronnode-schedule은 Node.js 애플리케이션에서 정해진 시간에 특정 작업을 실행할 수 있게 해주는 스케줄링 라이브러리입니다. 이메일 발송, 데이터베이스 백업, 알림 전송 등 주기적으로 수행해야 하는 작업에 매우 유용합니다.

주요 차이점

1. 문법과 사용 방식

cron은 유닉스 crontab 문법을 직접적으로 사용합니다:

const cron = require('cron');

// 매일 오전 10시 30분에 실행
const job = new cron.CronJob('30 10 * * *', function() {
  console.log('매일 오전 10시 30분에 실행되는 작업입니다.');
});

job.start();

node-schedule은 더 유연한 자바스크립트 객체 기반 문법을 제공합니다:

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

// 매일 오전 10시 30분에 실행
const job = schedule.scheduleJob('30 10 * * *', function() {
  console.log('매일 오전 10시 30분에 실행되는 작업입니다.');
});

2. 기능의 차이

node-schedule:

  • 날짜 객체를 직접 사용할 수 있음
  • 복잡한 스케줄링 규칙 지원
  • 작업 취소 및 재스케줄링이 편리함

cron:

  • 더 가벼운 라이브러리
  • 유닉스 crontab 문법에 익숙한 사용자에게 직관적
  • 타임존 지원이 내장되어 있음

3. 날짜 객체 사용 예시

node-schedule에서는 Date 객체를 직접 사용할 수 있습니다:

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

// 특정 날짜와 시간에 실행
const date = new Date(2025, 2, 20, 15, 30, 0);
const job = schedule.scheduleJob(date, function() {
  console.log('2025년 3월 20일 오후 3시 30분에 실행됩니다.');
});

cron에서는 Date 객체를 직접 사용할 수 없고, cron 표현식을 사용해야 합니다:

const cron = require('cron');

// 특정 날짜와 시간을 cron 표현식으로 표현해야 함
const job = new cron.CronJob('0 30 15 20 3 *', function() {
  console.log('2025년 3월 20일 오후 3시 30분에 실행됩니다.');
}, null, true, 'Asia/Seoul');

실제 사용 예시: 일일 보고서 생성

cron을 사용한 예시

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

// 매일 밤 12시에 보고서 생성
const dailyReport = new cron.CronJob('0 0 0 * * *', function() {
  const today = new Date();
  const reportData = `일일 보고서 - ${today.toLocaleDateString()}`;
  
  fs.writeFile(`report-${today.toISOString().split('T')[0]}.txt`, reportData, (err) => {
    if (err) throw err;
    console.log('일일 보고서가 생성되었습니다.');
  });
}, null, true, 'Asia/Seoul');

dailyReport.start();

node-schedule을 사용한 예시

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

// 매일 밤 12시에 보고서 생성
const dailyReport = schedule.scheduleJob('0 0 0 * * *', function() {
  const today = new Date();
  const reportData = `일일 보고서 - ${today.toLocaleDateString()}`;
  
  fs.writeFile(`report-${today.toISOString().split('T')[0]}.txt`, reportData, (err) => {
    if (err) throw err;
    console.log('일일 보고서가 생성되었습니다.');
  });
});

어떤 라이브러리를 선택해야 할까요?

cron을 선택하면 좋은 경우:

  • 유닉스 crontab 문법에 익숙한 경우
  • 타임존 지원이 중요한 경우
  • 가벼운 라이브러리가 필요한 경우

node-schedule을 선택하면 좋은 경우:

  • 날짜 객체로 직접 스케줄링하고 싶은 경우
  • 복잡한 스케줄링 규칙이 필요한 경우
  • 작업 취소나 재스케줄링이 자주 필요한 경우

결론

두 라이브러리 모두 Node.js에서 작업 스케줄링을 위한 훌륭한 도구입니다. 간단한 주기적 작업이라면 어떤 라이브러리를 선택하든 큰 차이가 없지만, 프로젝트의 특성과 개발자의 선호도에 따라 선택하면 됩니다. cron은 유닉스 스타일의 간결한 문법을 제공하고, node-schedule은 더 유연하고 자바스크립트 친화적인 인터페이스를 제공합니다.

초보자의 경우, 자바스크립트 객체를 직접 다룰 수 있는 node-schedule이 조금 더 이해하기 쉬울 수 있습니다. 하지만 장기적으로는 두 라이브러리의 문법을 모두 알아두면 다양한 상황에 대응할 수 있습니다.

728x90

1. 데이터베이스 스케줄러 개요

데이터베이스 스케줄러는 특정 시간이나 주기적으로 데이터베이스 작업을 자동으로 실행하는 도구입니다. 이는 데이터 관리, 성능 최적화, 보고서 생성 등 다양한 목적으로 사용됩니다.

1.1 스케줄러의 주요 기능

  • 정기적인 데이터 정리 및 아카이빙
  • 주기적인 통계 및 보고서 생성
  • 데이터베이스 유지보수 작업 자동화
  • 데이터 백업 및 복구 프로세스 관리

2. MySQL에서의 스케줄러 구현

MySQL에서는 이벤트 스케줄러를 통해 예약된 작업을 실행할 수 있습니다.

2.1 이벤트 스케줄러 활성화

먼저, MySQL 서버에서 이벤트 스케줄러를 활성화해야 합니다:

SET GLOBAL event_scheduler = ON;

 

2.2 이벤트 생성 예시

다음은 매일 자정에 30일 이상 된 로그를 삭제하는 이벤트 예시입니다:

DELIMITER //
CREATE EVENT daily_log_cleanup
ON SCHEDULE EVERY 1 DAY
STARTS '2024-07-25 00:00:00'
DO
BEGIN
    DELETE FROM logs WHERE created_at < DATE_SUB(NOW(), INTERVAL 30 DAY);
END //
DELIMITER ;

 

2.3 이벤트 관리

이벤트 조회 / 삭제 / 수정

//이벤트 조회
SHOW EVENTS;

//이벤트 삭제
DROP EVENT IF EXISTS daily_log_cleanup;

//이벤트 수정
ALTER EVENT daily_log_cleanup
ON SCHEDULE EVERY 2 DAY
ENABLE;

 

3. 스케줄러 활용 사례

3.1 주기적인 데이터 집계

매주 월요일 새벽 2시에 주간 판매 통계를 생성하는 예시:

DELIMITER //
CREATE EVENT weekly_sales_summary
ON SCHEDULE EVERY 1 WEEK
STARTS '2024-07-29 02:00:00'
DO
BEGIN
    INSERT INTO sales_summary (week, total_sales)
    SELECT 
        YEARWEEK(order_date) as week,
        SUM(total_amount) as total_sales
    FROM orders
    WHERE order_date >= DATE_SUB(CURDATE(), INTERVAL 7 DAY)
    GROUP BY YEARWEEK(order_date);
END //
DELIMITER ;

 

3.2 데이터베이스 최적화

DELIMITER //
CREATE EVENT monthly_db_optimization
ON SCHEDULE EVERY 1 MONTH
STARTS '2024-08-01 03:00:00'
DO
BEGIN
    -- 모든 테이블 최적화
    DECLARE done INT DEFAULT FALSE;
    DECLARE tbl_name VARCHAR(255);
    DECLARE cur CURSOR FOR SELECT table_name FROM information_schema.tables WHERE table_schema = DATABASE();
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

    OPEN cur;
    read_loop: LOOP
        FETCH cur INTO tbl_name;
        IF done THEN
            LEAVE read_loop;
        END IF;
        SET @stmt = CONCAT('OPTIMIZE TABLE ', tbl_name);
        PREPARE stmt FROM @stmt;
        EXECUTE stmt;
        DEALLOCATE PREPARE stmt;
    END LOOP;
    CLOSE cur;
END //
DELIMITER ;

매월 1일 새벽 3시에 데이터베이스 최적화를 수행하는 예시:

4. 스케줄러 사용 시 주의사항

  1. 리소스 관리: 스케줄된 작업이 시스템 리소스를 과도하게 사용하지 않도록 주의해야 합니다.
  2. 실행 시간 고려: 피크 시간을 피해 스케줄을 설정하는 것이 좋습니다.
  3. 오류 처리: 스케줄된 작업에 적절한 오류 처리 로직을 포함해야 합니다.
  4. 로깅: 스케줄된 작업의 실행 결과를 로깅하여 모니터링해야 합니다.
  5. 보안: 중요한 데이터를 다루는 스케줄된 작업의 경우 보안에 특히 주의해야 합니다.

5. 결론

데이터베이스 스케줄러는 반복적이고 시간 기반의 데이터베이스 작업을 자동화하는 강력한 도구입니다. MySQL의 이벤트 스케줄러를 활용하면 데이터 관리, 성능 최적화, 보고서 생성 등 다양한 작업을 효율적으로 수행할 수 있습니다.

스케줄러를 적절히 활용함으로써 데이터베이스 관리자와 개발자는 반복적인 작업에서 해방되어 더 중요한 업무에 집중할 수 있습니다. 또한, 일관성 있는 데이터 관리와 시스템 성능 유지에 큰 도움이 됩니다.

그러나 스케줄러 사용 시에는 시스템 리소스, 실행 시간, 오류 처리, 보안 등 여러 측면을 고려해야 합니다. 신중한 계획과 모니터링을 통해 스케줄러를 효과적으로 활용한다면, 데이터베이스 관리의 효율성과 안정성을 크게 향상시킬 수 있을 것입니다.

728x90

+ Recent posts