특정 시간에 이벤트 발생시키기 - Node.js
특정 시간에 이벤트를 발생시키는 모듈이 있다.
node-schedule
출처 : https://www.npmjs.com/package/node-schedule
간격 단위마다 이벤트를 발생시키기 위해서는 setInterval()
를 사용하면 된다. 하지만 매월 몇시 몇분에 발생
같은 이벤트를 구현하고 싶을 때 이 모듈을 사용할 수 있다.
설치
npm install node-schedule
Cron 표현식
이 모듈은 Cron 표현식으로 시간을 지정할 수 있다.
* * * * * *
┬ ┬ ┬ ┬ ┬ ┬
│ │ │ │ │ │
│ │ │ │ │ └ day of week (0 - 7) (0 or 7 is Sun)
│ │ │ │ └───── month (1 - 12)
│ │ │ └────────── day of month (1 - 31)
│ │ └─────────────── hour (0 - 23)
│ └──────────────────── minute (0 - 59)
└───────────────────────── second (0 - 59, OPTIONAL)
특수문자 의미
Cron 표현식에서 사용되는 특수 문자들이 있다.
-
*
모든 값을 의미한다. -
쉼표 (
,
)쉼표는 한 항목에 여러 목록을 입력할 때 사용된다. 예를 들어, 5 번째 필드 (요일)에 “MON, WED, FRI”를 사용하면 월요일, 수요일, 금요일을 의미한다.
-
하이폰 (
-
)하이폰은 범위를 정의한다. 예를 들어 2000-2010 년은 2000 년에서 2010 년 사이의 모든 연도를 나타낸다.
-
퍼센트 (
%
)명령에서 백분율 기호 (%)는 백 슬래시 ()로 이스케이프하지 않는 한 개행 문자로 변경되고 첫 번째 % 이후의 모든 데이터는 표준 입력으로 명령에 전송된다.
비표준 문자
다음은 비표준 문자이며 일부 cron 표현에만 사용할 수 있다.
이 node-schedule
에서는 W
, L
, #
은 지원하지 않는다.
-
L
‘L’은 ‘마지막(Last)’을 의미한다. day-of-week 필드에서 사용하면 주어진 달의 “지난 금요일”( “5L”)과 같은 구문을 지정할 수 있다. day-of-month 필드에서는 해당 월의 마지막 날을 지정한다.
-
W
W
문자는 day-of-month 필드에 사용할 수 있다. 이 문자는 주어진 요일에 가장 가까운 평일 (월 - 금)을 지정하는 데 사용한다. 예를 들어, “15W”를 day-of-month 필드의 값으로 지정하면 의미는 “매월 15 일 가장 가까운 평일” 이다. 그래서 15 일이 토요일이라면 14 일 금요일에 이벤트가 발생한다. 15 일이 일요일이면 16 일 월요일에 발생한다. 15 일이 화요일이면 15 일 화요일에 시작한다. 그러나 달의 값으로 “1W”를 지정하고 1 일이 토요일이면 월의 경계는 넘지 않기 때문에, 3일 월요일에 실행된다.W
문자는 하루 일만 지정할 수 있고, 목록이나 범위에서는 사용할 수 없다. -
해시 (
#
)#
은 요일 필드에 사용할 수 있으며 1에서 5 사이의 숫자가 와야한다. 주어진 달의 “두 번째 금요일”과 같은 구문을 지정할 수 있다. 예를 들어, 요일 필드에 “5 # 3”을 입력하면 매월 셋째 금요일이 된다. -
물음표 (
?
)*
대신에 day-of-month 또는 day-of-week 중 하나를 공백으로 남겨 둘 때 사용한다. 어떤 곳에서는 cron 데몬의 시동 시간으로 정의된다. 그래서 cron이 오전 8시 25 분에 시작되면? ? * * * *
가25 8 * * * *
로 업데이트되고 다시 시작할 때까지 매일 이 시간에 실행된다. -
슬래시 (
/
)슬래시를 간격과 결합하여 간격 값을 지정할 수 있다. 예를 들어, 분 필드의
* / 5
는 5 분마다 나타낸다.
출처 : https://en.wikipedia.org/wiki/Cron#CRON_expression
간단한 예제 - 1
매 10초마다 실행되는 스케줄이다.
const schedule = require('node-schedule');
const j = schedule.scheduleJob('10 * * * *', function(){
console.log('매 10초에 실행');
});
간단한 예제 - 2
var j = schedule.scheduleJob('0 17 ? * 0,4-6', function(){
console.log('일, 목, 금, 토 중 실행 날짜 17시 0분에 실행');
});
Date 기반 표현
Cron 기법을 사용하지 않고 싶다면 Date()
를 사용해 지정할 수도 있다.
var schedule = require('node-schedule');
var date = new Date(2019, 01, 17, 5, 30, 0);
var j = schedule.scheduleJob(date, function(){
console.log('The world is going to end today.');
});
스케줄 취소
등록한 스케줄을 취소하기 위해서는 cancel()
메소드를 사용할 수 있다.
j.cancel();