Node.js가 싱글 스레드임에도 불구하고 수천 개의 동시 접속을 효율적으로 처리할 수 있는 비밀은 바로 이벤트 루프에 있습니다. 이벤트 루프는 메인 스레드(Call Stack)가 비어있는지를 지속적으로 감시하고, 백그라운드 작업이 완료되어 큐(Queue)에 등록된 콜백 함수들을 순차적으로 실행 공간(Call Stack)으로 밀어 올리는 심장과 같은 역할을 수행합니다.
우선순위에 따른 큐(Queue)의 종류
Node.js의 큐는 단일한 큐가 아니라 실행 타이밍과 우선순위에 따라 여러 종류로 나뉩니다. 가장 대표적인 두 가지를 비교해 보겠습니다.
마이크로태스크 큐가 완전히 비워진 후(고갈 상태)에만 이벤트 루프가 접근하여 하나씩 꺼내 실행합니다.
이벤트 루프 실행 순서 완벽 정복
아래 코드는 동기 작업, 마이크로태스크(Promise), 매크로태스크(setTimeout)가 섞여 있을 때의 극단적인 시나리오입니다. 작성된 코드의 순서와 상관없이, Node.js의 이벤트 루프 우선순위에 의해 실행 결과가 완전히 뒤바뀌는 것을 콘솔 출력에서 확인할 수 있습니다.