일전에 프론트 서버에서 10초마다 반복되는 api 호출을 구현했었다.
다음으로 구현해야 할 기능은 10초마다 호출되는 데이터에 error 데이터가 발생하면 유저에게 push 메세지가 발송된다.
문제
이 기능을 구현하다 보니 한 가지 문제가 있었다. 바로 유저가 실시간으로 데이터를 받는 시간이 서로 일치하지 않다는 것.
만약 앱이 리렌더링 되거나 새로고침되면 10초의 간격이 깨지고 다시 새로 데이터를 받고 0초부터 카운트가 시작된다. 그리고 10시 10분 10초에 접속한 사람은 20초, 30초마다 새로운 데이터를 받고, 10시 10분 15초에 접속한 사람은 25초, 35초마다 서로 다른 시간대에 데이터를 받게 된다. 이런 문제로 유저별로 error 메세지를 받는 시간이 조금씩 달라질 수 있었다.
이 문제를 어떻게 해결할까 고민했는데, 방법은 두 가지 정도였다.
1. 리덕스로 전역 상태에서 api 호출하기
- 이 방법은 리렌더링에는 영향을 덜 받겠지만 새로고침에는 여전히 영향을 받았다.
2. 백엔드 서버에서 api 반복 호출하기
- 백엔드 서버에서 api를 반복 호출해서 프론트로 보내주는 방법인데 websoket도 사용해야 하고 조금 복잡해 보였다. 그래도 이게 가장 알맞은 방법이라고 생각했다.
2번 방법으로 해결하고자 했고 백엔드 서버에서 setinterval로 쿼리나 api를 반복 호출하기로 했다.
근데 지인 개발자분이 백엔드 서버에서 구현할 거면 setinterval이 아닌 크론탭이 더 유용할 거라는 팁을 주셨다.
크론탭
크론탭은 리눅스에서 작동하는 스케줄러다. 컴퓨터 백그라운드에 있으면서 특정 시간에 특정 작업을 수행을 예약? 할 수 있다고 한다. 그렇기 때문에 매분 배초에 반복 작업을 예약할 수 있다.
크론탭 표현식
크론탭은 자바스크립트 정규표현식 처럼 시간을 조정할 수 있는 표현식이 있다. 총 7개 자릿수로 초, 분, 시, 일, 월, 요일, 년으로 이루어져 있다. 표현식을 정리해둔 블로그를 참고하면 좋다. 원하는 시간을 입력하면 표현식으로 바꿔주는 사이트도 있다.
보통은 seconds와 year을 생략하고 5자리로 사용한다.
내 경우에 10초마다 반복되어야 하기 때문에 아래와 같이 사용했다
*/10 * * * *
왜 크론탭을 사용하는가?
setinterval은 변수가 너무 많다. 프론트에서는 리렌더링이나 새로고침 등에 영향을 받았었다. 아무리 백엔드에서 구현한다고 하지만 고려하지 못한 변수가 있을 수도 있다. 근데 크론탭은 단순 10초 후 실행이 아니다. 매분 10초, 20초, 30초, 40초, 50초, 00초 실행하는 개념이다. 그렇기 때문에 모든 유저에게 동일한 데이터를 보여줄 수 있다.
node-cron
이 프로젝트의 경우 node.js로 백엔드 서버를 만들었기 때문에 node 서버에서 실행되는 크론 라이브러리를 사용했다.
node-cron
https://www.npmjs.com/package/node-cron
node-cron
A simple cron-like task scheduler for Node.js. Latest version: 3.0.2, last published: a year ago. Start using node-cron in your project by running `npm i node-cron`. There are 980 other projects in the npm registry using node-cron.
www.npmjs.com
정말 간단하게 사용할 수 있다. node-cron을 import하고 정규표현식과 실행 함수를 입력하면 끝!
var cron = require('node-cron');
cron.schedule('*/10 * * * *', () => {
console.log('api 호출');
});
--
생각해 보면 예전에 누가 프론트에서 시간 관련된 로직이나 new Data()를 사용한 시간 비교를 절대 하지 말라고 했었던 것 같다. 사용자가 컴퓨터 시간을 조작할 수 있기 때문에 위험하다고. 블로그를 쓰다가 이제서야 그 생각이 났다.
'프로그래밍⚡️ > server' 카테고리의 다른 글
맥북으로 우분투 부팅 USB 만들기 +usb 강제 초기화 (1) | 2024.05.04 |
---|---|
express에서 api 요청 병목 현상 해결하기 connection pool (2) | 2024.01.24 |
자작 나스 만들기 - 소프트웨어편(헤놀로지) (0) | 2023.08.13 |
자작 nas 만들기 - 하드웨어편 (0) | 2023.08.12 |
나름 정리해 본 GraphQL, REST 개념 (0) | 2023.01.23 |