Node.js 개념 정리 – 싱글 스레드로 어떻게 비동기 처리를 할 수 있을까?
Node.js란?
- 확장성 있는 네트워크 애플리케이션(특히 서버 사이드) 개발에 사용되는 런타임 환경
- JavaScript를 활용하여 Non-blocking I/O와 단일 스레드 이벤트 루프 기반의 높은 처리 성능 제공
- Chrome V8 엔진 + libuv (비동기 이벤트 처리 라이브러리) 조합
- 내장 HTTP 서버를 가지고 있어 별도 Apache 없이도 웹서버 동작 가능
Node.js는 싱글 스레드인가?
- 흔히 Node.js는 싱글 스레드다라고 하지만, 정확히는 "JavaScript를 실행하는 스레드가 싱글"일 뿐
- 실제로는 libuv가 멀티 스레드 기반의 작업 처리 백엔드를 제공함
libuv란?
- Node.js에서 사용하는 C/C++ 기반의 비동기 I/O 처리 라이브러리
- OS 커널의 비동기 API 지원 여부에 따라 전략적으로 처리
- OS에서 비동기 처리를 지원하면 커널에 위임
- 지원하지 않으면 libuv가 관리하는 스레드 풀(thread pool)을 이용해 처리
- 기본적으로 4개의 워커 스레드를 포함한 풀 구성
이벤트 루프란?
Node.js의 싱글 스레드 메인 루프
비동기 작업을 순차적으로 처리해주는 매니저 역할
아래와 같은 Phase로 구성됨:
- Timer Phase
- Pending Callbacks
- Idle/Prepare
- Poll
- Check
- Close Callbacks
각 Phase를 순회하며 처리하는 단위를
tick
이라 부름
논블로킹 I/O 처리 흐름 요약
- JavaScript 메인 스레드는 libuv에 I/O 작업을 요청
- libuv는 OS 커널 or 자체 thread pool을 활용해 작업을 수행
- 작업 완료 시 콜백 큐에 추가 → 이벤트 루프가 꺼내서 처리
- 메인 스레드는 계속 다른 요청을 받고 처리 가능
비동기와 이벤트 루프
- 비동기란: 작업이 완료되지 않아도 다음 코드 실행이 가능하다는 것 (동시성)
- Node.js는 싱글 스레드임에도 이벤트 루프 + libuv 덕분에 동시성 비동기 처리가 가능
핵심 정리
요소 | 설명 |
---|---|
Node.js | JavaScript 런타임 환경 (V8 + libuv) |
libuv | 비동기 I/O를 처리하는 C/C++ 라이브러리 |
이벤트 루프 | 비동기 작업을 순차적으로 처리하는 싱글 스레드 루프 |
스레드풀 | libuv 내부의 백그라운드 처리용 멀티 스레드 |
단일 스레드로도 동시성 비동기 처리를 해내는 Node.js의 핵심은
바로 이벤트 루프 + libuv의 백그라운드 처리 능력입니다.
'Web > JavaScript' 카테고리의 다른 글
JavaScript란? (0) | 2024.03.05 |
---|---|
[Node.js] 이벤트 디멀티플렉싱 (0) | 2024.03.05 |
JavaScript 배열 복사: spread와 map의 차이 완벽 정리 (얕은 복사 vs 깊은 복사) (0) | 2024.02.05 |