본문 바로가기

BackEnd/Node

[노드교과서] 챕터0. 노드의 정의

1. 노드의 정의

 1) 노드의 정의

   Node.js는 크롬 V8 자바스크립트 엔진으로 빌드 된 자바스크립트 런타임(실행기)이다.
  V8 자바스크립트 엔진으로 인해 html이나 브라우저의 종속성에서 벗어나 독립적으로 실행될 수 있다.
  쉽게 설명하자면 노드는 자바스크립트 실행기(런타임)이다.

 

  ex)   java 개발환경과의 비교 : jre(런타임), jdk(node), java(javascript)

 

   사람들이 많이 착각하는 부분 중 하나가 노드 자체를 서버라고 생각하지만 노드는 서버가 아니다.

  노드는 서버의 역할도 수행할 수 있는 자바스크립트 런타임이며 자바스크립트로 작성된 서버를 실행할 수 있다.

 또한 서버 실행을 위한 http/https/http2 모듈을 제공한다.

 참고로 typescript 런타임은 deno이다(node와 그나마 대적 가능한 것이 deno)

 

 2) 런타임

  런타임이란 특정 언어로 만든 프로그램들을 실행할 수 있게 해주는 가상 머신(크롬의 V8엔진사용)의 상태를 의미한다.
 - 노드 : 자바스크립트로 만든 프로그램들을 실행할 수 있게 해준다.
 - 다른 런타임으로는 웹 브라우저(크롬, 엣지, 사파리, 파이어폭스 등)가 있다.
 - 노드 이전에도 자바스크립트 런타임을 만들기 위해 많은 시도가 있었다.
   But, 엔진속도 문제로 인해 실패하였고 성공한 케이스가 구글의 V8 자바스크립트 엔진이다.
   
노드는 간단한 싱글 스레드 비동기 모델이다.

 

 3) 내부구조

  ⇒ 2008년 V8엔진 출시, 2009년 노드 프로젝트 시작
  ⇒ 노드는 V8과 libuv(리뷰비?)를 내부적으로 포함
   - V8 엔진 : 오픈 소스 자바스크립트 엔진이며 속도문제를 개선하였다.
   - libuv(리뷰비?) : 노드의 특성인 이벤트 기반, 논블로킹I/O 모델을 구현한 라이브러리

 

 

2. 노드의 특성

 1) 이벤트 기반

  ⇒  이벤트가 발생할 때 미리 지정해 둔 작업을 수행하는 방식이다.
   - 이벤트의 예 : 클릭, 네트워크 요청, 타이머 등

   - 이벤트 리스너 : 이벤트가 발생했을 때 그 처리를 담당하는 함수를 가르키며 이벤트 핸들러라고도 한다.

   - 콜백 함수 : 이벤트가 발생 했을 때 실행 될 함수이다.

 

 ex)                     step02. 이벤트 발생

      시스템    ---------------------------------------------------> 이벤트 리스너 : step01. 이벤트 리스너에 콜백 함수를 등록

                     <--------------------------------------------------

                           step03. 등록된 콜백 함수를 호출

 2) 논블로킹(비점유) I/O

  ⇒ 논 블로킹 : 오래 걸리는 함수를 백 그라운드로 보내 다음 코드가 먼저 실행되게 하고, 나중에

                        백 그라운드로 보낸 함수를 실행한다. (처리가 빠른 함수를 먼저 실행시킨다.)

   - 논 블로킹 방식 하에서 일부 코드는 백 그라운드에서 병렬로 실행된다.

   - 논 블로킹으로 실행되는 일부 코드 : I/O 작업(파일 시스템 접근, 네트워크 요청), 압축, 암호화 등

   - 나머지 코드는 블로킹 방식으로 실행되며 I/O 작업이 많을 때 노드의 활용성이 극대화 된다.

 

 3) 프로세스 vs 스레드

  ⇒ 프로세스와 스레드

   - 프로세스 : 운영체제에서 할당하는 작업의 단위, 프로세스 간 자원을 공유하지 않는다.

   - 스레드 : 프로세스 내에서 실행되는 작업의 단위, 부모 프로세스의 자원을 각각의 스레드가 공유한다.

                  노드는 14버전부터 멀티 스레드가 사용 가능해졌다.

 

  ⇒ 노드 프로세스는 멀티 스레드지만 직접 다룰 수 있는 스레드는 하나이기 때문에 싱글 스레드라고 표현한다.

     다만 특정한 조건이 맞춰지면 여러 스레드가 동시에 수행된다.

  노드는 주로 멀티 스레드 대신 멀티 프로세스를 활용한다.  

  

 4) 싱글 스레드

  ⇒ 싱글 스레드는 주어진 일을 한번에 하나씩밖에 처리할 수 없는 것을 의미한다.

    : 블로킹(점유)이 발생하는 경우 나머지 작업은 모두 대기해야 하므로 효율적이지 않다.

      식당과 비교하자면 점원(스레드)이 한명이고 손님(일)이 여럿을 때 주문(요청)과 서빙(응답)은

      모든 손님에게 동시에 이뤄지는 게 아니라 손님(일) 한 사람에게만 응대(블로킹) 가능하기 때문이다.

 

 ⇒ 노드는 논 블로킹(비점유) 모델을 채택하여 일부 코드(I/O)를 백 그라운드(다른 프로세스)에서 실행이 가능하다.

    모든 손님들에게 주문(요청)을 일괄적으로 받고 조리가 끝나는 음식 순서대로 서빙(응답)한다.

    But, I/O 관련 코드가 아닐 경우에는 싱글 스레드, 블로킹 모델과 동일하다.

 5) 멀티 스레드 모델과의 비교

  ⇒ 싱글 스레드 모델은 에러를 처리하지 못하는 경우 멈춘다.  

     대신 프로그래밍 난이도가 낮고, CPU, 메모리 자원을 적게 사용한다.

  멀티 스레드 모델은 에러 발생 시 새로운 스레드를 생성하여 극복한다.

     But, 프로그램의 난이도가 높고 신규 스레드 생성 및 놀고 있는 스레드로 인해

     자원이 많이 필요하며 불필요한 자원낭비가 발생할 수 있다.

 6) 노드 멀티 스레드의 활용

  노드14버전부터 멀티 스레드를 사용할 수 있도록 worker_threads 모듈을 도입했다.

   - 멀티 프로세스 외의 멀티 스레드를 지원하나 싱글 스레드의 장점을 가진 노드에서는 크게 쓰일 일이 없다.

   - 멀티 스레딩 : 하나의 프로세스에서 여러 개의 스레드를 사용, CPU 작업이 많을 때 사용, 프로그래밍 어려움

   - 멀티 프로세싱 : 여러 개의 프로세스를 사용, I/O 요청이 많을 때 사용, 프로그래밍이 멀티스레드보다 상대적으로 쉽다.

    

 

3. 노드의 역할

 1) 서버로서의 노드

  ⇒ 서버 : 네트워크를 통해 클라이언트에 정보나 서비스를 제공하는 컴퓨터 프로그램

  ⇒ 클라이언트 : 서버에 요청을 보내는 주체(브라우저, 데스크탑 프로그램, 모바일 앱, 다른 서버에 요청을 보내는 서버)

     ex) 브라우저(클라이언트)가 네이버 웹 사이트(서버)에 접속

   ex2) 핸드폰(클라이언트)가 앱 스토어(서버)에서 앱 다운로드

 

  ⇒ 노드 != 서버, but 노드는 서버를 구성할 수 있게 하는 모듈을 제공한다.

 

  ⇒ 노드 서버의 장점

   - 멀티 스레드 방식에 비해 컴퓨터 자원을 적게 사용한다.

   - I/O 작업이 많은 서버에 적합하다.

   - 멀티 스레드 방식보다 쉽고 웹 서버가 내장되어 있다.

   - 웹 언어 중 점유율이 가장 높은 javascript 언어를 사용하고 있고 json 형식과 호환하기가 쉽다.

 

  ⇒ 노드 서버의 단점

   - 싱글 스레드라서 CPU코어를 하나만 사용하고 스레드가 하나뿐이라 멈추지 않도록 잘 관리해야 한다.

   - CPU 작업이 많은 서버로는 부적합하다.  성능이 어중간하기 때문이다.

    : node 언어의 특성을 모두 활용했을 때 언어의 한계가 다가오며 그때 성능이 부족할 경우 node를 다른 것으로 변경처리

   - 서버의 규모가 커졌을 때 서버를 관리하기 어렵다.

 

  ⇒ 노드는 CPU 작업을 위해 AWS Lambda나 Google Cloud Functions 같은 별도 서비스를 사용한다.

  ⇒ 노드는 페이팔, 넷플릭스, 나사, 월마트, 링크드인, 우버 등에서 메인 또는 서브 서버로 사용되고 있다.

 2) 서버 외의 노드

  ⇒ 노드는 자바스크립트 런타임이기 때문에 용도가 서버로만 한정되지 않는다.

  ⇒ 웹, 모바일 데스크탑 애플리케이션에도 사용된다.

   - 노드 기반의 웹 프레임워크 : Angular, React, Vue, Meteor

   - 노드 기반의 모바일 앱 프레임워크 : Electron(Atom, Slack VSCode, Discord 등 제작)