실시간 자동화 프로그램을 하던 중,
어떻게 하면 서버가 계속 실행되도록 만들까? 하는 의문점에 직접 검색도 해보고 친구들에게 물어도 봤다.
실시간 자동화 프로그램이라는 것은, 사실 실시간으로 서버가 계속 구동된다기보다는,
매일매일 무언가를 업데이트 해주기 위해서 특정한 시간에 같은 일을 실행시키는 구도로
이른바 '배치' 라는 기능을 통해 프로그램을 만든다.
node.js에서는 SQL문을 사용해 배치 기능을 사용하던 다른 언어와 달리, 라이브러리를 이용하여 편하게 프로그래밍이 가능하도록 도와준다.
node.js에서 배치기능을 사용할 수 있는 라이브러리는 크게 3가지이다.
- agenda
- node-cron
- node-schedule
이 중, node-cron과 node-schedule 가 node.js의 대표적인 배치 라이브러리이다.
둘 다 npm을 이용해서 다운 받을 수 있다.
사실 cron과 node-schedule 간의 차이는 별로 없다. 둘다 cron 방식으로 배치데이터를 돌린다.
이런식으로 초 분 시간 일 달 년 요일 로 나누어 특정한 날에 맞추어서 구현이 가능하다.
cron.schedule을 기준으로 했을 때로 예시를 들어보자면,
cron.schedule("* * * * * *")
이 예시는, 매 초마다 실행하겠다는 뜻이다.
우리가 만약, 매일 12:00 에 코드를 실행시키고 싶다면
cron.schedule(0 12 1-31 * * )
이렇게 초를 생략하고 5개의 옵션만 주어도 무관하다. (초가 필요하지 않을 경우)
이 코드는 0분 12시 1일부터-31일까지(매일) 코드를 실행시킨다는 의미이다.
그러면, 매일 3시간 마다 코드를 실행시키려면 어떻게 해야할까?
cron.schedule(0 0-23/3 1-31 * * )
이렇게 해주면, 3시간마다 코드가 실행된다. 0-23은 23시간을 뜻하고 3으로 나누면 어느 시점이든 3시간마다 실행이 될것이다.
이렇게 응용해서 특정 시간별로 서버를 실행할 수 있다.
'*' : 모든 값
'?' : 특정한 값이 없음
'-' : 범위
ex) MON-FRI
',' : 특정한 값일 때만 동작
ex) MON, WED, FRI
'/' : 시작시간 / 단위
ex) 0분부터 매 30분인 경우, 0/30
'L' : 마지막 일 또는 마지막 요일
'W' : 가장 가까운 평일
ex) 10W는 10일에서 가장 가까운 평일 (MON ~ FRI)
'#' : 요일#주차
ex) 3#2, 둘째 주 수요일
와일드 카드도 적절히 사용하면 될 것 같다.
평일 오전 10시에 실행하고 싶다면,
const schedule = require('node-schedule');
const job = schedule.scheduleJob('0 0 10 * * MON-FRI', fucntion() {
console.log(new Date());
});
이렇게 MON-FRI로 가능하다.
나같은 경우에는 PM2 를 이용하여, 서비스 제공 도중 서버가 중지되어도 서버를 다시 재실행할 수 있게 구현 후,
PM2 에 있는 스케줄링으로 실시간 자동화를 하였다.
'NodeJS' 카테고리의 다른 글
node.js - PM2 프로세스 매니저로 무중단 서비스 (typescript 연동) (0) | 2023.02.20 |
---|---|
node.js - fs module (파일시스템 모듈) (0) | 2023.02.19 |