본문 바로가기
개발/Node.js

[Node.js] Node.js 란?

by WaDDak 2024. 8. 30.

 

Node.js 는 Javascrip를 브라우저가 아닌 컴퓨터에서 브라우저 없이 실행하게 도와주는 환경입니다.

이는 핵심적인 코어 라이브러리와 V8엔진, 그리고 libuv라는 라이브러리를 통해 가능해집니다.

 

V8엔진은 구글이 개발하여 구글 크롬 브라우저에서 사용하는 자바스크립트 엔진입니다. Node.js에서 이 엔진을 활용함으로써, 우리는 브라우저 환경 이외에서도 자바스크립트를 사용할 수 있게 되었습니다.

 

libuv는 Node.js 가 비동기 I/O 작업을 수행할 수 있게 해주는 중요한 라이브러리 입니다. 이 라이브러리 덕분에 Node.js는 논 블로킹 I/O 모델이라는 특징을 가지게 되었고, 이를 통해 여러 요청을 효율적으로 처리할 수 있게 되었습니다.

 

Node.js 란 무엇인가? :

Node.js는 서버 측 애플리케이션 개발에 사용되는 오픈 소스 런타임 환경입니다. Node.js는 주로 비동기 이벤트 기반 아키텍처를 지원하며, 이는 비동기 I/O 작업을 효율적으로 처리할 수 있도록 해줍니다. 이로 인해 Node.js는 고성능 네트워크 애플리케이션, 특히 실시간 데이터 처리 애플리케이션 개발에 적합합니다.

 

주요 특징 :

  1. 자바스크립트 런타임 : Node.js는 구글의 V8자바스크립트 엔진을 기반으로 하며, 이는 자바 스크립트를 서버 측에서 실행할 수 있게 합니다. 따라서, 프런트엔드와 백엔드 모두에서 동일한 언어를 사용할 수 있습니다.
  2. 비동기 I/O : Node.js는 비동기 방식으로 I/O작업을 처리하므로, 여러 작업이 동시에 수행될 수 있습니다. 이는 특히 I/O집약적인 애플리케이션, 예를 들어 데이터베이스 작업, 파일 시스템 작업 등에 유리합니다.
  3. 이벤트 기반 : 이벤트 루프를 사용하여 비동기 작업을 처리합니다. 이는 이벤트가 발생할 때마다 특정 작업이 실행되는 구조로, 대규모 동시성을 요구하는 애플리케이션에 효과적입니다.
  4. npm(Node Package Manager) : npm은 패키지 관리 도구이며, 이는 오픈 소스 라이브러리와 모듈을 쉽게 설치하고 관리할 수 있도록 해줍니다. npm은 세계에서 가장 큰 소프트웨어 레지스트리 중 하나입니다.
  5. 크로스 플랫폼 : Window, Linux, macOS등 다양한 운영 체제에서 실행할 수 있습니다.

 

사용 사례 :

  • 실시간 웹 애플리케이션 ( ex : 채팅 애플리케이션, 실시간 협업 도구)
  • RESTful API서버
  • 마이크로서비스 아키텍처
  • loT애플리케이션 서버
  • 서버리스 컴퓨팅 환경에서의 백엔드 로직

 

Node.js는 대표적으로 논 블로킹 I/O, 싱글 스레드, 이벤트루프의 특징이 있습니다.

 

블로킹, 논 블로킹 I/O?

  • 블로킹 I/O : 한번에 하나의 작업만을 처리할 수 있으며, 호출된 함수가 자신의 작업을 모두 마칠 때 까지 호출한 함수에게 제어권을 넘겨주지 않습니다. 예를들어, 파일을 읽는 동안에는 다른작업을 함께 수행할수 없습니다.
  • 논 블로킹 I/O : 시스템 호출이 완료되기를 기다리지 않고 바로 다음 작업으로 즉시 넘어갈 수 있는 방식이므로 호출된 함수는 작업의 완료 여부와 상관없이 즉시 제어권을 호출한 함수에게 반환합니다.  예를들어, 파일을 읽는 동안에도 동시에 연산을 하는 것 처럼 다른 작업을 함께 수행할 수 있습니다.

 

블로킹, 논 블로킹 I/O?

싱글 스레드는 스레드 하나를 사용하는 것이며, 동시에 하나의 작업만을 처리할 수 있음을 의미합니다.

=> 여기서 스레드란 프로그램이 동작할 때, CPU 또는 프로세서를 사용하는 단위로, 여러 스레드를 사용하면 여러 작업을 동시에 처리할 수 있습니다. 그러나 이는 복잡성을 증가시키고, 리소스를 더욱 많이 소모하게 되는 문제점이 발생합니다.

  • Node.js 는 싱글 스레드로 동작하지만, I/O작업이 발생한 경우 이를 비동기적으로 처리하여 여러 작업을 동시에 처리할 수 있게 합니다.
  • 일반적으로 1개의 프로그램은 1개의 스레드를 사용할 수 있습니다. 하지만 1개의 프로그램에서 여러개의 스레드를 사용할 수 있다면 연산할 시간을 단축시킬 수 있겠죠?

그렇다면 1개의 스레드를 사용하는 싱글 스레드보다 여러개의 스레드를 사용하는 멀티 스레드가 속도에 이점이 있을텐데

 

왜 Node.js는 싱글 스레드를 사용하는가?

사실 싱글 스레드 방식은 많은 이점을 제공합니다. 스레드 생성과 관리에 드는 부담을 줄여주며, 컴퓨팅 리소스를 효율적으로 사용할 수 있게 합니다. 또한, 한 번에 하나의 작업만 처리하기 때문에 동시성 문제, 즉 여러 스레드가 공유하는 자원에 대한 동시접근 문제, 즉 Race Condition (경쟁상태)문제를 방지합니다.

 

예를들어, 웹서버에서 동시에 많은 요청을 처리해야하는 경우, 멀티스레드 방식을 사용하면 각 요청마다 스레드를 생성해야 하므로 오버헤드가 크게 발생합니다. 반면에 Node.js의 싱글 스레드 + 이벤트 루프 방식을 사용하면, 동시에 많은 요청을 효율적으로 처리할 수 있습니다.

이러한 특징 덕분에 연결 요청의 부하에 따른 서버 확장이 매우 자유롭습니다. 즉, Node.js 는 특히 웹서버에 특화된 철학이 녹아있는 언어입니다.

 

아무리 싱글 스레드만의 장점이 있다고 하더라도, 싱글 스레드 방식은 CPU집중적인 작업에는 적합하지 않습니다.

이런 경우에는 멀티스레드 방식이 더 효율적일 수 있습니다. 이러한 약점을 극복하기 위해 추가 스레드를 생성하는 방법들을 제공합니다만 기본적으로 Node.js의 철학은 싱글 스레드 방식에 기반하고 있음을 기억해야 합니다.

 

 

이벤트 루프 

이벤트 루프는 여러 이벤트들과 같은 비동기 작업들을 모아서 관리하고, 어떤 순서대로 실행해야 하는지 도와주는 도구입니다.

  • 이벤트 루프는 호출 스택과 이벤트 큐를 관찰하면서, 호출 스택이 비어있고, 이벤트 큐에 작업이 있다면, 이벤트 큐의 작업을 호출 스택으로 이동하는 역할을 담당합니다.
  • 이벤트 루프를 활용한다면, 자바스크립트는 시간이 오래 걸리는 작업을 이벤트 큐에 넣어 비동기적으로 처리하고, 그 동안 호출 스택에서 다른 작업들을 계속 처리할 수 있습니다.
function firstFunction() {
  console.log('firstFunction 입니다.');
  secondFunction();
}

function secondFunction() {
  // 2 초간 기다린다.
  setTimeout(function () {
    console.log('secondFunction 입니다.');
  }, 2000);
}

firstFunction();
console.log('전역 코드 실행 중!');

// print: firstFunction 입니다.
// print: 전역 코드 실행 중!
/** 2 초간 기다린다. **/
// print: secondFunction 입니다.

이 예제 코드에서 firstFunction()은 호출 스택에 추가(push)되고, 실행되며 firstFunction입니다를 콘솔에 출력하고 그다음

secondFunction()을 호출합니다. 그 다음 secondFunction은 호출스택에 추가되고, setTimeout함수를 실행합니다.

setTimeout 함수는 비동기 함수이므로, JS는 이 작업을 이벤트 큐에 넣고 secondFunction을 호출스택에서 제거(pop)합니다. 그 다음 firstFunction도 호출 스택에서 제거하고 전역코드 실행중을 콘솔에 출력합니다.

 

이벤트 루프에 대해 자세히 알고싶다면 여기를 클릭하세요!

이벤트 루프의 공식 문서가 궁금하다면 여기를 클릭해주세요!

'개발 > Node.js' 카테고리의 다른 글

[Node.js] Routing 및 Router  (0) 2024.09.02
[Node.js] API 와 REST API  (2) 2024.09.02
[Node.js] Express.js 프레임 워크  (0) 2024.08.30
[Node.js] Package Manager  (0) 2024.08.30
[Node.js] 웹과 HTTP의 동작 방식  (0) 2024.08.27