🚀 자바스크립트 이벤트 루프: 비동기 작업의 숨겨진 비밀
들어가며: 자바스크립트의 특별한 능력
자바스크립트는 단일 스레드 언어임에도 불구하고, 마치 여러 일을 동시에 처리하는 것처럼 보입니다. 이 마법 같은 능력의 주인공, 바로 이벤트 루프입니다!
🤔 이벤트 루프란 무엇인가?
이벤트 루프는 자바스크립트의 비동기 작업을 관리하는 놀라운 메커니즘입니다. 마치 주방장이 여러 요리를 동시에 관리하는 것처럼, 이벤트 루프는 다양한 작업들을 조율합니다.
주요 구성 요소
- 콜 스택 (Call Stack)
- 현재 실행 중인 함수들이 쌓이는 공간
- 함수 호출 순서를 관리하는 접시 더미라고 생각하세요
- 태스크 큐 (Task Queue)
- 비동기 작업의 결과가 대기하는 공간
- 두 가지 종류가 있습니다
- 마이크로태스크 큐
- 매크로태스크 큐
🎬 이벤트 루프의 동작 원리: 실제 예시로 살펴보기
console.log('시작');
setTimeout(() => {
console.log('타이머 콜백');
}, 0);
Promise.resolve().then(() => {
console.log('프로미스 콜백');
});
console.log('끝');
이 코드의 실행 순서를 살펴보면:
- '시작' 출력
- '끝' 출력
- '프로미스 콜백' 출력 (마이크로태스크 큐)
- '타이머 콜백' 출력 (매크로태스크 큐)
왜 이렇게 실행될까요?
- 마이크로태스크 큐(Promise)가 매크로태스크 큐(setTimeout)보다 먼저 처리됩니다.
- 동기 코드가 먼저 실행된 후, 비동기 작업이 처리됩니다.
🔍 태스크 큐의 종류
1. 마이크로태스크 큐
- 높은 우선순위
- Promise, queueMicrotask() 등의 작업 처리
- 매크로태스크 큐보다 먼저 실행
2. 매크로태스크 큐
- 상대적으로 낮은 우선순위
- setTimeout(), setInterval(), requestAnimationFrame() 등
- 마이크로태스크 큐의 모든 작업이 완료된 후 실행
💡 실용적인 예시: 비동기 작업 처리
// 사용자 데이터 fetching 시뮬레이션
function fetchUserData() {
console.log('사용자 데이터 요청 시작');
// 프로미스를 사용한 비동기 작업
return new Promise((resolve) => {
setTimeout(() => {
resolve({ name: '홍길동', age: 30 });
}, 1000);
});
}
console.log('프로그램 시작');
fetchUserData().then((user) => {
console.log('사용자 데이터:', user);
});
console.log('프로그램 종료');
// 예상 출력:
// 프로그램 시작
// 사용자 데이터 요청 시작
// 프로그램 종료
// 사용자 데이터: { name: '홍길동', age: 30 }
🚀 이벤트 루프의 중요성
- 비동기 작업 관리: 복잡한 작업을 부드럽게 처리
- 성능 최적화: 웹 애플리케이션의 반응성 향상
- 논블로킹 작업: 사용자 경험 개선
마무리: 이벤트 루프, 그 신비로운 메커니즘
이벤트 루프는 자바스크립트의 비동기 마법을 가능하게 하는 핵심 메커니즘입니다. 복잡해 보이지만, 결국 효율적으로 작업을 관리하는 똑똑한 시스템입니다.
더 깊이 알아보기
- MDN 웹 문서
- Jake Archibald의 이벤트 루프 강의
- 브라우저 개발자 도구로 직접 확인해보기
728x90
'1일 1CS(Computer Science)' 카테고리의 다른 글
리액트의 Controlled Component와 Uncontrolled Component (0) | 2025.04.03 |
---|---|
리액트의 Props와 State (0) | 2025.04.03 |
TanStack Query: staleTime과 gcTime (0) | 2025.03.27 |
reflow와 repaint의 차이점과 최적화 방법 (1) | 2025.03.26 |
실행 컨텍스트란? (0) | 2025.03.26 |