본문 바로가기
카테고리 없음

Node.js 알아보기

by 엔 터 2024. 6. 25.

Node.js 란

노드 공식 사이트에는 노드를 다음과 같이 설명하고 있습니다.

'Node.js는 Chrome V8 Javascript 엔진으로 빌드된 Javascript 런타임 입니다'

런타임은 특정 언어로 만든 프로그램들을 실행할 수 있는 환경을 뜻합니다.

Node.js의 등장 이전까지는 자바스크립트의 런타임은 웹 브라우저뿐이였습니다.
하지만 Node.js의 등장 이후에는 자바스크립트 프로그램을 컴퓨터에서 실행할 수 있다
쉽게 말해 노드는 자바스크립트 실행기 입니다.

특히, 2008년 구글이 V8 엔진을 사용하여 크롬을 출시하였고, V8엔진은 다른 자바스크립트 엔진과 달리 매우 빨라 라이언 달(Ryan Dahl)은 2009년 V8 엔진 기반의 노드 프로젝트를 시작하며 세상에 나왔습니다.

Node.js는 이벤트 기반, 논블로킹 I/O 모델을 사용하는 비동기 프로그래밍 모델입니다. 이 모델은 싱글 스레드로 작동하며, 이벤트 루프를 통해 I/O 요청과 같은 비동기 작업을 처리합니다

❗️이벤트 기반

노드는 V8과 더불어 libuv라는 라이브러리를 사용한다.libuv 라이브러리는 노드의 특성인 이벤트 기반, 논 블로킹 I/O 모델을 구현하고 있다.이벤트 기반(Event-driven)이란 이벤트가 발생할 때 미리 지정해둔 작업을 수행하는 방식을 의미한다.즉, 이벤트 기반 시스템에서는 특정 이벤트가 발생할 때 무엇을 할지 미리 등록해두고, 이를 이벤트 리스너에 콜백함수를 등록한다.이후 이벤트가 발생하면 리스너에 등록해둔 콜백함수를 호출하며, 이벤트가 끝난 후 노드는 다음 이벤트가 발생할 때까지 대기한다.

❗️논 블로킹 I/O

이벤트 루프를 잘 활용하면 오래 걸리는 작업을 효율적으로 처리할 수 있다.작업에는 두 가지 종류가 있는데 동시에 실행될 수 있는 작업과 동시에 실행될 수 없는 작업이다.특히 파일 시스템 접근, 네트워크를 통한 요청 작업은 입력(Input)/출력(Output)의 일종이며,이러한 작업을 할 때 노드는 비동기 방식으로 블로킹을 만들지 않게 끔(논 블로킹) 처리한다.비동기이란 이전 작업이 완료될 때까지 대기하지 않고 동시에 작업을 수행한다.반대로 동기는 이전 작업이 끝나야만 다음 작업을 수행한다.자세하게 풀어서 아야기하면 함수 호출 시 당장 실행하는 것이 아니라(동기→블로킹) 일단 어느 곳에 쌓아 놓고 동시에 요청을 처리하고(비동기→논 블로킹) 요청이 완료된 순서대로처리(스택 이용) 한다는 말이다.

❗️싱글 스레드

이벤트 기반, 논 블로킹 모델과 더불어 노드를 설명하는 키워드 중 하나는 싱글 스레드이다.

자바스크립트 코드는 동시에 실행될 수 없는데 그 이유는 노드가 싱글 스레드 기반이기 때문이다.

프로세스 : 운영체제에서 할당하는 작업의 단위이다. 노드나 웹 브라우저 같은 프로그램은 개별적인 프로세스이다. 프로세스 간에는 메모리 등의 자원을 공유하지 않는다.스레드 : 스레드는 프로세스 내에서 실행되는 흐름의 단위이다. 프로세스는 스레드를 여러 개 생성해 여러 작업을 동시에 처리할 수 있다. 스레드들은 부모 프로세스의 자원을 공유한다. 같은 주소의 메모리에 접근 가능하므로 데이터를 공유할 수 있다.

Node.js는 싱글스레드, 논 블로킹 모델로 싱글 스레드가 혼자서 일을 처리하지만 들어오는 요청 순서가 아닌 논 블로킹 방식으로 이전 작업이 완료될 때까지 대기하지 않고 다음 작업을 수행한다.

❗️이벤트 루프

이벤트 루프(event loop)는 여러 이벤트가 동시에 발생했을 때 어떤 순서로 콜백함수를 호출 할지를 이벤트 루프가 판단한다.노드는 이벤트가 종료될 때까지 이벤트 처리를 위한 작업을 반복하므로 루프(loog)라고 부른다.

Node.js의 장점

  1. 효율적인 자원 사용: 논블로킹 I/O 모델은 I/O 작업이 완료되기를 대기하지 않고 다른 작업을 계속 수행할 수 있게 합니다. 이로 인해 서버 자원을 효율적으로 사용하며 응답성을 개선합니다.
  2. 높은 동시성 처리 능력: 이벤트 기반 모델은 동시에 많은 연결을 관리할 수 있게 하여, 사용자 요구에 빠르게 반응할 수 있습니다.
  3. 단순화된 서버 아키텍처: 복잡한 멀티스레딩을 관리하는 대신, 이벤트 루프를 통해 작업을 처리하므로 서버 구조가 간소화되고 유지 관리가 용이해집니다.

이러한 장점들은 데이터를 실시간으로 처리해야 하는 웹 어플리케이션과 서비스에 적합합니다.

Node.js의 단점

  1. CPU 집중적 작업의 제한: 싱글 스레드는 CPU를 많이 사용하는 작업에 적합하지 않습니다. 복잡한 계산이나 무거운 처리 작업이 많은 경우, 전체 성능에 영향을 미칠 수 있습니다.
  2. 스케일링 문제: 하드웨어의 멀티코어 능력을 완전히 활용하지 못할 수 있습니다. 대규모 트래픽을 처리해야 하는 애플리케이션의 경우, 여러 Node.js 인스턴스를 관리해야 하므로 운영 복잡성이 증가할 수 있습니다.
  3. 오류 관리: 싱글 스레드에서 발생하는 오류가 전체 시스템에 영향을 미칠 수 있어, 갑작스러운 서버 중단을 초래할 위험이 있습니다.

Node.js 로 게임 서버를 만든다면 어떤류의 게임에 적합한가요?

  • 실시간 멀티플레이어 게임: Node.js는 실시간으로 사용자 간의 상호작용이 필요한 게임에 적합합니다. 예를 들어, 멀티플레이어 카드 게임, 캐주얼 게임, 간단한 보드 게임 등이 여기에 해당합니다. Node.js의 비동기 I/O 처리 능력은 네트워크 요청을 효율적으로 처리하므로, 사용자의 요청에 빠르게 반응하고, 서버의 부하를 관리하는 데 도움을 줍니다.
  • 소셜 인터랙티브 게임: 소셜 네트워킹 기능을 통합한 게임, 예를 들어 사용자 간에 메시지를 주고받거나 상호작용하는 기능을 포함한 게임 서버 구축에 Node.js가 유용합니다. 이러한 유형의 게임에서는 다수의 짧은 메시지와 상태 업데이트가 빈번하게 발생하며, Node.js는 이러한 요구 사항을 효과적으로 처리할 수 있습니다.
  • 턴 기반 게임: 턴 기반 전략 게임이나 퍼즐 게임 등에서 Node.js는 클라이언트에서 서버로 전송되는 요청을 처리하고, 게임 상태를 관리하는 데 필요한 성능을 제공합니다. 게임의 각 턴에서 발생하는 데이터는 비교적 작고, 비동기 처리에 적합합니다.
  • 경량 모바일 게임: 경량의 모바일 게임 서버를 구축할 때 Node.js는 좋은 선택이 될 수 있습니다. 모바일 환경에서는 네트워크 연결이 불안정할 수 있으며, Node.js 서버는 빠르게 연결을 수립하고 끊김 없이 데이터를 전송할 수 있는 구조를 가지고 있습니다.

Node.js는 CPU 집중적인 작업이나 복잡한 물리 엔진을 요구하는 대규모 MMO(Massively Multiplayer Online) 게임 서버 구축에는 그다지 적합하지 않을 수 있습니다. 이러한 게임은 강력한 멀티 스레딩 처리 능력과 높은 계산 성능이 요구되기 때문에, 더 전통적인 멀티 스레드 서버 언어와 프레임워크가 더 적합할 수 있습니다.