출처: 매일 메일
자바스크립트의 이벤트 루프는 자바스크립트가 싱글 스레드 기반 언어임에도 불구하고 비동기 작업을 처리할 수 있게 해주는 중요한 메커니즘이다.
자바스크립트는 기본적으로 한 번에 하나의 작업만 처리할 수 있다. 하지만 이벤트 루프가 콜 스택(Call Stack)과 태스크 큐(Task Queue)를 관리하면서 비동기 작업이 완료되면 그 결과를 처리할 수 있게 도와준다.
이벤트 루프의 동작을 설명하기 위해 간단한 예로 setTimeout(callback, 0)을 들어보자.
setTimeout(callback, 0)을 호출하면, 이 콜백 함수는 바로 실행되는 것이 아니라 웹 API에 의해 타이머가 설정된다.callback을 꺼내서 실행한다.따라서 setTimeout(callback, 0)을 호출해도 현재 실행 중인 모든 동기 작업들이 완료된 후에야 그 콜백이 실행된다. 이 때문에 setTimeout(callback, 0)을 사용하면 코드의 실행을 다음 이벤트 루프 사이클로 미룰 수 있다.
태스크 큐는 크게 매크로태스크 큐(Macro Task Queue)와 마이크로태스크 큐(Micro Task Queue)로 나뉜다.
setTimeout, setInterval 같은 일반적인 비동기 작업들이 대기한다.Promise.then()과 같이 중요도가 높은 작업들이 대기한다.이벤트 루프 덕분에 자바스크립트는 UI 업데이트나 사용자 입력 처리를 수행하면서도, 비동기 작업을 블로킹 없이 병렬적으로 처리할 수 있다.
console.log('Start');
setTimeout(() => {
console.log('Macro Task');
}, 0);
Promise.resolve().then(() => {
console.log('Micro Task');
});
console.log('End');
'Start'와 'End'가 출력된다.Promise.then)가 실행되어 'Micro Task'가 출력된다.setTimeout)가 실행되어 'Macro Task'가 출력된다.이처럼 태스크 큐는 크게 마이크로태스크 큐와 매크로태스크 큐로 이루어져 있으며, 마이크로태스크 큐 작업은 매크로태스크 큐 작업보다 우선적으로 실행된다.