특정시간에 함수를 실행시키는 방법 (Node-Schedule)

주형(Jureamer)·2022년 5월 26일
1

개요


정기적으로 반복해야할 함수가 있다면 node-schedule을 통해 구현할 수 있다.

비슷한 기능을 가진 모듈로는 crone, toad-scheduler, agenda 등의 비슷한 기능을 가진 모듈도 있다고 한다.(써보진 않음)

"이 함수를 5분마다 실행시켜줘!"라고 한다면 toad-scheduler가 더 나을 수도 있다.

하지만 "이 함수를 매 달 세번 째 화요일의 매 20분, 50분 마다 실행켜줘"라는 복잡한 일정을 담는다면 node-scheduler가 우리 요구사항을 더 충족시켜줄 것이다.

사내에서 현재 node-schedule 모듈을 쓰고 있지만, 서버의 꺼짐 유무 등과 같은 상황에 따라 다른 대체재들을 고려해볼 수도 있을 것 같다.

Jobs and Scheduling


node-schedule에서 예약하려는 모든 일들을 Job 객체라 부른다.
Job 객체EventEmiiter이며, 아래 이벤트들을 실행시킨다.

  • run : Job 실행 뒤에 발생하는 이벤트
  • scheduled: Job이 예약되었을 때의 이벤트
  • canceled: Job이 실행되기 전 취소되었을 때의 이벤트.
    "L"이 하나라는 걸 주의하자
  • error: Job에 에러가 발생했을 때의 이벤트
  • success: Job이 성공했을 때의 이벤트

설치


npm install node-schedule

시간 설정 방식


포맷은 아래와 같고, * 표시는 all을 의미한다.


기호의 의미


node-schedule에서 지원이 되지않는 `W`, `L`, `#`은 생략한다.
  • 물음표 (?)
    day-of-month 또는 day-of-week 중 하나를 공백으로 남겨둘 때 사용한다. 어떤 곳에서는 cron 데몬의 시동 시간으로 정의되어, 오전 8시 25분에 시작된다면 ? ? * * * *
    25 8 * * * *로 업데이트 되고 다시 시작할 때까지 매일 이 시간에 실행된다.

  • 슬래시 (/)
    슬래시를 간격과 결합하여 간격 값을 지정할 수 있다. 예를 들어, 분 필드의 * / 5 는 5 분마다 나타낸다.

  • *
    모든 값을 의미한다.

  • 하이픈 (-)
    하이픈은 범위를 정의한다. 예를 들어 2000-2010년은 2000년에서 2010년 사이의 모든 연도를 나타낸다.

  • 퍼센트 (%)
    백 슬래시() 이스케이프 하지 않는 한 개행 문자로 변경되어, 첫 번째 %이후의 모든 데이터는 표준 입력으로 명령에 전송된다.

예시


1. 매 10초마다 실행되는 스케줄

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

const j = schedule.scheduleJob('10 * * * * *, function() {
	console.log("매 10초마다 실행");
});

2. 매 셋째 주 금요일 8시마다 실행되는 스케줄

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

const j = schedule.scheduleJob('* 8 * * 5#3', function() {
	console.log("매 셋째 주 금요일 8시마다 실행");
});

3. Date 기반 표현(crone의 역순)

const schedule = require('node-schedule');
const date = new Date(2012, 11, 21, 5, 30, 0);
const j = schedule.scheduleJob(date, function() {
	console.log("2012-11-21, 05:30에 실행");
});

4. Recurrence Rule 기반 표현

const schedule = require('node-schedule');
const rule = new schedule.RecurrenceRule();

// 배열 방식
rule.dayOfWeek = [0, 1, 2];
rule.hour = 17;
rule.minute = 0;

const job = schedule.scheduleJob(rule, function(){
  console.log('배열방식: 일요일, 월요일, 화요일 17:00에 실행');
  
// 객체 방식
const job = schedule.scheduleJob({hour: 17, minute: 0, dayOfWeek: [0, 1, 2]}, function(){
  console.log('객체방식: 일요일, 월요일, 화요일 17:00에 실행');
});
  • RecurrenceRule 프로퍼티
    - second (0-59)
    - minute (0-59)
    - hour (0-23)
    - date (1-31)
    - month (0-11)
    - year
    - dayOfWeek (0-6) Starting with Sunday
    - tz

4. Job 종료

j.cancel();

그 외에도 여러가지 식이 있는데 아마 대부분 위의 룰에서 쓰지 않을까 싶다.
더 자세한 룰은 npm 공식 페이지를 통해 확인이 가능하다.

참고

profile
작게라도 꾸준히 성장하는게 목표입니다.

1개의 댓글

comment-user-thumbnail
2023년 10월 17일

매 10초마다 하려면 */10 로 해야합니다.

답글 달기