댓글을 작성하려면 로그인이 필요합니다.
아직 작성된 댓글이 없어요. 첫 댓글을 남겨주세요!

자바스크립트는 싱글 스레드이면서 논블로킹 언어이다.
자바스크립트는 비동기 처리를 통해 싱글 스레드이지만 블로킹 되지 않게 한다. 하나의 요청이 완료될 때까지 기다리지 않고 동시에 다른 작업을 수행함으로써 문제를 해결한다.
그렇다면 스레드가 하나인데 어떻게 다른 작업을 동시에 수행할 수 있는 걸까? 그 핵심에는 이벤트 루프가 있다.
setTimeout, fetch, DOM 이벤트 등은 JS 엔진이 아니라 브라우저가 제공하는 API이다.setTimeout, DOM 이벤트의 콜백 등이 여기에 들어간다.Promise.then, async/await의 콜백이 대기하는 공간이다.console.log("1");
setTimeout(() => {
console.log("2");
}, 0);
Promise.resolve().then(() => {
console.log("3");
});
console.log("4");
출력 결과: 1 → 4 → 3 → 2
console.log("1") → 콜 스택에서 바로 실행setTimeout → Web API에 넘기고, 콜백은 태스크 큐에 대기Promise.then → 콜백은 마이크로태스크 큐에 대기console.log("4") → 콜 스택에서 바로 실행"3" 먼저 실행"2" 실행코드 실행 → 콜 스택에서 처리
↓
비동기 작업 만남 → Web API에 위임
↓
Web API 처리 완료 → 콜백을 큐에 전달
- Promise 계열 → 마이크로태스크 큐
- setTimeout 등 → 태스크 큐
↓
이벤트 루프가 콜 스택이 비었는지 확인
↓
마이크로태스크 큐 먼저 → 태스크 큐 다음
자바스크립트는 싱글 스레드이면서 논블로킹 언어입니다. 싱글 스레드인 이유는 여러 스레드가 공유 자원에 동시에 접근하는 동시성 문제를 원천적으로 피하기 위해서입니다. 그런데 싱글 스레드임에도 비동기 처리가 가능한 이유는 이벤트 루프 구조 덕분입니다. JS 엔진은 코드를 콜 스택에서 실행하다가 비동기 작업을 만나면 브라우저의 Web API에 위임하고 다음 코드를 바로 실행합니다. Web API에서 처리가 완료된 콜백은 큐에 대기하게 되는데, Promise 계열은 마이크로태스크 큐에, setTimeout 등은 태스크 큐에 들어갑니다. 이벤트 루프는 콜 스택이 비었는지 계속 감시하면서, 마이크로태스크 큐를 먼저 처리하고 그 다음 태스크 큐의 작업을 실행하는 방식으로 동작합니다. 이 구조 덕분에 자바스크립트는 하나의 스레드만으로도 블로킹 없이 효율적으로 동작할 수 있습니다.