앞선 아티클에서, 타이머 함수와 관련된 예제를 실행시켜 보고 결과도 예측해 보았습니다. 예제와 결과, 그리고 초별 타임라인에서 함수가 실행되는 과정을 다시 한번 아래와 같이 살펴보겠습니다.
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 |
즉시 실행 |
1 | interval | 1초 간격으로 실행 |
1.5 | timeout | 1.5초 후 실행 |
2 | interval | 1초 간격으로 실행 |
2.5 |
함수를 위에서부터 죽 훑어볼까요? 어렵게 생각할 것 없습니다. 일단 위의 대부분의 함수가 초를 설정해 두었습니다. 그러면 뭐가 되었든 간에 immediate보다는 늦게 실행된다는 의미가 되겠네요. 그래서 const immediate 가 가장 먼저 실행되었습니다. const immediate2는 clearImmediate(immediate2)로 인해서 실행이 취소 됩니다. 이후는 각각의 파라미터로 전달된 시간의 흐름에 따라 실행됩니다.
시간이 조금 남는다면, 앞선 아티클에서 얘기한 호출 스택, 백그라운드, 태스크 큐와 연계 지어서 흐름을 만들어 보도록 합시다.
참고로 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 아티클의 후반부 내용을 다시 학습하고 연결해서 보시기 바랍니다.
'Programming > Node.js' 카테고리의 다른 글
4. Node 기능 살펴보기 (3) - 노드 내장 객체 : process 2 (0) | 2024.04.03 |
---|---|
4. Node 기능 살펴보기 (3) - 노드 내장 객체 : process 1 (0) | 2024.04.02 |
4. Node 기능 살펴보기 (3) - 노드 내장 객체 : 타이머 1 (1) | 2024.03.29 |
4. Node 기능 살펴보기 (3) - 노드 내장 객체 : console (0) | 2024.03.28 |
4. Node 기능 살펴보기 (3) - 노드 내장 객체 : global (0) | 2024.03.27 |