자바스크립트는 싱글 스레드 언어로, 동시에 하나의 작업만 실행할 수 있다. 그러나 실제 웹 애플리케이션에서는 다양한 비동기 작업(예: 네트워크 요청, 타이머 등)을 처리해야 한다.
=> 이 문제를 해결하기 위해 자바스크립트는 이벤트 루프라는 메커니즘을 사용.
function first() {
second();
console.log("첫 번째");
}
function second() {
third();
console.log("두 번째");
}
function third() {
console.log("세 번째");
}
first();
third()
second()
first()
anonymous # 가상 전역 컨텍스트. 항상 존재
function run() {
console.log("3초 후 실행");
}
console.log("시작");
setTimeout(run, 3000);
console.log("끝");
Promise
는 비동기 작업을 관리하는 중요한 객체console.log("Start");
let promise = new Promise((resolve, reject) => {
setTimeout(() => {
resolve("Success");
}, 1000);
});
promise.then(result => {
console.log(result);
});
console.log("End");
1) anonymous 함수(전역 컨텍스트)가 호출 스택에 있음.
2) console.log('Start') 실행, 호출 스택에 추가되었다가 제거됨.
3) setTimeout 함수 호출, 호출 스택에 추가되었다가 제거됨. 백그라운드로 타이머가 설정됨.
4) console.log('End') 실행, 호출 스택에 추가되었다가 제거됨.
5) 타이머가 백그라운드에서 1초 후 만료됨.
6) 타이머 만료 후 resolve('Success') 콜백 함수가 테스크 큐로 이동.
7) 이벤트 루프가 호출 스택이 비어 있음을 확인하고, 테스크 큐에서 resolve('Success') 콜백을 호출 스택으로 이동하여 실행.
8) promise.then에 등록된 콜백이 호출 스택으로 이동하여 실행됨.
9) console.log('Success')가 호출 스택에 추가되었다가 제거됨.
이번 글을 통해 자바스크립트의 이벤트 루프와 비동기 작업에 대한 개념을 정리해 보았다. Vue나 React와 같은 프레임워크를 사용하여 화면을 만들 때, 비동기 작업의 작동 원리를 완벽히는 이해하지 못한 채 "이렇게 하면 되겠지"라고 생각하며 코드를 작성했던 경험이 있었던 것 같다.🤒
코드가 잘 동작하는 것에 만족하기보다는, 그 동작 원리를 깊이 이해하고 작성하는 습관을 가지는 것이 중요하다는 것을 다시 한 번 깨달았다. :)