카테고리 없음

(Node.js는 single-threaded 기반 JS 런타임),(Node.js의 이벤트 루프) 본캠프 02/17

parkcw0325 2025. 2. 17. 19:53

9. Node.js는 single-threaded 기반 JS 런타임입니다. 이에 대해 아는 만큼 설명해주세요.

 

Node.js는 싱글 스레드 이벤트 루프 모델을 사용합니다. 

이는 메인 스레드(이벤트 루프) 하나만으로 모든 작업을 처리한다는 의미입니다.
하지만 논블로킹 I/O와 비동기 작업을 통해 동시성을 달성합니다.
예를 들어, 파일 읽기나 네트워크 요청 같은 I/O 작업은 백그라운드 스레드 풀(libuv 라이브러리)로 위임되고,

메인 스레드는 다른 작업을 계속 처리하다가 완료 시 콜백을 실행합니다.

// 동기 vs 비동기 예시
const fs = require("fs");

// 동기 방식 (블로킹)
const data = fs.readFileSync("file.txt"); // 이 줄에서 멈춤
console.log("Sync Done");

// 비동기 방식 (논블로킹)
fs.readFile("file.txt", (err, data) => {
  console.log("Async Done");
});
console.log("Next Task"); // 먼저 실행됨

 

왜 싱글 스레드를 사용할까?

 

장점: 컨텍스트 스위칭 오버헤드 감소, 데드락 방지, 개발 편의성
단점: CPU 집약적 작업(예: 이미지 처리)에서는 성능 저하 ⚠️

 

꼬리 질문 1: "그럼 Node.js는 진짜로 멀티코어를 활용하지 못하나요?"

 

아닙니다. 클러스터 모듈이나 Worker Threads를 통해 멀티코어 활용이 가능합니다.
예를 들어, worker_threads는 CPU 집약적 작업을 워커 스레드로 분리해 메인 스레드의 블로킹을 방지합니다.

const { Worker } = require("worker_threads");

// 메인 스레드
const worker = new Worker("./cpu-intensive-task.js");
worker.on("message", (result) => console.log(result)); // 결과 수신

 

꼬리 질문2: "그렇다면 non-blocking, asynchronous은 무엇인가?"

 

Node.js는 이벤트 드리븐 아키텍처로, I/O 작업이 완료될 때까지 대기하지 않고 다음 작업을 수행합니다.
이를 위해 콜백 함수, Promise, async/await을 사용해 비동기 흐름을 제어합니다.
예를 들어, setTimeout이나 fs.readFile은 작업을 백그라운드로 넘긴 후 즉시 다음 코드를 실행합니다.

// 논블로킹 예시
console.log("Start");
setTimeout(() => console.log("Timeout"), 0);
Promise.resolve().then(() => console.log("Promise"));
console.log("End");

// 출력 순서:
// Start → End → Promise → Timeout

 

 

10. Node.js의 이벤트 루프란 무엇이고, 작동 방식을 설명해주세요.

 

이벤트 루프는 libuv 라이브러리에서 구현된 싱글 스레드 루프로,
6개의 단계(phase) 를 순회하며 태스크(콜백)를 실행합니다.
주요 단계는 다음과 같습니다

 

Timers: setTimeout, setInterval 콜백 실행

Pending I/O: 완료된 I/O 콜백 (예: 파일 읽기)

Idle/Prepare: 내부용 (무시 가능)

Poll: 새로운 I/O 이벤트 감지 및 즉시 실행 가능한 콜백 처리

Check: setImmediate 콜백 실행

Close: socket.on('close') 같은 종료 콜백

 

// 이벤트 루프 실행 순서 예시
setTimeout(() => console.log("Timeout"), 0);
setImmediate(() => console.log("Immediate"));
Promise.resolve().then(() => console.log("Promise"));

// 출력 순서:
// Promise → Timeout → Immediate (또는 Timeout → Immediate → Promise)
// (Timer 단계와 Check 단계의 실행 순서는 환경에 따라 다름)

 

꼬리 질문 1: "Poll 단계에서 어떤 일이 일어나나요?"


답변


Poll 단계는 두 가지 주요 작업을 합니다

완료된 I/O 콜백 실행 (예: 파일 읽기 완료)

새 이벤트 대기: 실행할 콜백이 없으면,

다음 Check/Close 단계로 넘어가거나

새 이벤트가 발생할 때까지 대기 (타임아웃 기준은 Timers 단계의 최소 대기 시간)