본문 바로가기
Front END

Node.js 란?

by Ropung 2023. 2. 27.
Node.js는 Chrome V8 JavaScript 엔진으로 빌드 된 JavaScript 런타임입니다.
(런타임이란 프로그래밍 언어가 구동되는 환경입니다.)

 

Node.js는...

Edition 규격의 C++로 만들었습니다.

  • JavaScript서버에서도 사용할 수 있도록 만든 프로그램
  • V8이라는 JavaScript 엔진 위에서 동작하는 자바스크립트 런타임(환경)에서 구동합니다.
  • 스크립트 언어가 아닌 프로그램(환경)
  • 웹서버와 같이 확장성 있는 네트워크 프로그램을 제작하기 위해 만들어졌습니다.
  • 이전까지 Server-Client 웹사이트를 만들 때 웹에서 표시되는 부분은 JavaScript 를 사용하여 만들어야만 했으며, 서버는 Ruby, Java 등 다른 언어를 써서 만들었어야 했는데 마침내 한 가지 언어로 전체 웹페이지를 만들 수 있게 되었습니다.
  • 사용되는 언어로는 자바스크립트(Javascript)를 활용하며, Non-blocking I/O단일 스레드 이벤트 루프를 통한 높은 처리 성능을 가지고 있는 것이 특징입니다.
  • 내장 HTTP 서버 라이브러리를 포함하고 있어 웹 서버에서 아파치 등의 별도 소프트웨어 없이 동작하는 것이 가능하며, 이를 통한 웹 서버의 동작에 있어 더 많은 통제에서 벗어나 여러 가지 기능을 가능하게 합니다.
  • 정적인 홈페이지 뿐만 아니라 데이터가 변해가는 사이트를 만들 수 있으며, 여러 개발자가 만든 프로그램과 게임을 웹상에서 구동시켜 안드로이드폰, 아이폰, 윈도우PC, 맥 등 플랫폼의 제약에서 벗어나 어디든 상관없이 실행 가능하게 해줍니다.

런타임

  • 자바스크립트 런타임이란 자바스크립트가 구동되는 환경을 말하는데 이러한 자바스크립트 런타임의 종류로는 웹 브라우저(크롬, 파이어폭스, 익스플로러 등)프로그램과 Node.js 라는 프로그램이 있습니다.
  • 이러한 프로그램들에서 자바스크립트가 구동되기 때문에 자바스크립트 런타임이라고 합니다.
  • 즉, 노드를 통해 다양한 자바스크립트 애플리케이션을 실행할 수 있으며, 서버를 실행하는 데 제일 많이 사용됩니다.

V8엔진

  • V8오픈 소스 자바스크립트 엔진 중 하나
  • 자바스크립트 + 웹어셈블리(WebAssembly) 엔진
  • 크롬 웹 브라우저와 Node.js 등에서 사용
  • V8은 자바스크립트를 바이트코드로 컴파일하고 실행하는 방식을 사용
  • 자바스크립트 V8 엔진 소스 안에는 하나의 과 하나의 콜 스택만 있다.
  • setTimeout, DOM, AJAX(HTTP 요청)등과 같은 비동기 메소드가 없다.

  • V8자바 스크립트(javascript) 소스 코드를 가져와서 파서(Parser)에게 넘깁니다.
  • 파서(Parser)는 소스 코드를 분석한 후 AST(Abstract Syntax Tree), 추상 구문 트리로 변환합니다.
    (파싱이라는 개념 자체는 컴퓨터가 분석하기 쉬운 형태추상 구문 트리로 변경하는 작업입니다.)
  • AST에서 변환한것을 Ignition에서 자바스크립트를 바이트코드(Bytecode)로 변환합니다.(인터프리터)
    (원본 코드를 다시 파싱하는 수고를 덜고 코드의 양도 줄이면서 코드실행때 차지하는 메모리 공간도 아낄수 있게 됩니다.)
    (바이트 코드(Bytecode)는 고급 언어로 작성된 소스 코드를 가상머신이 쉽게 이해할 수 있도록 중간 코드로 한번 컴파일 한 것을 의미합니다.)
    정리하면 Ignition은 코드가 한줄한줄 실행될 때마다 코드를 바이트 코드로 바꿔주는 역할입니다.
  • 변환된 코드를 실행함으로써 소스코드가 작동하게 되며, 자주 사용되는 코드는 TruboFan으로 보내집니다.
  • Optimized Machine Code(최적화된 컴퓨터 코드) 뜻 그대로 다시 컴파일되며 그러다가 다시 사용이 덜되면 Deoptimizing 하기도 합니다.

 

V8 네이밍

  • V8은 원래 8기통 엔진의 종류를 의미하는 단어입니다. 제네시스 G90이나 기아 K9같은 차에 들어갑니다.
  • Ignition는 엔진에 시동걸 때 사용하는 점화기입니다. 즉 소스 코드가 점화됩니다.
  • 너무 많이 호출되서 내 코드가 뜨거워지면 TurboFan으로 최적화 해주는 의도라고 볼 수 있습니다.
  • 사용되지 않으면 Deoptimizing 최적화 해제 합니다.

참고: https://evan-moon.github.io/2019/06/28/v8-analysis/

 

웹 어셈블리(WebAssembly)

  • C나 C++와 같은 프로그래밍 언어를 컴파일해서 어느 브라우저에서나 빠르게 실행되는 형식으로 바꿔주는 기술을 뜻합니다.
  • 보통 웹 애플리케이션 개발시에는 JavaScript 프로그래밍 언어를 사용해 동적인 부분을 개발하지만 C나 C++ 언어들에 비해서는 느립니다.
  • 게임이나 동영상 편집 등과 같은 고성능 웹 애플리케이션을 개발할 때 브라우저의 동작을 빠르게 하기 위해서 C나 C++와 같은 언어로 개발 할 수 있게 하는 것입니다.
  • 고성능 웹 애플리케이션 개발 시 자바스크립트와 같이 사용되고, 자바스크립트를 대체하는 것이 아니라 보완하는 기술입니다.

 

자바스크립트 런타임 웹 브라우저의 Web APIs

  • setTimeout, DOM, AJAX(HTTP 요청)가 있다.
  • 이벤트 루프와 콜백 큐를 가지고 있다.

 

자바스크립트와 비동기

  • 자바스크립트는 싱글 스레드 프로그래밍 언어입니다.
  • 스레드의 사전적 의미한 가닥의 실이라는 뜻입니다.
  • 한 가지 작업을 실행하기 위해 순차적으로 실행한 코드를 실처럼 이어 놓았다고 해서 유래된 이름입니다.
  • 싱글 스레드하나의 프로그램에서 동시에 하나의 코드만 실행할 수 있다는 뜻입니다.
  • 자바스크립트는 한번에 하나의 콜 스택(call stack)만을 가집니다. 한 가지 일만 처리 할 수 있다는 뜻입니다.
  • 싱글 스레드란 코드가 실행되서 끝난 지점과 다음 코드의 시작 지점이 연결된 형태입니다.
  • 각 스레드는 한 번에 하나의 작업만 수행할 수 있습니다.
  • 각 작업은 순차적으로 실행되며 다음 작업을 시작하기 전에 이전작업이 완료되어야 합니다.
  • 동시에 돌릴 수 있는 스레드 수는 컴퓨터에 있는 코어 갯수로 제한됩니다.

 

프로세스 스레드 멀티스레드

  • 프로세스란 운영 체제에서 실행 중인 하나의 애플리케이션을 프로세스라고 합니다.
  • 사용자가 앱을 실행하면 운영체제로부터 실행에 필요한 메모리를 할당 받아 앱코드를 실행하는데 이때 실행되는 앱을 프로세스라합니다.
  • 멀티 프로세스가 앱 단위 멀티 테스킹이라면 멀티 스레드는 앱내부에서의 멀티 테스킹입니다.
  • 멀티 코어 환경에서 여러 개의 스레드가 동시에 수행됩니다.

 

힙과 콜 스택

  • 은 변수와 객체의 메모리 할당에 사용되는 비정형 메모리입니다.
  • 콜 스택은 코드를 읽고 함수가 실행되는 순서를 기억하고 있습니다.
  • 함수를 실행하려면 스택의 가장 위에 해당 함수를 넣게되고 함수에서 리턴이 일어나면 스택의 가장 위쪽으로 함수를 꺼냅니다.
  • v8 엔진에서 오류가 발생하면 스택 추적을 콘솔에 인쇄합니다.

 

이벤트 루프란?

  • 이벤트 루프(event loop)는 여러 이벤트가 동시에 발생했을 때 어떤 순서로 콜백함수를 호출 할지를 이벤트 루프가 판단합니다.
  • 노드는 이벤트가 종료될 때까지 이벤트 처리를 위한 작업을 반복하므로 루프(loog)라고 부릅니다.
  • 이벤트 루프는 이 전체 시스템에서 아주 단순한 일을 하는 작은 파트입니다.
  • 이벤트 루프역할콜 스택콜백 큐를 주시하는 것입니다.
  • 콜 스택이 비어있으면 큐의 첫 번째 콜백을 스택에 쌓아 효과적으로 실행할 수 있게 합니다.
  • 이벤트 루프는 콜 스택이 비어질 때까지 기다린 후 콜백 큐에 있는 콜백을 콜 스택에 넣어주는 역할을 합니다.
  • Web API의 콜백이 완료되었다면 콜백은 큐에 쌓이게 되고, 이벤트 루프에 의해서 실행됩니다.
  • 모든 종류의 Web API는 동일한 방식으로 동작합니다.
  • 이 과정은 비동기 함수가 호출되는 방식입니다.
  • AJAX RuquestURL로 호출할 때 콜백을 함께 실행하게 됩니다.

 

논 블로킹 I/O

  • 이벤트 루프를 잘 활용하면 오래 걸리는 작업을 효율적으로 처리할 수 있습니다.
  • 작업에는 두가지 종류가 있는데 동시에 실행될 수 있는 작업동시에 실행될 수 없는 작업입니다.
  • 특히 파일 시스템 접근, 네트워크를 통한 요청 작업은 입력(InPut)/출력(OutPut)의 일종이며,
    이러한 작업을 할때 노드는 비동기 방식으로 블로킹을 만들지 않게 끔(논 블로킹) 처리를 합니다.
  • 비동기는 이전 작업이 완료되지 않더라도 대기하지 않고 동시에 작업을 수행하며
    반대로 동기는 이전 작업이 끝나야만 다음 작업을 수행합니다.

 

Node.js의 FrameWork Express

  • Express는 Node.js의 프레임 워크 입니다.
  • 작업을 시작부터 끝까지 라이브러리로 지원한다는 점이 단순 라이브러리와 차이가 나는 부분입니다.
  • JQuery 경우 다양한 용도를 가지고있지만 JQuery자체가 어떠한 목적을 가지고 있진 않습니다.
  • Exprees는 Node.js를 이용해 웹 앱을 만들기 위한 틀(Frame)을 제공하는 라이브러리의 집합입니다.

 

정리하며..

  • 노드는 기본적으로 싱글 스레드, 논 블로킹 모델을 채용하므로 Input과 OutPut 요청이 많이 발생하면
    노드를 서버로 사용하는것이 바람직합니다.
  • 작성하는 코드는 모두 스레드 하나에서 처리되기 떄문에 코드가 CPU 연산을 많이 요구하면 스레드 하나가
    혼자서 감당하기 어렵습니다.
  • 결론적으로 노드의 장점은
    1. 멀티 스레드 방식에 비해 리소스가 적게듭니다.
    2. I/O 작업이 많은 서버로 적합합니다.
    3. 웹 서버가 내장되어 있어 별도의 웹서버를 설치할 필요가 없습니다.
    4. 자바스크립트를 사용하기 떄문에 JSON 형식과 쉽게 호환됩니다.

참고: https://hanamon.kr/nodejs-%EA%B0%9C%EB%85%90-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0/