본문 바로가기
온라인 멘토와 함께하는 공부/JS

[NodeJS] Node.js가 동작하는 방식

by 열공노년 2024. 5. 27.
반응형

Node.js가 동작하는 방식

Node.js가 동작하는 방식은 이벤트 기반, 비동기 I/O 모델을 중심으로 설명할 수 있습니다. Node.js는 싱글 스레드에서 실행되지만, 비동기 작업을 효율적으로 처리하여 높은 성능을 제공합니다. 아래는 Node.js의 동작 방식을 자세히 설명한 것입니다.

1. 이벤트 루프

Node.js의 핵심은 이벤트 루프입니다. 이벤트 루프는 Node.js가 비동기 작업을 처리하는 방식으로, 모든 비동기 작업은 이벤트 루프를 통해 관리됩니다.

  • 싱글 스레드: Node.js는 기본적으로 싱글 스레드에서 실행됩니다. 즉, 하나의 스레드에서 모든 작업을 처리합니다.
  • 이벤트 큐: 비동기 작업이 완료되면 해당 작업은 이벤트 큐에 추가됩니다.
  • 이벤트 루프: 이벤트 루프는 이벤트 큐에서 작업을 하나씩 가져와 실행합니다. 작업이 완료되면, 다음 작업을 가져옵니다.

2. 비동기 I/O

Node.js는 비동기 I/O를 사용하여 파일 읽기/쓰기, 네트워크 요청 등을 처리합니다. 비동기 I/O는 작업이 완료될 때까지 기다리지 않고, 다른 작업을 계속 수행할 수 있게 합니다.

  • 콜백 함수: 비동기 작업은 콜백 함수를 사용하여 작업이 완료되었을 때 실행될 코드를 정의합니다.
  • 프로미스: 최신 JavaScript에서는 콜백 대신 프로미스(Promise)를 사용하여 비동기 작업을 처리합니다.
  • async/await: ES8(ECMAScript 2017)부터는 async/await 키워드를 사용하여 비동기 코드를 동기 코드처럼 작성할 수 있습니다.

3. 예시 코드

다음은 비동기 파일 읽기 작업을 예제로 보여주는 코드입니다.

const fs = require('fs');

// 비동기 파일 읽기
fs.readFile('example.txt', 'utf8', (err, data) => {
  if (err) {
    console.error(err);
    return;
  }
  console.log(data);
});

console.log('파일 읽기 요청 완료');

위 코드에서 fs.readFile 함수는 파일을 비동기적으로 읽고, 작업이 완료되면 콜백 함수를 실행합니다. console.log('파일 읽기 요청 완료');는 파일 읽기 작업이 끝나기 전에 실행됩니다.

4. 논블로킹 I/O

Node.js는 논블로킹 I/O를 통해 높은 성능을 제공합니다. 이는 I/O 작업이 완료될 때까지 기다리지 않고, 다른 작업을 계속 수행할 수 있게 합니다.

  • 블로킹 I/O: 작업이 완료될 때까지 기다려야 하므로, 다른 작업을 수행할 수 없습니다.
  • 논블로킹 I/O: 작업을 비동기로 처리하므로, 다른 작업을 수행할 수 있습니다.

5. 스레드 풀

Node.js는 내부적으로 몇 가지 I/O 작업을 처리하기 위해 스레드 풀을 사용합니다. 이 스레드 풀은 libuv 라이브러리에 의해 관리됩니다.

  • libuv: Node.js의 비동기 I/O를 처리하는 라이브러리입니다. 이벤트 루프와 쓰레드 풀을 관리합니다.
  • 스레드 풀: 디스크 I/O나 DNS 조회와 같은 일부 작업은 libuv의 스레드 풀에서 실행됩니다. 기본적으로 4개의 스레드가 있습니다.

6. Node.js 아키텍처

Node.js 아키텍처는 다음과 같이 구성됩니다.

  1. V8 엔진: Google의 V8 JavaScript 엔진을 사용하여 JavaScript 코드를 실행합니다.
  2. libuv: 이벤트 루프와 비동기 I/O 작업을 관리하는 라이브러리입니다.
  3. C/C++ 바인딩: 일부 네이티브 모듈은 C/C++로 작성되어 있으며, Node.js와 상호 작용할 수 있도록 바인딩되어 있습니다.
  4. Node.js API: 파일 시스템, 네트워크, 스트림 등 다양한 API를 제공합니다.

동작 과정 요약

  1. 이벤트 루프 시작: Node.js 애플리케이션이 시작되면 이벤트 루프가 시작됩니다.
  2. 비동기 작업 요청: 비동기 작업(예: 파일 읽기, 네트워크 요청)이 발생하면, 작업이 백그라운드에서 실행되고, 이벤트 루프는 다음 작업을 계속 처리합니다.
  3. 콜백 실행: 비동기 작업이 완료되면, 해당 작업의 콜백 함수가 이벤트 큐에 추가되고, 이벤트 루프에 의해 실행됩니다.
  4. 반복: 이 과정이 반복되어 비동기 작업을 효율적으로 처리합니다.

 

Node.js를 설명하는 곰돌이 선생님

 

Node.js는 이러한 이벤트 기반, 비동기 I/O 모델을 통해 높은 성능과 확장성을 제공하며, 많은 요청을 효율적으로 처리할 수 있습니다.

반응형