본문 바로가기
나의 개발일지/node.js

[nodejs | 노드js] node.js란?

by stella_gu 2022. 6. 28.

node.js 공식문서를 보자!

영어지만..
우리에겐 파파고가 있다!

Node.js is an open-source and cross-platform JavaScript runtime environment.
It is a popular tool for almost any kind of project!

그렇다 node.js는 서버가 아니다.
자바스크립트 런타임이다!


Node.js runs the V8 JavaScript engine, the core of Google Chrome, outside of the browser.
This allows Node.js to be very performant.

구글 크롬의 V8 자바스크립트 엔진을 사용해 그 위에서 돌아가는 JS 런타임(실행기라 보면 됨)
-> V8 엔진을 크롬 브라우저 밖에서도 돌아가게 하여 자바스크립트로 작성된 서버를 실행할 수 있게 해줌.



A Node.js app runs in a single process, without creating a new thread for every request.
Node.js provides a set of asynchronous I/O primitives in its standard library that prevent JavaScript code from blocking and generally, libraries in Node.js are written using non-blocking paradigms, making blocking behavior the exception rather than the norm.

When Node.js performs an I/O operation, like reading from the network, accessing a database or the filesystem, instead of blocking the thread and wasting CPU cycles waiting, Node.js will resume the operations when the response comes back.

This allows Node.js to handle thousands of concurrent connections with a single server without introducing the burden of managing thread concurrency, which could be a significant source of bugs.
Node.js has a unique advantage because millions of frontend developers that write JavaScript for the browser are now able to write the server-side code in addition to the client-side code without the need to learn a completely different language.

In Node.js the new ECMAScript standards can be used without problems, as you don't have to wait for all your users to update their browsers - you are in charge of deciding which ECMAScript version to use by changing the Node.js version, and you can also enable specific experimental features by running Node.js with flags.

이상 좋은 말만 쓰여 있을 것임.


 

 

 

[노드의 특성]

 

※ 노드는 V8과 libuv를 내부적으로 포함.

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


1. 이벤트 기반 (event-driven)

  • 이벤트가 발생할 때 미리 지정해둔 작업을 수행하는 방식
  • 이벤트 리스너(이벤트를 등록하는 함수)에 콜백 함수(이벤트가 발생했을 때 실행될 함수)를 등록 해놓고, 이벤트(클릭, 네트워크 요청, 타이머 등) 발생 시 등록된 콜백함수 호출.

2. 논블로킹 I/O

  • 논블로킹 : 블로킹 방식(I/O가 진행되는 동안 유저 프로세스는 입력 데이터가 없으면 다른 작업은 수행하지 못하고 대기)의 비효율성을 보완하는 방식
  • I/O : Input, Output의 약자로 데이터를 전송하는 프로그램이나 장치를 뜻함. 대부분 장치는 Input과 Output이 함께 발생하지만, Output만 발생하는 프린터, Input만 발생하는 키보드, 마우스 같은 장치도 존재.
  • 노드는 '동기(synchronous)이면서 블로킹', '비동기(asynchronous)이면서 논블로킹' 2가지 존재.
  • 노드에선 논블로킹 I/O 방식 하에, 오래 걸리는 함수를 백그라운드로 보내서 다음 코드가 먼저 실행되게 하고, 나중에 오래 걸리는 함수를 실행하여 일부 코드를 백그라운드에서 병렬로 실행되게 함. (동시에 돌아감)
  • 일부 코드 : I/O 작업(input/output과 관련된 http, Database CRUD, 네트워크 요청), fs 모듈(file system), 압축, 암호화 등.
  • 나머지 코드는 블로킹 방식으로 실행됨.
  • I/O 작업이 많을 때 노드 활용성이 극대화.

블로킹 vs 논블로킹





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

  • 노드는 주로 멀티 스레드 대신 멀티 프로세스 활용
  • 싱글 스레드로 동작하지 않는 두 가지 경우 : 스레드풀(Thread Pool - 암호화, 파일 입출력, 압축 등), 워커 스레드(Worker Thread)
  • 노드의 핵심은 싱글 스레드를 어떻게 효율적으로 잘 관리하느냐!

 

  1. 프로세스 : 운영체제에서 할당하는 작업의 단위, 프로세스 간 자원 공유X
  2. 스레드 : 프로세스 내에서 실행되는 작업의 단위, 부모 프로세스 자원 공유

프로세스와 스레드

 

※ 싱글 스레드는 주어진 일을 하나밖에 처리하지 못함

→ 블로킹이 발생하는 경우 나머지 작업은 모두 대기해야 함

→ 비효율 발생

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

    백그라운드(OS 커널 혹은 libuv의 thread pool)에서 수행하고, 이를 비동기 콜백함수로 이벤트 루프에 전달.

 

cf) libuv의 이벤트 루프 - 싱글 스레드 / 스레드 풀 - 멀티 스레드

 

 

▼ 싱글 스레드, 논 블로킹 모델을 식당에 비유

  • 점원(스레드)이 일단 주문(요청)을 한꺼번에 받아서 → 요리를 모두 끝낸 후 → 한꺼번에 서빙(응답) 
  • 고객이 많아지면 점원(스레드)의 과로(과부하)가 올 수 있으므로 점원(스레드) 관리가 매우 중요!
  • 고객이 많아질 경우 점원(스레드)이 한 명인 체인점(노드 프로세스)을 여러 개 두는 방법도 있음 → 멀티 프로세싱 

 

멀티 스레딩 멀티 프로세싱
하나의 프로세스 안에서 여러 개의 스레드 사용 여러 개의 프로세스 사용
CPU 작업이 많을 때 사용 I/O 요청이 많을 때 사용
프로그래밍이 어려움 프로그래밍이 비교적 쉬움

 

 

  • 그렇다면 점원을 여러명(멀티 스레드) 두어 손님이 한 명 올 때마다 점원도 한명씩 붙여주면 더 빠르고 효과적이지 않을까?
  • 점원 한명에게 문제가 생겨도 다른 점원으로 대체 가능하다는 장점도 있다.
  • But, 손님이 줄어들 경우 일을 하지 않고 노는 점원이 생기는 것도 문제가 됨.
  • 해고 하지 않아도 비용 문제가 들고, 해고 한다고 해도 비용 문제, 또 손님이 늘었을 때 새로 고용하는 데도 또 비용문제가 듦.

 

 

[서버로서의 노드]

  • 서버 : 네트워크를 통해 클라이언트에 정보나 서비스를 제공하는 컴퓨터 또는 프로그램
  • 클라이언트 : 서버에 요청을 보내는 주체(브라우저, 데스크탑 프로그램, 모바일 앱, 다른 서버에 요청을 보내는 서버)
  • e.g. 브라우저(클라이언트, 요청)가 구글 웹사이트(서버, 응답)에 접속
  • e.g. 핸드폰(클라이언트)을 통해 앱스토어(서버)에서 앱 다운로드
  • 노드는 서버가 아니지만, 서버를 구성할 수 있게 하는 모듈을 제공.

 

▼ 노드 서버의 장단점

장점 단점
멀티 스레드 방식에 비해 컴퓨터 자원을 적게 사용함 싱글 스레드라서 CPU 코어를 하나만 사용함
서버는 일반적으로 I/O 요청이 많이 발생하므로, I/O 처리를 잘하는 노드는 서버로 사용하기 적합 CPU 작업이 많은 서버로는 부적합 (e.g. 이미지, 비디오 처리 / 대규모 데이터 처리)
멀티 스레드 방식보다 쉬움 하나뿐인 스레드가 멈추지 않도록 관리해야 함
웹 서버가 내장되어 있음 서버 규모가 커졌을 때 서버를 관리하기 어려움 (웬만한 서버의 단점)
자바스크립트를 사용함 어중간한 성능
JSON 형식과 호환하기 쉬움  
  • 개수는 많지만 크기는 작은 데이터를 실시간으로 주고받는 데 적합.
  • 예) 실시간 채팅 애플리케이션, 주식 차트, JSON 데이터를 제공하는 API서버 (JSON은 JS 형식이므로)

 

[서버 외의 노드]

- JS 런타임이므로 용도가 서버에만 한정되지 않음

 

▼ 웹, 모바일, 데스크탑 애플리케이션에도 사용 (아래 프레임워크 모두 노드 기반으로 동작)

  • 웹 프레임 워크 : Angular, React, Vue, Meteor 등
  • 모바일 앱 프레임워크 : React Native
  • 데스크탑 개발 도구 : Electron(Atom, Slack, Vscode, Discord 등 제작)

 

 

 

 

더 자세한 건 코드를 보며 공부하자!

 

 

 

[참고] Node.js 교과서 https://www.aladin.co.kr/shop/wproduct.aspx?ItemId=246391275&start=slayer

 

Node.js 교과서

프런트부터 서버, 데이터베이스, 배포까지 아우르는 광범위한 내용을 다룬다. 군더더기 없는 직관적인 설명으로 기본 개념을 확실히 이해하고, 노드의 기능과 생태계를 사용해보면서 실제로 동

www.aladin.co.kr

[참고] 인프런 Node.js 교과서 강의 https://www.inflearn.com/course/%EB%85%B8%EB%93%9C-%EA%B5%90%EA%B3%BC%EC%84%9C

 

[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지 - 인프런 | 강의

노드가 무엇인지부터, 자바스크립트 최신 문법, 노드의 API, npm, 모듈 시스템, 데이터베이스, 테스팅 등을 배우고 5가지 실전 예제로 프로젝트를 만들어 나갑니다. 최종적으로 클라우드에 서비스

www.inflearn.com