#1. 배치 프로세스와 스케쥴러
1. 배치 프로세스와 스케쥴러
1) 배치 프로세스와 스케쥴러의 개념
구분 | 설명 |
배치 프로세스 | 흐름에 따라 순차적으로 자료를 처리하는 프로그램 |
스케쥴러 | 정해진 시간에 따라 특정 함수나 특정 프로그램을 자동으로 싱핼하게 하는 기능 |
- 일반적으로 스케쥴러란 사전에 설정된 시간에 준비된 배치 프로그램을 자동으로 실행시키는 기능을 의미한다.
- 실무에서는 배치 + 스케쥴러를 묶어서 배치 스케쥴러하고 표현한다.
- 배치 프로세스, 스케쥴러, 배치 등도 일반적으로는 특정 시간에 자동으로 수행되는 기능들을 의미하는 용어로 통용된다.
2) 사용 예시
- 30일 후에 자동으로 삭제되는 기능
- 배치 프로세스가 매일 자정에 삭제 예약이 된지 30일이 경과한 모든 값을 찾아서 삭제하도록 구현
- 메일링 리스트와 같이 전체 회원을 대상으로 하는 기능
- 전체 회원에 대한 동작을 데이터베이스에 등록하면 스케쥴러가 1초 혹은 5초 마다 데이터를 스캔하여 등록된 데이터가 있을 경우 전체 회원에게 순차적으로 수행
2. 구현 방법
1) 패키지 설치
- 일반적으로 스케쥴러는 날짜, 시간에 대한 핸들링이 요구되기 때문에 dayjs와 함께 사용한다.
npm install --save node-schedule
npm install --save dayjs
또는
yarn add node-schedule
yarn add dayjs
2) 사용 방법
// ES5 문법
// const schedule = require('node-schedule');
// ES6 문법
import schdule from 'node-schedule';
schedule.scheduleJop(특정시각|시간규칙, function() {
.. 수행할 기능 ..
};
- 특정 시각은 지정된 시간이 되었을 때 1회만 실행한다.
- 시간규칙
- 시간간격: 5분마다, 1시간마다
- 스케쥴: 매일 n시 n분
3) 사용 예시
// 특정 시각에 한번만 수행되는 예약작업
// (1) 필요한 패키지 참조하기
import dayjs from 'dayjs';
import schedule from 'node-schedule';
// (2) 예약 작업이 실행될 시간
// 현재시각
const atTime = dayjs();
console.log(atTime.format('HH:mm:ss'));
// 5초후 시각
const afTime = atTime.add(5, 'second');
console.log(afTime.format('HH:mm:ss'));
// (3) 5초 후에 자동으로 실해되는 예약 작업을 생성
// js의 Date 객체를 추출
const jsDate = afTime.toDate();
schedule.scheduleJob(jsDate, () => {
console.log('5초 후 예약된 작업이 수행되었습니다.');
});
console.log(afTime.format('HH:mm:ss') + ' 에 작업이 예약되었습니다.');
// 스케쥴에 따른 자동 수행
// (1) 필요한 패키지 참조하기
import logger from "../helper/logHelper.js";
import schedule from "node-schedule";
// (2) 매 분 10초 마다 수행
const rule1 = new schedule.RecurrenceRule();
rule1.second = 10;
schedule.scheduleJob(rule1, () => {
logger.debug(`[rule1] 매분 ${rule1.second}초 마다 수행`)
});
// (3) 매 시간 분, 초 마다 수행
const rule2 = new schedule.RecurrenceRule();
rule2.minute = 42;
rule2.second = 5;
schedule.scheduleJob(rule2, () => {
logger.debug(`[rule2] 매 시간 ${rule2.minute}분 ${rule2.second}초 마다 수행`)
});
// (4) 매일 시,분,초 마다 수행
const rule3 = new schedule.RecurrenceRule();
rule3.hour = 20; // 시간은 0~24
rule3.minute = 42;
rule3.second = 10;
schedule.scheduleJob(rule3, () => {
logger.debug(`[rule3] 매일 ${rule3.hour}시 ${rule3.minute}분 ${rule3.second}초 마다 수행`)
});
// (5) 일주일 중 0요일을 기준으로 1번째~6번째 요일까지 (0 == sun, 6 == sat)
const rule4 = new schedule.RecurrenceRule();
rule4.dayOfWeek = [0, new schedule.Range(1,6)];
rule4.second = 15;
schedule.scheduleJob(rule4, () => {
logger.debug(`[rule4] 매 주 월~토, 매 분 ${rule4.second}초 마다 실행`)
});
logger.info("예약작업이 설정되었습니다.");
3. Crontab 표현식
1) Crontab
- 리눅스나 Mac 운영체제 자체적으로 제공하는 스케쥴러 기능(터미널 명령어)
https://crontab.guru 에서 표현식을 생성할 수 있다.
2) 표현식 예시
의미 | 표현식 |
매 1분 마다 | * * * * * |
매시 15분과 45분에 | 15,45 * * * * |
10분 마다 | */10 * * * * |
매일 02시 15분에 | 15 2 * * * |
매일 0시 정각에 | 0 0 * * * |
매 6시간 마다 (ex. 00:30, 06:30, 12:30, 18:30) | 30 */6 * * * |
1시 부터 23시까지 매 4시간 마다 (ex. 01:30, 05:30, 09:30, 12:30, 16:30, 20:30) |
30 1-23/4 * * * |
평일 (월~금) 08:00에 수행 | 0 8 * * 1-5 |
주말(일, 토) 08:00 | 0 8 * * 0,6 |
// Crontab 스타일의 스케쥴 지정
// (1) 필요한 패키지 참조하기
import logger from '../helper/logHelper.js';
import schdule from 'node-schedule';
// (2) 매 분 마다 수행
schdule.scheduleJob('* * * * *', () => logger.debug('1분에 한번씩 수행'));
// (3) 매 시 15, 45분 마다 수행
schdule.scheduleJob('15,45 * * * *', () => logger.debug('매 시 15, 45분 마다 수행'));
// (4) 2분마다 수행
schdule.scheduleJob('*/2 * * * *', () => logger.debug('2분마다 한번씩 수행'));
logger.info('예약작업이 설정되었습니다.');
'국비수업 > Node.js' 카테고리의 다른 글
[Node.js] HTTP Server (0) | 2022.06.28 |
---|---|
[Node.js] HTTP Client (0) | 2022.06.27 |
[Node.js] Log (0) | 2022.06.27 |
[Node.js] Event / File Input Output (0) | 2022.06.24 |
[Node.js] Node Modules (0) | 2022.06.23 |