이벤트 루프는 JavaScript의 비동기 동작의 핵심입니다. JavaScript는 단일 스레드로 동작하는 언어이기 때문에, 한 번에 하나의 작업만을 처리할 수 있습니다. 그렇다면 어떻게 비동기 작업들을 관리하고 실행할까요? 바로 이벤트 루프를 통해 가능합니다.
이벤트 루프의 주된 역할은 실행 스택이 비어있는지 확인하고, 태스크 큐에 있는 작업을 실행 스택으로 가져와 실행하는 것입니다.
태스크 큐는 크게 두 부류로 나누어집니다: 매크로 태스크 큐와 마이크로 태스크 큐.
예시: setTimeout, setInterval, setImmediate, UI 렌더링 등
이벤트 루프는 매크로 태스크 큐에 있는 첫 번째 작업을 가져와 실행하고, 그 작업이 완료되면 다음 작업으로 넘어갑니다.
예시: Promise, MutationObserver, process.nextTick (Node.js 환경)
매크로 태스크 하나가 완료되면, 그 후 모든 마이크로 태스크가 실행됩니다. 즉, 모든 마이크로 태스크가 완료될 때까지 다음 매크로 태스크로 넘어가지 않습니다.
아래는 setTimeout과 Promise를 사용한 간단한 코드입니다.
console.log('Script 시작');
setTimeout(function() {
console.log('setTimeout 실행');
}, 0);
Promise.resolve().then(function() {
console.log('Promise 실행');
});
console.log('Script 종료');
출력결과 :
Script 시작
Script 종료
Promise 실행
setTimeout 실행
이렇게 이벤트 루프는 매크로와 마이크로 태스크 큐의 작업들을 순차적으로 실행하며, JavaScript 코드는 비동기적으로 동작하게 됩니다.
JavaScript의 이벤트 루프는 복잡한 비동기 작업을 단순화하여, 개발자들이 효율적인 코드를 작성할 수 있도록 돕습니다. 매크로 태스크와 마이크로 태스크의 개념을 이해하면 JavaScript의 동작 원리를 더 깊게 파악할 수 있으므로, 비동기 코드의 동작을 정확히 예측하고 최적화하는 데 도움이 됩니다.
REFERENCE
1. https://2014.jsconf.eu/speakers/philip-roberts-what-the-heck-is-the-event-loop-anyway.html
2. https://developer.mozilla.org/ko/docs/Web/JavaScript/EventLoop