01 · Concept

이벤트 루프 (Event Loop)

이벤트 루프는 JavaScript의 비동기 실행을 관리하는 핵심 메커니즘입니다. 콜 스택, 마이크로태스크 큐, 태스크 큐의 상호작용을 이해하는 것이 중요합니다.

JavaScript는 싱글 스레드 언어이지만, 이벤트 루프를 통해 비동기 작업을 효율적으로 처리합니다. 콜 스택이 비면 이벤트 루프가 마이크로태스크 큐를 먼저 확인하고, 그 다음 태스크 큐에서 작업을 꺼내 실행합니다. Promise.then setTimeout의 실행 순서가 다른 이유가 바로 이것입니다.

02 · Interactive Demo

이벤트 루프 시각화

시나리오를 선택하고 단계별로 진행하여 콜 스택, 마이크로태스크 큐, 태스크 큐의 변화를 관찰하세요.

Step 1 / 9
스크립트 실행 시작 — 전역 실행 컨텍스트가 콜 스택에 푸시됩니다.
Call Stack
전역 실행 컨텍스트
Microtask Queue
(비어있음)
Promise.then, queueMicrotask
Task Queue
(비어있음)
setTimeout, setInterval
코드
console.log("1");

setTimeout(() => {
  console.log("2");
}, 0);

Promise.resolve().then(() => {
  console.log("3");
});

console.log("4");
Console
단계를 진행하여 실행 결과를 확인하세요
03 · Code Example

코드 예시

실제 코드로 동작 원리를 확인하세요.

// 콜 스택은 현재 실행 중인 함수를 추적합니다.
// LIFO(Last In, First Out) 구조입니다.

function first() {
  console.log("first 시작");
  second();               // second()가 콜 스택에 push
  console.log("first 끝"); // second() 완료 후 실행
}

function second() {
  console.log("second 시작");
  third();                // third()가 콜 스택에 push
  console.log("second 끝");
}

function third() {
  console.log("third");   // 가장 위에서 실행 후 pop
}

first();
// 출력: first 시작 → second 시작 → third
//       → second 끝 → first 끝
04 · Interview Point

면접 핵심 질문

이벤트 루프는 JavaScript의 비동기 실행 메커니즘입니다. JavaScript는 싱글 스레드 언어이므로 한 번에 하나의 작업만 실행할 수 있습니다. 이벤트 루프는 콜 스택이 비어있는지 확인하고, 비어있다면 먼저 마이크로태스크 큐의 모든 작업을 처리한 후, 태스크 큐(매크로태스크 큐)에서 하나의 작업을 꺼내 콜 스택에 올립니다. 이 과정을 무한히 반복하여 비동기 코드의 실행 순서를 관리합니다. 브라우저에서는 렌더링도 이 루프 사이에 끼어들어 requestAnimationFrame 콜백이 실행됩니다.
마이크로태스크 Promise.then, queueMicrotask, MutationObserver 등에 의해 생성되며, 현재 실행 중인 태스크가 끝나면 즉시, 큐가 완전히 빌 때까지 모두 실행됩니다.

매크로태스크(태스크) setTimeout, setInterval, I/O 콜백 등에 의해 생성되며, 이벤트 루프 한 바퀴에 하나씩만 실행됩니다. 따라서 마이크로태스크는 항상 다음 매크로태스크보다 먼저 처리됩니다. 마이크로태스크 내에서 새 마이크로태스크를 생성하면 그것도 같은 사이클에 처리되므로 무한 루프에 주의해야 합니다.
console.log, setTimeout, Promise가 혼합된 코드의 실행 순서:

1. 동기 코드가 먼저 실행됩니다 — 콜 스택에서 즉시 처리. 2. setTimeout은 콜백을 태스크 큐에 등록만 합니다. 3. Promise.then은 콜백을 마이크로태스크 큐에 등록합니다. 4. 동기 코드가 모두 끝나면 마이크로태스크 큐를 먼저 비웁니다. 5. 마지막으로 태스크 큐의 콜백이 실행됩니다.

핵심: 동기 > 마이크로태스크 > 매크로태스크 순서이며, 이는 이벤트 루프의 우선순위 규칙에 의한 것입니다.