노드에서 셋 인터벌을 쓸 수 있구나
dev | 2018-08-11
정리하고 나니 좀 창피하기도 한데, 나한테는 솔직히 문화적인 충격 비슷한 일이었다.
원격 프로세스의 종료 이벤트를 알 수 없어서 폴링으로 목록을 계속 보면서 끝났는지 확인해야 하는 상황이 발생했다. 처음에는 크론으로 자바스크립트 파일을 실행하면서 확인할까 하다가 배치 태스크가 추가되는 일은 피하고 싶어졌다. 노드에서 크론탭을 관리하는 모듈이 있지 않을까 node cron으로 검색해보니 있었다. 실제로 크론탭을 관리하는 것은 아니고 크론 처럼 작동하는 모듈이다. 이 모듈을 검색해보니 아웃사이더님 블로그로 연결됐고 아웃사이더님은 node-schedule을 사용하신다길래 문서를 살펴봤다. 날짜가 지정된 일에는 이 모듈이 좋지만 그냥 정해진 간격으로 반복해서 일을 할때는 셋 인터벌(setInterval)을 쓰라고 나와있었다.
'셋 인터벌?'
내가 짰던 서버 스크립트는 대부분 시작하면 바로 처리 끝나고 프로세스가 내려가는 것들이어서 이게 무슨 의미인지 바로 알아채지 못했다. 브라우저 런타임이라면 바로 알았겠지만 말이다. 익스프레스에서 포트를 리슨하고 있으니 프로세스가 계속 떠있고 셋 타임아웃도 작동될 수 있다는 것을 조금 후에 이해 했다. '이전에는 왜 이 생각을 못했지'라는 생각과 'PHP만 너무 해서 시야가 좁아진 것이가'라는 생각과 '노드가 편하긴 하구나' 등 다양한 생각이 들었다.
익스프레스를 안써도 프로세스가 계속 떠있는지 보려고 아래와 같이 실행해 봤는데 의도한대로 잘 된다. 신세계다. 하지만 셋 인터벌은 역시 정확한 타이밍에 실행되지 않는다는 것도 명백히 보여줬다.
setInterval(() => console.log(new Date()), 1000);
셋 인터벌이 없어지면 바로 종료되는지도 해봤다. 의도한대로 잘 된다.
let count = 1;
const timer = setInterval(() => {
if (count > 9) {
clearInterval(timer);
}
console.log(count++);
}, 1000);
아무튼 주기적으로 뭔가 해야 할때 너무 쉽게 할 수 있는 방법을 알게 되어서 좋다. 관련 문서도 읽어보고 반성도 약간 했다.
Comments
제가 언급되어 약간 더 설명 드리면 node 프로세스는 이벤트풀에 이벤트가 있으면 프로세스가 죽지 않습니다.