Node.js의 내부 구조: V8 엔진에서 이벤트 루프까지
카테고리
프로그래밍/소프트웨어 개발
서브카테고리
웹 개발
대상자
Node.js와 이벤트 루프 기초를 배우고자 하는 개발자, 비동기 프로그래밍 이해가 필요한 프론트엔드/백엔드 개발자
핵심 요약
- Node.js는 V8 엔진을 기반으로 한 서버 환경으로, JavaScript를 브라우저 외부에서 실행 가능
- 이벤트 루프(Call Stack, Node APIs, Callback Queue)는 비동기 I/O 작업을 처리하는 핵심 메커니즘
- 비동기 프로그래밍은 UI 동결 방지와 멀티태스킹 지원이 가능하며,
setTimeout
예제를 통해 실행 순서 이해 가능
섹션별 세부 요약
1. Node.js와 V8 엔진의 정의
- Node.js는 C, C++, JavaScript로 작성된 서버 환경으로, Windows, Linux, macOS에서 실행 가능
- V8 엔진은 Chromium에서 개발된 JavaScript/WebAssembly 엔진으로, C++과 Assembly 언어로 작성
- V8는 Chrome 브라우저의 핵심 요소로, JavaScript 코드를 실행하는 런타임 환경 제공
2. 동기 vs 비동기 프로그래밍
- 동기 프로그래밍: 코드 실행 순서에 따라 동작, 장시간 작업 시 UI 동결 발생
- 비동기 프로그래밍: 작업이 완료될 때까지 기다리지 않고 백그라운드 실행 후 결과 처리, UI 동결 방지 가능
- 예시 코드:
```javascript
console.log("Hello world!");
setTimeout(() => { console.log("set timeout function"); }, 2000);
console.log("I am Parmesh Bhatt.");
```
- 출력 순서:
Hello world!
→I am Parmesh Bhatt.
→set timeout function
3. 이벤트 루프의 작동 원리
- 이벤트 루프는 Call Stack, Node APIs, Callback Queue 3가지 요소로 구성
- Call Stack: LIFO(후입선출) 원칙으로 함수 실행 관리
- Node APIs: C++으로 작성된 함수(예:
setTimeout
)는 Call Stack으로 직접 이동하지 않고 Node API에 처리 - Callback Queue: Node API에서 완료된 작업은 Callback Queue에 저장 후 Call Stack이 비워질 때 실행
4. 이벤트 루프의 비동기 I/O 지원
- 이벤트 루프는 단일 스레드 JavaScript에서도 비동기 I/O 가능
- 모던 커널은 멀티스레드로 실행되어, 백그라운드 작업 완료 시 Node.js에 알림 전달
- 예제 코드:
```javascript
console.log("one");
setTimeout(() => { console.log("Settimeout 1"); }, 2000);
setTimeout(() => { console.log("Settimeout 2"); }, 0);
console.log("Two");
```
- 출력 순서:
one
→Two
→Settimeout 2
→Settimeout 1
결론
- Node.js의 이벤트 루프는 비동기 I/O 작업을 효율적으로 처리하며, Call Stack, Node APIs, Callback Queue의 조합으로 작동
- 개발자는 비동기 함수(예:
setTimeout
)를 사용해 UI 동결 방지와 멀티태스킹 구현 가능 - 이벤트 루프 이해는 Node.js 성능 최적화와 복잡한 작업 처리에 필수적