#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 운영체제 자체적으로 제공하는 스케쥴러 기능(터미널 명령어)

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

+ Recent posts