NodeJS란?

Luvlace·2021년 1월 25일
post-thumbnail

1.노드의 정의


  • 노드는 크롬 V8 자바스크립트 엔진으로 빌드된 자바스크립트(HTML에 종속된 브라우저) 런타임(실행기)이다.

  • 노드는 서버가 아니다, 자바스크립트 엔진도 아니다

    그러나 서버의 역할도 수행할 수 있는 자바스크립트 런타임이다.

    노드가 나와서 HTML없이도 자바스크립트를 실행할 수 있다.

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

    = 자바스크립트는 언어고 노드는 런타임! (JDK같은)

     *(Typescript 런타임은 Deno)*
     

*자바스크립트 지식이 부족할 때마다 확인 (ko.javascript.info)

언어를 익히는데에는 문법과 프로그래밍적 사고가 필요하다, 코딩을 실제로 하면서 익히는게 정답이다

2.노드의 내부 구조

  • 자바스크립트의 내부는 C나 C++로 되어있다 → 생산성이 나빠서 자바스크립트화 시킨 것이다.
  • libuv 비동기 I/O - 싱글쓰레드에 비동기 모델이란 장점이 있다. (멀티쓰레드인 자바에 비해 초보들이 사용하기 쉽다)

3.노드의 특징

-1. 이벤트 기반

클릭, 네트워크, 타이머, 콜백 등을 말한다.

-2.논블로킹 I/O

오래 걸리는 함수를 백그라운드로 보내서 다음 코드가 먼저 실행되게 하고, 나중에 오래 걸리는 함수를 실행하는 것을 말한다.

  • 노드는 블로킹이면서 동기, 비동기면서 논블로킹이다.
  • 노드에서 동시라는 것을 구현하는 것은 매우 어렵다.
  • 논 블로킹 방식 아래에서 일부 코드(I/O 작업: 파일시스템 접근, 네트워크 요청, 압축, 암호화)는 백그라운드에서 병렬로 실행되기도 한다.
  • I/O 작업이 많을 때 노드 활용성이 극대화 된다.

-3.프로세스 VS 스레드

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

    (마치 크롬창의 탭들이 여러가지 있는 것 처럼)

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

-노드는 싱글스레드가 아니다. 멀티 스레드다. 단 노드를 실행하면 여러 스레드가 돌아가지만 그 중 한가지만 컨트롤 할 수 있다. (나머지 스레드들은 동시에 돌아갈 준비를 하고있다.)

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

-노드는 14 버전부터 멀티 스레드 사용이 가능하다.

-4.싱글 스레드

-대신 논 블로킹 모델을 채택하여 일부 코드(I/O)를 백그라운드(다른 프로세스)에서 실행 가능하다

-I/O관련 코드가 아닌 경우 싱글 스레드, 블로킹 모델과 같아진다

-스레드를 활용도 높게 사용하는 것이 제일 중요하다, 부족한 부분을 채우기 위해 멀티 프로세싱을 사용할 수 있다.

  • 점원(스레드)이 하나인 체인점(노드 프로세스)을 여러개로 만든다 (멀티 프로세싱)

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

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

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

*그러나 노드의 키포인트는 싱글 스레드를 어떻게 효율적으로 사용하는데에 집중하는 것이다.



4.노드의 역할

-1.서버로서의 노드

  • 노드는 서버가 아니다 단, 노드는 서버를 구성할 수 있게 하는 모듈이다.

  • 노드 서버의 장단점은 자바스크립트의 장단점과 거의 유사하다.


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

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

    멀티 스레드 방식보다 쉽다.

    웹서버가 내장되어 있다.

    자바스크립트를 사용한다.

    JSON형식과 호환하기 쉽다. (php, c# 등은 변환이 필요하니까 번거롭다)


    단점) 싱글 스레드라 CPU 코어는 하나만 사용한다.

    CPU작업이 많은 서버로는 부적합하다. (이미지 리사이징, 암호화, 알고리즘 등)

    하나뿐인 스레드가 멈추지 않도록 관리해야 한다.

    서버 규모가 커졌을 때 서버를 관리하기가 어렵다. (C++ 추천)

    성능이 어중간하다. (그러나 타언어도 대체적으로 어중간하다.)


  • 넷플릭스, 나사, 링크드인, 우버 등에서는 메인이나 서브 서버로 사용하고 있다.

-2.서버외의 노드

  • 자바스크립트 런타임이기 때문에 용도가 서버에만 한정되지 않는다.
  • 웹, 모바일, 데스크탑 애플리케이션에도 사용된다.

0개의 댓글