Node.js 인터뷰 질문 4
질문: Node.js의 이벤트 루프란 무엇인가요?
답변:
이벤트 루프는 Node.js의 핵심 메커니즘으로, 비동기 I/O 작업을 효율적으로 처리하고 단일 스레드 환경에서 논 블로킹 작업을 가능하게 합니다.
이벤트 루프의 작동 방식
단계(Phases): 이벤트 루프는 여러 단계로 구성되어 있으며, 각 단계는 특정 작업을 처리합니다:
- 타이머(Timers):
setTimeout()
,setInterval()
콜백 실행 - 보류 중인 콜백(Pending Callbacks): 이전 반복에서 지연된 I/O 콜백 실행
- 유휴/준비(Idle, Prepare): 내부용
- 폴링(Poll): 새로운 I/O 이벤트 검색 및 실행
- 확인(Check):
setImmediate()
콜백 실행 - 종료 콜백(Close Callbacks):
socket.on('close', ...)
같은 종료 이벤트 콜백 실행
- 타이머(Timers):
큐(Queues): 각 단계는 실행할 콜백 함수들의 FIFO(First In, First Out) 큐를 가지고 있습니다.
반복(Tick): 이벤트 루프의 한 번의 완전한 실행을 '틱(tick)'이라고 합니다.
작동 원리 예시
console.log("시작");
setTimeout(() => {
console.log("타이머 1 완료");
}, 0);
setImmediate(() => {
console.log("즉시 실행");
});
Promise.resolve().then(() => {
console.log("프로미스 완료");
});
process.nextTick(() => {
console.log("nextTick 완료");
});
console.log("종료");
출력 결과:
시작
종료
nextTick 완료
프로미스 완료
타이머 1 완료
즉시 실행
이벤트 루프의 중요 개념
- microtasks:
process.nextTick()
과 프로미스 콜백은 각 단계 사이에 처리되는 '마이크로태스크'입니다. - libuv: Node.js의 이벤트 루프는 C 라이브러리인 libuv에 의해 구현됩니다.
- 논 블로킹: 이벤트 루프 덕분에 I/O 작업이 완료될 때까지 기다리지 않고 다른 작업을 수행할 수 있습니다.
이벤트 루프를 이해하면 Node.js 애플리케이션의 비동기 동작을 보다 효과적으로 관리하고, 최적화할 수 있습니다.