[node.js] Node.js는 무엇일까?

muz·2021년 4월 2일
1
post-thumbnail

Node.js, 넌 누구니 🙄

Node.js는 chrome V8 JavaScript Engine으로 빌드된 JavaScript Runtime이다.
즉, 언어서버가 아닌 서버의 역할도 수행할 수 있는 자바스크립트 런타임이다!

🥱 Runtime은 뭔데?
: Runtime은 프로그래밍 언어가 구동되는 환경으로, 쉽게 말해 실행기라고 생각하면 된다.

그 전까지만 해도 HTML을 이용해야만 JavaScript의 실행이 가능했다. 그러나, Node.js가 등장하면서 HTML 없이도 JavaScript의 실행이 가능해졌다. 또한 Node.js는 HTTP/ HTTPS/ HTTP2 모듈을 제공해주기 때문에 서버를 구축하는 것도 가능해졌다.

📌Tip: TypeScript의 런타임은 Deno이다.

Runtime?

런타임은 특정 언어로 만든 프로그램들을 실행할 수 있게 해주는 가상 머신의 상태를 말한다.
즉, node.js는 JavaScript로 만든 프로그램들을 실행할 수 있게 해준다.
ex) 웹 브라우저(크롬, 엣지, 사파리, 파이어폭스 등)

🙄 잠깐! Java와 JavaScript로 비교해보는 언어, 엔진 그리고 런타임

  • 언어: Java / JavaScript
  • 각 언어의 엔진: JRE / Chrome V8
  • 위의 것을 돌리는 런타임: JDK / Node.js

내부 구조

크롬 V8 엔진은 2008년에 출시되었다. node.js는 V8과 libuv를 내부적으로 포함한다.

  • V8 엔진: 오픈 소스 자바스크립트 엔진 → 속도 문제를 개선함
  • libuv: 노드의 특성인 이벤트 기반, 논블로킹, I/O 모델을 구현한 라이브러리

특성

1. 이벤트 기반

이벤트(ex. 클릭, 네트워크 요청, 타이머 등)란, 어떤 동작을 할 때 다른 동작이 일어나는 것을 말한다. node.js는 이벤트가 발생할 때 미리 지정해둔 작업을 수행한다.

함수명설명
EventListener()이벤트를 등록하는 함수
callback()이벤트가 발생했을 때 실행될 함수

2. 논 블로킹 I/O

🙄 논.. 논 블로킹이요?
: 논 블로킹이란 오래 걸리는 함수를 background로 보내서 다음 코드가 먼저 실행되게끔 하고, 나중에 오래 걸리는 함수를 실행하는 것이다.

Node.js는 논 블로킹 방식 하에 일부 코드(입출력 작업, 압축, 암호화 등)는 background에서 병렬로 실행되고, 나머지 코드는 블로킹 방식으로 실행된다.

3. 프로세스와 스레드

🙄 프로세스와 스레드 알아보기?

  • 프로세스: OS에서 할당하는 작업의 단위로 프로세스 간 자원 공유가 없음
  • 스레드: 프로세스 내에서 실행되는 작업의 단위로 부모 프로세스 자원을 공유함

node 프로세스는 사실 멀티 스레드이지만, 직접 컨트롤 가능한 스레드는 하나뿐이다. 때문에 싱글 스레드라고 표현한다. 노드는 주로 멀티 프로세스를 활용한다.
→ 노드를 실행하면 프로세스가 뜨고, 이 프로레스 안에서 하나의 탭만 띄울 수 있는 것과 같다.

4. 싱글 스레드

위에서 말했듯이, 노드는 직접 컨트롤 가능한 스레드가 하나뿐이라 싱글 스레드라고 했다.
때문에 주어진 일을 하나밖에 처리하지 못한다.
만약 블로킹이 발생하는 경우, 나머지 작업은 모두 대기해야 하므로 비효율이 발생한다. 이 대신, 논 블로킹 모델을 이용하여 일부 코드(입출력)를 background(다른 프로세스)에서 실행할 수 있다. 요청을 먼저 받고, 완료될 때 응답한다.
→ 단, 입출력 관련 코드가 아닌 경우 싱글 스레드, 블로킹 모델과 같아진다.

🙄 스레드 1개는 CPU의 코어 1개를 차지한다.

5. 싱글 스레드와 멀티 스레드 모델

🙄 싱글 스레드 모델과 멀티 스레드 모델 알아보기

  • 싱글 스레드 모델
    : 에러를 처리하지 못하는 경우 멈추게 됨. 프로그래밍이 쉽고, CPU와 메모리 자원을 적게 사용함
  • 멀티 스레드 모델
    : 에러 발생 시 새로운 스레드를 생성해서 극복함. 단, 새로운 스레드 생성 또는 놀고 있는 스레드 처리에 비용이 발생하며, 프로그래밍이 어렵고 스레드 수만큼 자원을 많이 사용함

node 14 버전에서는 멀티 스레드를 사용할 수 있도록 worder_threads 모듈을 도입했다. CPU를 많이 사용하는 작업에서 활용 가능하다고 한다.

하는 일?

node.js의 역할은 크게 서버서버 외로 나누어서 볼 수 있다.

🙄 Client와 Server?

  • Client: server에 요청을 보내는 주체
    (ex. 브라우저, 데스크탑 프로그램, 모바일 앱, 다른 서버에 요청을 보내는 서버 등)
  • Server: 네트워크를 통해 Client에 정보나 서비스를 제공하는 컴퓨터 또는 프로그램

서버로서의 노드

노드는 서버가 아니지만 서버를 구성할 수 있는 모듈을 제공한다.
노드로 서버를 제공하는 곳들에는 페이팔, 넷플릭스, 나사, 링크드인 등이 있다.

노드로 서버를 만들었을 때의 장단점

장점
1. 멀티 스레드 방식에 비해 컴퓨터 자원을 적게 사용함
2. I/O작업이 많은 서버로 적합함
3. 멀티 스레드 방식보다 구현이 쉬움
4. 웹 서버가 내장되어 있음
5. JavaScript를 사용함
6. JSON형식과 호환이 쉬움

단점
1. 싱글 스레드라서 CPU 코어를 1개만 사용함
2. CPU 작업이 많은 서버로는 적합하지 않음
3. 하나뿐인 스레드가 멈추지 않게끔 관리해야 함
4. 서버의 규모가 커졌을 때, 서버 관리가 어려움

서버 외의 노드

node.js는 JavaScript runtime이기 때문에 용도가 서버에만 한정되는 것이 아니다.
웹, 모바일, 데스크탑 애플리케이션에서도 사용한다. 다음의 프레임워크가 노드 기반으로 동작한다.

  • Web FrameWork: Angular, React, Vue ...
  • Mobile App FrameWork: React Native
  • Desktop development tool: Electron (Atom, slack, vscode, discord..)
profile
Life is what i make up it 💨

0개의 댓글