본문 바로가기
  • 개발 / 공부 / 일상
Node.js

(Node.js) node-cron 라이브러리

by JJeongHyun 2024. 2. 23.
반응형

● 순서


1. 라이브러리 설치

2. node-cron 설정

3. node-cron 실행 및 적용

1. 라이브러리 설치

  • npm i -D node-cron으로 라이브러리를 설치해 준다
npm i -D node-cron

2. node-cron 설정

  • 서버가 작동하면서 실행되는 server.ts라는 최상단 서버파일에 라이브러리를 실행해 준다
import cron from 'node-cron';

cron.schedule('0 0 * * *', () => {
    console.log("실행")
});
  • schedule 메서드를 호출해서 첫 번째 인자에 실행할 주기를 설정할 수 있다
    • 설정 주기 순 - 초(옵션)/분/시/날짜/월/요일
  • 현재 기준은 매일 0시 00분에 실행하는 주기로 설정했다
  • 만약 매초 마다 하고 싶다면 * * * * * * 처럼 6개를 설정하면 된다

3. node-cron 실행

  • Ex)
    • 특정 플랫폼에서 회원탈퇴 기능을 추가
    • 회원탈퇴 시 90일 동안 다시 회원가입을 할 수 없으며, 매일 일일이 수동으로 확인하고 회원정보를 지울 수 없다
    • 따라서 node-cron이라는 라이브러리를 사용해 매일 0시 00분에 90일이 지난 회원정보들을 지워버린다

3-1. server.ts

// server.ts
import cron from 'node-cron';

import connectToDB from './utils/connectToDB';
import isWithdrawDB from './utils/withdrawDB';

/*
    ... 생략 ...
*/

connectToDB(false);

cron.schedule('0 0 * * *', () => isWithdrawDB());

// ... 생략 ...

3-2. withDrawDB

import { Op } from 'sequelize';

import WithdrawDetail from '../../models/withdrawDetail';
import User from '../../models/user';

const KOREA_OFFSET = 9 * 60 * 60 * 1000;

const isWithdrawDB = async () => {
  try {
    const korNow = new Date(new Date().getTime() + KOREA_OFFSET);

    korNow.setDate(korNow.getDate() - 90);
    const isExpire = await WithdrawDetail.findAll({
      where: {
        updatedAt: {
          [Op.lt]: korNow,
        },
      },
      attributes: ['id', 'userId'],
    });
    if (isExpire.length)
      isExpire.forEach(async (item) => {
        await WithdrawDetail.destroy({ where: { id: item.id } });
        await User.destroy({ where: { id: item.userId } });
      });
  } catch (error) {
    console.log(error);
  }
};
export default isWithdrawDB;
  • 탈퇴내역 테이블에서 90일이 지난 데이터가 있으면 해당하는 유저의 정보와 탈퇴정보들을 삭제한다