ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Node.js] Node.js 개념 정리하기
    Language/JavaScript 2023. 7. 6. 16:32

     

     

     

    📌 Node.js 란? 

    Node.js 는 Chrome V8 JavaScript 엔진으로 빌드 된 JavaScript 런타임입니다.
    ( Chrome Web Browser는 V8엔진이 탑제된 JavaScript Runtime 이다 )

     

     

    [JavaScript] JavaScript Engine / Runtime 개념 및 작동 방식 이해하기

    📌 JavaScript Engine 과 Runtime 이해하기 ⚡ JavaScript 란 무엇인가? 자바스크립트는 객체 기반의 스크립트 프로그래밍 언어이다. 이 언어는 웹 브라우저 내에서 주로 사용되며, 다른 응용 프로그램의

    hhsit.tistory.com

     

    즉, 노드를 통하여 다양한 자바스크립트 애플리케이션을 실행할 수 있으며, 서버를 실행하는데 많이 사용되는 것이다.

     

      ▪  Node.js는 JavaScript를 서버에서도 사용할 수 있도록 만든 프로그램이다. ( 기존에는 클라이언트 단에서만 사용했다 )

      ▪  Node.js는 V8이라는 JavaScript 엔진 위에서 동작하는 자바스크립트 런타임 ( 환경 )이다.

      ▪  Node.js는 서버사이드 스크립트 언어가 아니라 환경이다.

      ▪  Node.js는 웹 서버와 같이 확장성 있는 네트워크 프로그램을 제작하기 위해 만들어졌다.

     

    Node.js는 확장성이 있는 네트워크 어플리케이션 개발에 사용되는 소프트웨어 플랫폼이다.

    특히 서버사이드에서 많이 사용되며, 사용되는 언어로는 자바스크립트를 활용하고,

    Non-blocking I/O와 단일 스레드 이벤트 루프를 통해 높은 처리 성능을 가진다.

     

    내장 HTTP 서버 라이브러리를 포함하고 있어 웹 서버에서 아파치와 같은 별도 소프트웨어 없이 동작이 가능하고,

    이를 통하여 웹 서버의 동작에 있어 더 많은 통제에서 벗어나 여러 가지 기능을 가능하게 한다.

     

    즉, Node.js를 통해 웹 어플리케이션이 더욱 발전하게 되었으며,

    정적인 홈페이지 뿐만 아니라 다양하게 데이터가 변해가는 사이트를 만들 수 있게 했으며,

    웹 상에서 여러 프로그램 및 게임을 구동시킴으로써 각 플랫폼의 제약을 벗어나 어디든 상관없이 실행 가능하게 해주었다.

     

    물론 단순히 웹에서 실행 가능한 게임을 만들려면 JavaScript 만으로도 가능하지만,

    좀 더 진화된 프로그램으로 실시간 온라인 채팅 및 게임 ( 실시간 기능 )을 넣거나, 로그인, 점수 등 데이터 베이스 기능을 

    Node.js를 통해 만들 수가 있는 것이다.

     

    ⚡ Node.js 효과

      ▪  Node.js는 JavaScript를 기반의 런타임이고,

           JavaScript는 스크립트 언어이기 때문에 웹 브라우저 프로그램 안에서만 동작을 한다.

           ( 즉, 웹 브라우저가 없으면 사용 할 수가없다 )

      ▪  그래서!! JavaScript를 웹 브라우저에서 독립시킨 것으로 Node.js를 설치하게 되면

           터미널프로그램에서 Node.js를 입력하여 브라우저 없이 바로 실행할 수 있다.

      ▪  이렇게 Node.js를 이용하여 웹 브라우저와 무관한 JavaScript 프로그램을 만들 수 있게 된 것이다.

           이것이 중요한 이유는 Node.js를 이용하여 서버를 만들 수 있다는 것이다.

      ▪  요약하면 이전까지 Server-Client 웹 사이트를 만들 때 웹에서 표시되는 부분은 JavaScript를 사용하여 만들어야 했는데, (서버=Java..등)

           마침내 Node.js를 통해 한 가지 언어로 전체 웹 페이지를 만들 수 있게 된 것이다.

     

     

    📌 JavaScript Engine 

    자바스크립트 엔진은 자바스크립트 코드를 해석하고 실행하는 인터프리터이다.

    대중적으로 알려진 엔진은 구글의 V8엔진 ( 오픈 소스 JavaScript 엔진 중 하나로 웹어셈블리 엔진이다 )으로

    Chrome Web Browser, Node.js 등에서 사용된다.

    자바스크립트 엔진은

    메모리 힙 ( 변수와 객체의 메모리 할당이 발생하는 곳 )과 콜 스택 ( 코드가 실행될 때마다 호출 스택이 쌓이는 곳 )으로 이루어져 있다.

    setTimeout, DOM, AJAX 등과 같은 비동기 메소드가 없다.

     

    다양한 엔진 : SpiderMonkey ( FireFox ) / Webkit ( Safari ) / Chakra ( IE, Edge )

     

    ⚡ Compiler vs Interpreter

    Compiler

      ▪  고급 언어로 작성된 프로그램 전체를 목적 프로그램으로 번역한 후, 컴퓨터에서 실행 가능한 프로그램으로 생성한다.

      ▪  번역, 실행 과정이 필요하여 과정이 번거롭고 번역 시간이 길지만, 한 번 작업한 뒤에는 실행 속도가 빠르다.

      ▪  컴파일러를 사용하는 언어에는 C, Java 등이 있다.

    Interpreter

      ▪  고급 언어로 작성된 프로그램을 한 줄 단위로 번역하고 실행시키는 프로그램이다.

      ▪  프로그램이 직접 실행되어 목적 프로그램이 생성되지 않는다.

      ▪  줄 단위로 번역 및 실행되어 시분할 시스템에 유용하며 원시 프로그램에 대응이 유용하다.

      ▪  번역 속도는 빠르지만 프로그램 실행 시 매번 번역해야 하므로 실행 속도가 느리다.

      ▪  CPU의 사용 시간 낭비가 크다.

      ▪  인터프리터를 사용하는 언어에는 Python, BASIC, SNOBOL, LISP, APL 등이 있다.

     

     

    📌 JavaScript Runtime 

    런타임이란 프로그래밍 언어가 구동되는 환경을 말한다.

    즉, Node.js는 JavaScript 프로그램을 컴퓨터에서 실행할 수 있게하는 실행기라는 것이다.

    이러한 JavaScript Runtime에는 Web Browser ( Chrome, FireFox ) 프로그램과 Node.js 가 있다.

    setTimeout, DOM, AJAX 등과 같은 비동기 메소드가 있다.

    이벤트 루프와 콜백 큐를 가지고 있다.

     

     

    [JavaScript] 동기(Synchronous) - 비동기(Asynchronous) / 블로킹(Blocking) - 논블로킹(Non-blocking)

    📌 동기 ( Synchronous ) 와 비동기 ( Asynchronous ) 동기 방식은 요청한 작업에 대해 완료 여부를 따져 순차대로 처리하는 것이고,비동기 방식은 요청한 작업에 대해 완료 여부를 따지지 않고 다음 작

    hhsit.tistory.com

     

     

    📌 Node 특징 

    ⚡ Single Thread

    JavaScript 코드는 동시에 실행될 수 없다. 싱글 스레드 기반이기 때문이다.

    코어가 여러개 있어도 메인 스레드라고 하는 싱글 스레드에서만 작업을 수행할 수 있다.

    노드를 실행하면 먼저 프로세스가 하나 생성되고, 그 안에서 여러 개의 스레드가 생성되지만

    직접 제어할 수 있는 스레드는 하나 뿐이다. 그래서 싱글 스레드로 여겨진다.

    이 떄, 싱글 스레드는 하나의 Heap 영역과 하나의 Call Stack을 가진다. ( 한 번에 한 가지 일만 할 수 있다, 동기적으로 처리한다)

     

    Process

      ▪  OS에서 할당하는 작업의 단위. 프로세스 간에는 메모리 등의 자원 공유 안함.

      ▪  노드나 웹 브라우저 같은 프로그램은 개별적인 프로세스이다.

    Thread

      ▪  프로세스 내에서 실행되는 흐름의 단위. 프로세스는 스레드를 여러 개 생성하여 작업을 동시 처리 가능.

           또한 부모 프로세스의 자원을 공유하여 같은 주소의 메모리에 접근이 가능함. ( 데이터 공유 가능 )

     

    ⚡ Event-driven

    노드는 V8 엔진과 더불어 libuv라는 라이브러리를 사용한다.

    libuv 라이브러리는 노드의 특성인 이벤트 기반, 논 블로킹 I/O 모델을 구현하고 있다.

    이벤트 기반 ( Event-driven )이란 이벤트가 발생할 때 미리 지정해둔 작업을 수행하는 방식을 말한다.

    즉, 이벤트 기반 시스템에서는 특정 이벤트가 발생할 때 무엇을 할지 미리 등록해두고, 이를 이벤트 리스너에 콜백함수로 등록한다.

    이후 이벤트가 발생하면 리스너에 등록해둔 콜백 함수를 호출하며, 이벤트가 끝난 후 노드는 다음 이벤트가 발생 할 때까지 대기한다.

     

    ⚡ Event Loop

    이벤트 루프는 여러 이벤트가 동시에 발생했을 때 어떤 순서로 콜백함수를 호출 할 지를 판단하는 역할을 한다.

    노드는 이벤트가 종료될 때까지 이벤트 처리를 위한 작업을 반복하므로 루프라고 부른다.

     

    콜 스택과 콜백 큐를 주시하면서 콜 스택이 비어있으면 큐의 첫 번째 콜백 큐에 있는 콜백을 콜 스택에 넣어주는 역할을 한다.

    Web API의 콜백이 완료되었다면 콜백은 큐에 쌓이게 되고, 이벤트 루프에 의해서 실행되는 것이다.

    모든 종류의 Web API는 동일한 방식으로 동작하며, 이 과정은 비동기 함수가 호출되는 방식이다.

     

    ⚡ Non-Blocking I/O Model

    이벤트 루프를 잘 활용하면 오래 걸리는 작업을 효율적으로 처리할 수 있다.

    작업에는 두 가지 종류가 있는데 동시에 실행될 수 있는 작업과 없는 작업이다.

    특히 파일 시스템 접근, 네트워크를 통한 요청 작업은 입력(Input)/출력(Output)의 일종이며,

    이러한 작업을 할 때 노드는 비동기 방식으로 블로킹을 만들지 않게 끔 ( 논-블로킹 ) 처리한다.

     

    풀어서 이야기하면 함수 호출 시 당장 실행시키는 것이 아니라 ( 동기-블로킹 )

    일단 어느 곳에 쌓아 놓고 동시에 요청을 처리하고 ( 비동기-논 블로킹 ) 요청이 완료된 순서대로 처리 ( 스택 이용 ) 한다는 말이다.

     

    ⚡ JavaScript - Synchronous / Blocking

    싱글 스레드는 동기적으로 처리되기 때문에 블로킹을 만든다.

     

    ⚡ JavaScript - Asynchronous / Non-Blocking

    웹 브라우저 Web APIs에는 DOM, Ajax, setTimeout 요청이 있고, 이벤트 루프와 콜백 큐를 가지고 있다.

    JavaScript 자체는 비동기적으로 요청을 처리할 수 없기 때문에, 런타임 안에 지원하는 API로 비동기 요청을 처리할 수 있게 하는 것이다.

     

     

    📌 내용 정리 

    노드는 JavaScript 기반이기 때문에 기본적으로 싱글 스레드, 논 블로킹 모델을 사용하므로

    I/O 요청이 많이 발생하면 노드를 서버로 사용하는 것이 좋다.

    하지만 노드는 CPU 부하가 큰 작업에는 적합하지 않다.

     

    우리가 작성하는 코드는 모두 스레드 하나에 처리되기 때문에 코드가 CPU 연산을 많이 요구하면스레드 하나가 감당하기 어렵다.

     

    즉, 개수는 많지만 크기는 작은 데이터를 실시간으로 주고 받는데 노드는 적합하다.

    예를 들어 네트워크나 데이터베이스, 디스크 작업 같은 I/O에 특화되어있다.

    실시간 채팅, 주식 차트도 포함된다.

     

    결론적으로 노드의 장점은

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

    2. I/O 작업이 많은 서버로 적합하다.

    3. 웹 서버가 내장되어 있어 별도의 웹 서버를 설치할 필요가 없다.

    4. 자바스크립트를 사용하기 때문에 JSON 형식과 쉽게 호환된다.

     

     

     

     

     

    📌 Reference 

    @hanamon - [Node.js] 개념 이해하기

    https://hanamon.kr/

    @yoonhu.log : velog - [기술면접] JavaScript 런타임 작동방식, 비동기와 이벤트 루프

    https://velog.io/@ahsy92

    @ru_bryunak : velog - 자바스크립트 기초 1 (자바스크립트 엔진)

    https://velog.io/@ru_bryunak

    @coding-factory : tistory - 컴파일러와 인터프리터란 무엇인가?

    https://coding-factory.tistory.com/

    @codestates - 문서 객체 모델 DOM 과 자바스크립트 JavaScript | 생성 방식 및 접근 방법

    https://www.codestates.com/blog/content/dom-javascript

     

     

     

     

     

     

    댓글

Designed by IT's H.H.