javascript는 싱글 스레드이며 동기식 언어입니다. 스레드가 하나이기 때문에 한가지의 프로세스를 이어갈 수 있으며 현재 일이 끝나지 않는다면 프로그램은 blocking됩니다. 즉, 한가지 일만을 수행할 수 있으며 현재 일이 끝나지 않은 경우에 다음 작업을 할 수 없기 때문에 프로그램은 중지된 것처럼 보입니다.
웹 사이트에서 얼마간의 대기 시간을 필요로 하는 경우는 생각보다 많습니다. 네트워크 응답 대기, 사용자 입력 대기 등... 기약없는 응답을 기다리는 상황은 언제든 필요할 수 있는데요. 이런 상황에서도 프로그램은 다음 작업을 처리하여 매끄럽게 진행돼야 합니다.
비동기 처리는 네트워크를 사용하는 프로그램에 반드시 필요한 기술이며 다른 언어들도 각자 자신만의 고유한 처리 방식이 있습니다. 몇가지 멀티 스레드를 지원하는 경우엔 스레드를 활용하여 비동기를 처리하기도 합니다. 자바스크립트도 싱글스레드로서 자신만의 고유한 비동기 상황에 따른 대처 방법이 존재해 왔었고 특히 ES6이후 promise 도입을 계기로 큰 변화가 일어났습니다.
자바스크립트의 대표적인 엔진은 V8입니다. node 환경에서도 chrome에서도 V8엔진을 사용하는데요. 이 엔진은 기본적으로 Memory Heap과 Call Stack으로 구성됩니다. 자바스크립트는 싱글 스레드로 동작합니다. 한가지 일만 할 수 있기 때문에 Call 스택의 최상위 계층의 함수가 현재 실행되고 있는 함수입니다.
자바스크립트 엔진은 싱글 스레드로 동작합니다. 즉, 하나의 콜스택만을 가지고 있으며 한번에 한가지 일만 처리할 수 있습니다. 콜스택은 기본적으로 현재 프로그램에서 실행되고 있는 작업을 가리키는 데이터 구조로 설계되어 있습니다.
function c(z) {
console.log(new Error().stack); // (A)
}
function b(y) {
c(y); // (B)
}
function a(x) {
b(x); // (C)
}
a(3); // (D)
//Console
//Error
// at c (ArrayPrototype.js:2)
// at b (ArrayPrototype.js:5)
// at a (ArrayPrototype.js:8)
// at ArrayPrototype.js:10
Error.prototype.stack은 가장 최근의 호출부터 시작되어 이전 호출 스택을 타고 나아가 전역 스택까지 도달하여 Call Stack에 쌓인 스택들을 확인할 수 있는 메소드입니다. 위 코드의 실행은 다음과 같습니다.