1. Cron 이란?
어느 작업을 특정한 간격이나 시간, 날짜에 반복해서 수행하고 싶을 때 사용하는 것이 스케줄러입니다.
저는 프로젝트를 하다 매일 특정 시간마다 함수를 실행하여 MySQL의 쿼리를 실행하여 테이블을 업데이트 하고 싶었습니다.
예를 들면 매일 4시간 간격으로 사용자 인풋을 체크하여, 인풋에 따라 테이블을 자동으로 4시간마다 업데이트하는 요구사항이 있었습니다.
이 때 사용한 것이 바로 Cron 입니다.
Cron은 유닉스 계열 컴퓨터 운영 체제의 시간 기반 Job 스케줄러입니다. 소프트웨어 환경을 설정하고 관리하는 사람들은 작업을 고정된 시간, 날짜, 간격에 주기적으로 실행할 수 있도록 스케줄링하기 위해 cron을 사용합니다.
https://www.npmjs.com/package/node-cron
저는 node에서 작업하고 있기 때문에 node-cron 을 사용하였습니다.
node-cron 설치
npm install --save node-cron
모듈을 설치한 이후에, schedule 변수에 모듈을 아래와 같이 require 해줍니다.
const cron = require('node-cron');
2. node-cron 사용
설치가 완료되면 해당 NodeJS 프로젝트에서 node-cron 모듈을 사용할 수 있습니다. 저는 테스트를 위해 index.js 파일에서 실행하였습니다.
var cron = require('node-cron');
cron.schedule('* * * * *', () => {
console.log('node-cron 실행 테스트');
});
콜백 함수 안에 실행할 작업을 작성하면 됩니다. ' * * * * * ' 을 적용하게 되면 매 1분마다 콜백함수를 실행하게 됩니다.
3. Scheduling 사용하기
node-cron 모듈은 GNU crontab을 기반으로 하는 node.js용 순수 자바 스크립트의 가벼운 작업 스케줄러입니다. 이 모듈을 사용하면 전체 crontab 구문을 사용하여 node.js에서 작업을 예약할 수 있습니다.
* 대신에 들어갈 값은 다음과 같습니다.
field | value |
second | 0-59 |
minute | 0-59 |
hour | 0-23 |
day of month | 1-31 |
month | 1-12 (or names) |
day of week | 0-7 (or names, 0 or 7 are Sunday) |
허용되는 값은 위와 같으며 아래 사이트에서도 쉽게 crontab 구문을 만들 수가 있습니다.
Using multiples values
콤마(,)를 사용해 다중 값을 사용할 수 있습니다.
// 다중 값 사용
var cron = require('node-cron');
cron.schedule('1,2,4,5 * * * *', () => {
console.log('매 1, 2, 4, 5분 마다 실행');
});
Using ranges
값의 범위를 사용할 수 있습니다.
// 범위 값 사용
var cron = require('node-cron');
cron.schedule('1-5 * * * *', () => {
console.log('매 1-5분 마다 실행');
});
Using step values
숫자 범위와 '/' 다음에 숫자와 함께 사용할 수 있습니다.
// 숫자 범위 + / + 숫자
var cron = require('node-cron');
cron.schedule('1-10/2 * * * *', () => {
console.log('매 2,4,6,8,10분 마다 실행');
});
Using names
month와 week day 항목에는 이름이나 약어를 사용할 수 있습니다.
// 이름 사용
var cron = require('node-cron');
cron.schedule('* * * January,September Sunday', () => {
console.log('1월과 9월의 일요일 마다 실행');
});
// 약어 사용
var cron = require('node-cron');
cron.schedule('* * * Jan,Sep Sun', () => {
console.log('1월과 9월의 일요일 마다 실행');
});
4. Scheduling 취소
var cron = require('node-cron');
var task = cron.schedule('* * * * *', () => {
console.log('will execute every minute until stopped');
});
task.stop();
다시 시작하지 않으면 스케줄링 해둔 작업이 실행되지 않습니다.
5. node-cron 에서 사용할 수 있는 옵션
- scheduled: 작업이 예약되도록 하는 boolean 타입, default는 true로 설정되어 있다고 합니다.
- timezone: 시간대 설정입니다. 저는 Seoul 시간대를 사용하였기 때문에 아래와 같이 세팅해주었습니다.
var cron = require('node-cron');
cron.schedule('0 1 * * *', () => {
console.log('Running a job at 01:00 at Asia/Seoul');
}, {
scheduled: true,
timezone: "Asia/Seoul"
});
6. 제가 사용한 프로젝트 예시
var cron = require('node-cron');
cron.schedule('0 0-23/4 1-31 * *', [사용할 콜백함수],
{
timezone: "Asia/Seoul"
});
사용할 콜백함수를 Controller에 지정해두고, Controller에서 사용할 쿼리를 정의해준 뒤, 마지막으로 Controller를 사용하는 route에 위의 cron 스케줄링을 이용하여 매일 4시간마다 콜백함수를 사용할 수 있도록 해줬습니다.
'Back-end > Node.js' 카테고리의 다른 글
[Node.js] 사용량 제한 구현하기 (0) | 2021.06.14 |
---|---|
[Node.js] JWT 토큰으로 인증하기 (0) | 2021.06.14 |
[Node.js]body-parser 미들웨어의 urlencoded( )의 역할 (0) | 2021.06.10 |
댓글