Node.js Microtask Queue 정리
핵심 요약
•
Node.js는 메인 코드 실행 후, Microtask Queue를 모두 비운 다음에 Macrotask Queue를 처리한다.
•
Microtask Queue에는 Promise.then / Promise.catch / Promise.finally 와 queueMicrotask 로 등록한 작업만 들어간다.
•
await도 내부적으로는 Promise 기반이라 Microtask로 동작한다.
이벤트 흐름
1.
메인 코드 실행
2.
비동기 작업 (Promise, queueMicrotask 등) 등록
3.
메인 코드 종료
4.
Microtask Queue 완전히 비우기
5.
Macrotask Queue (setTimeout, setImmediate, I/O 완료 콜백 등) 처리
Microtask Queue에 들어가는 작업 종류
작업 | Microtask 여부 |
Promise.then / .catch / .finally | |
queueMicrotask | |
setTimeout | |
setImmediate | |
파일 읽기, 네트워크 요청 완료 |
실제 테스트 코드
console.log('start');
setTimeout(() => {
console.log('timeout1');
}, 0);
Promise.resolve().then(() => {
console.log('promise1');
});
setTimeout(() => {
console.log('timeout2');
}, 0);
queueMicrotask(() => {
console.log('microtask1');
});
Promise.resolve().then(() => {
console.log('promise2');
queueMicrotask(() => {
console.log('microtask2');
});
});
(async () => {
await null;
console.log('await1');
})();
console.log('end');
JavaScript
복사
실제 실행 결과
start
end
promise1
microtask1
promise2
await1
microtask2
timeout1
timeout2
Plain Text
복사
추가 중요한 포인트
•
Microtask 안에서 또 Microtask를 등록하면, 기존 Microtask가 모두 끝난 후 다음 틱에 실행된다.
•
Promise.then은 Microtask에 즉시 등록되지만, Promise 안에서 queueMicrotask를 등록하면 다음 Microtask 틱으로 밀린다.
최종 요약
"Node.js는 메인 코드 실행 → Microtask Queue 모두 소화 → 그 다음 Macrotask를 처리한다.
Microtask 안에서 또 Microtask를 등록하면, 기존 Microtask가 모두 끝난 후에 실행된다."