- 0
- 2
이벤트 루프(Event Loop)
답변 확인
1. 이벤트 루프란?
이벤트 루프는 JavaScript의 비동기 처리를 가능하게 하는 핵심 메커니즘 JavaScript는 싱글 스레드 언어이지만, 이벤트 루프를 통해 동시에 여러 작업을 효율적으로 처리할 수 있음
2. 이벤트 루프의 주요 구성 요소
1.콜 스택 (Call Stack)
- 함수 실행 컨텍스트가 쌓이는 LIFO(Last In, First Out) 구조
- 동기 작업은 콜 스택에서 바로 실행
function first() {
console.log('첫 번째 함수 실행');
second();
}
function second() {
console.log('두 번째 함수 실행');
}
first();
// 첫 번째 함수 실행
// 두 번째 함수 실행
- 동작 순서:
first()
가 호출되어 콜 스택에 추가 → 실행.first()
내에서second()
호출 →second()
가 스택에 추가 → 실행.second()
실행 완료 → 스택에서 제거.first()
실행 완료 → 스택에서 제거.
2.Web API
- 브라우저가 제공하는 API로, 비동기 작업(setTimeout, fetch, DOM 이벤트) 등을 처리
- 작업이 완료되면 콜백 함수를 테스크 큐에 전달
console.log('시작');
setTimeout(() => {
console.log('타이머 완료');
}, 2000);
console.log('끝');
// 시작
// 끝
// 타이머 완료
- 동작 순서:
console.log('시작')
→ 콜 스택에서 실행.setTimeout
→ Web API로 넘어가 타이머 설정.console.log('끝')
→ 콜 스택에서 실행.- 타이머 완료 후, 콜백 함수가 태스크 큐로 이동.
- 콜 스택이 비면, 태스크 큐에서 콜백 함수 실행.
3. 태스크 큐 (Task Queue)
- 비동기 작업의 콜백 함수가 완료 후 대기하는 공간
- 매크로태스크와 마이크로태스크로 나뉘며, 마이크로태스크가 먼저 실행
마이크로태스크(Promise.then)
는 > 매크로태스크(setTimeout)
보다 우선 처리
- 매크로태스크 큐:
setTimeout
,setInterval
,setImmediate(Node.js)
등의 작업이 대기- 이벤트 루프가 콜 스택이 비었을 때, 매크로태스크 큐에서 작업을 하나 가져와 실행
- 마이크로태스크 큐:
Promise.then
,MutationObserver
등이 대기- 매크로태스크보다 우선순위가 높으며, 콜 스택이 비는 시점마다 마이크로태스크 큐의 모든 작업이 처리됨
4.이벤트 루프 (Event Loop)
- 이벤트 루프는 콜 스택이 비어 있을 때, 태스크 큐에서 작업을 가져와 실행
- 실행 순서: 마이크로태스크 > 매크로태스크
console.log('시작');
setTimeout(() => {
console.log('매크로태스크');
}, 0);
Promise.resolve().then(() => {
console.log('마이크로태스크');
});
console.log('끝');
// 시작
// 끝
// 마이크로태스크
// 매크로태스크
- 동작 순서:
console.log('시작')
실행 → 콜 스택에서 제거.setTimeout
→ Web API로 이동 → 타이머 완료 후 콜백 함수는 매크로태스크 큐에 등록.Promise.resolve().then
→ 마이크로태스크 큐에 등록.console.log('끝')
실행 → 콜 스택에서 제거.- 마이크로태스크 큐의 작업 실행 →
console.log('마이크로태스크')
- 매크로태스크 큐의 작업 실행 →
console.log('매크로태스크')
결론
- 콜 스택: 현재 실행 중인 작업을 관리
- Web API: 비동기 작업 처리 및 태스크 큐로 콜백 전달
- 태스크 큐:
- 매크로태스크:
setTimeout, setInterval
- 마이크로태스크:
Promise.then
- 매크로태스크:
- 이벤트 루프: 콜 스택이 비었을 때, 태스크 큐의 작업을 실행
이해 포인트:
- 마이크로태스크가 매크로태스크보다 우선 처리됨
- 비동기 작업은 항상 현재 동기 작업이 완료된 후 실행됨
Top comments (2)
- DavidYang2월 19일
우와 댓글이다~
- Olivia2월 19일
오오 ~~ :) 너무 글 좋네용