본문 바로가기

Programming/Node.js

4. Node 기능 살펴보기 (3) - 노드 내장 객체 : 타이머2

node js logo image

 

 

 

 

 

 

앞선 아티클에서, 타이머 함수와 관련된 예제를 실행시켜 보고 결과도 예측해 보았습니다. 예제와 결과, 그리고 초별 타임라인에서 함수가 실행되는 과정을 다시 한번 아래와 같이 살펴보겠습니다.

 

 

 

4. Node 기능 살펴보기 (3) - 노드 내장 객체 : 타이머 1

여기서 말하는 '타이머'라는 기능은, 우리가 익히 사용했던 setTimeout, setInterval, setImmediate 같은 함수를 의미합니다. 간단하게 살펴보도록 하겠습니다. · setTimeout(callback, ms) : 주어진 밀리초 이후에

nozeroslope.tistory.com

 

 

const timeout = setTimeout( () => {
    console.log('1.5초 후 실행');
}, 1500 );

const interval = setInterval( () => {
    console.log('1초 간격으로 실행')
}, 1000 );

const timeout2 = setTimeout( () => {
    console.log('실행되지 않음');
}, 3000 );

setTimeout( () => {
    clearTimeout(timeout2);
    clearInterval(interval);
}, 2500 );

const immediate = setImmediate( () => {
    console.log('즉시 실행');
} );

const immediate2 = setImmediate( () => {
    console.log('실행되지 않음');
} );

clearImmediate(immediate2);


/* 출력
즉시 실행
1초 간격으로 실행
1.5초 후 실행
1초 간격으로 실행
*/

 

 

 

실행 console
0 immediate
immediate2
즉시 실행
1 interval 1초 간격으로 실행
1.5 timeout 1.5초 후 실행
2 interval 1초 간격으로 실행
2.5 timeout2
interval
 

 

 

 

 


 

 

 

 

함수를 위에서부터 죽 훑어볼까요? 어렵게 생각할 것 없습니다. 일단 위의 대부분의 함수가 초를 설정해 두었습니다. 그러면 뭐가 되었든 간에 immediate보다는 늦게 실행된다는 의미가 되겠네요. 그래서 const immediate 가 가장 먼저 실행되었습니다. const immediate2clearImmediate(immediate2)로 인해서 실행이 취소 됩니다. 이후는 각각의 파라미터로 전달된 시간의 흐름에 따라 실행됩니다. 

 

시간이 조금 남는다면, 앞선 아티클에서 얘기한 호출 스택, 백그라운드, 태스크 큐와 연계 지어서 흐름을 만들어 보도록 합시다. 

 

 

1. Node.js 핵심 개념 이해 (2) - Event Driven, Context [2/2]

앞선 내용에서, 자바스크립트와 노드의 이벤트 관련 원리들에 대해서 기본적인 설명을 진행했습니다. 이번 아티클을 읽기 위한 사전 지식이니 혹시라도 기억이 나지 않는다면 다시 한번 살펴보

nozeroslope.tistory.com

 

 

 


 

 

 

참고로 setImmediate(callback)과 setTimeout(callback, 0)은 언뜻 같은 기능으로 동작하기 때문에 차이가 없어 보입니다. 하지만 결론만 이야기하면 "setImmediate(callback)이 setTimeout(callback, 0)보다 먼저 실행되는 경우가 있지만 - 항상 그런것은 아니다"라고 정리할 수 있겠습니다. 파일 시스템에 접근하거나 네트워킹과 같은 I/O 작업의 콜백 함수 안에서 타이머를 호출할 경우에는 setImmediate가 먼저 호출되죠.

 

하지만, 헷갈릴 가능성이 높으니 위의 내용은 참고만 하고 가능한 setTimeout(callback, 0)은 사용하지 않도록 하는 것이 좋습니다. 

 

 

 


 

 

 

이 부분은 아직 한번에 이해가 가지 않는 부분이니, async/await 부분을 충분히 다시 학습해 보겠습니다. 타이머 기능들은 콜백 기반의 API지만, 프로미스 방식을 사용할 수도 있습니다. 다만 프로미스 기반의 타이머는 노드 내장 객체가 아닌, 노드 내장 모듈의 일종입니다. 

 

 

import { setTimeout, setInterval } from 'timers/promises';

await setTimeout(3000);
console.log('3초 뒤 실행');

for await (const startTime of setInterval(1000, Date.now())){
    console.log('1초 간격 실행', new Date(startTime));
}

/* 출력
3초 뒤 실행
1초 간격 실행 2024-03-31T15:28:25.713Z
1초 간격 실행 2024-03-31T15:28:25.713Z
1초 간격 실행 2024-03-31T15:28:25.713Z
1초 간격 실행 2024-03-31T15:28:25.713Z
1초 간격 실행 2024-03-31T15:28:25.713Z....
(루프)
*/

 

 

위 코드를 보면, ES 모듈을 사용합니다. then 대신 await를 사용하기 위해서죠.(?) 일단 timers/promises 모듈에서는 setTimeout과 setInterval을 새롭게 제공합니다. setTimeout(밀리초)는 얼마나 기다릴지를 정합니다. setInterval(밀리초, 시작값)의 경우는 for await of 문법과 함께 사용합니다. 참고로 시작 값은 필수는 아닙니다. 

 

위 내용이 잘 이해가 가지 않을 경우, async/await 아티클의 후반부 내용을 다시 학습하고 연결해서 보시기 바랍니다.

 

 

 

2. Javascript ES2015 (7) - async/awiat [2/2]

앞선 아티클에서 살펴보았던 async/await 코드 예제를 조금 더 응용해 보겠습니다. async function findAndSaveUser(Useres) { try { let user = await Useres.findOne({}); user.name = 'zero'; user = await user.save(); user = await Useres.

nozeroslope.tistory.com