[Node.js] 입문하기

kim unknown·2022년 5월 2일
0

JavaScript

목록 보기
15/24
post-thumbnail

0. Node.js 탄생 배경

Web 1.0 시대의 브라우저는 단순히 정보를 뿌리기만 하는 정도의 매우 정적인 체계였다. 그러다가 Web 2.0 시대에 들어서면서 상호간의 양방향 통신이 가능해졌고, 이 시기를 기점으로 무시 받던 자바스크립트의 중요도가 상승했다.

2008년 구글에서 Chrome의 V8엔진이 출시되었다. V8 엔진은 오픈소스로 만들어진 자바스크립트 엔진이다.
이 크롬 V8엔진과 이벤트 처리 라이브러리인 libuv가 결합된 자바스크립트 server-side 언어인 Node.js가 2009년에 Ryan Dahl에 의해서 출시되었다.


1. Node.js란❔

• Node.js는 JavaScript로 브라우저 밖에서 서버를 구축하는 등의 코드를 실행할 수 있게 해주는 런타임 환경이다. (*스크립트 언어가 아니다)
• Node.js는 서버뿐 아니라 모든 영역을 지원한다.
-> Node.js로 가능한 것: 프론트엔드, 백엔드, 모바일 앱, 데스크탑 앱, 머신러닝 등등

Node.js는 JavaScript로 프론트엔드 뿐만 아니라 백엔드까지 개발할 수 있다는 점이 아주 큰 강점이다. 또한, Node.js는 여태까지의 런타임과는 다르게 비동기 실행 방식을 기본적으로 지원하여 IO관련 작업 시 최고의 성능을 보여준다.


2. Node.js 구성

Node.js는 V8 엔진 + libuv(이벤트 루프) + Node.js 기본 라이브러리(js,C/C++기반)로 구성된다.
V8 엔진 : 크롬의 오픈소스 엔진이다.
libuv : C로 작성된 이벤트 루프로, 비동기 I/O에 집중하는 멀티 플랫폼 라이브러리이다. libuv는 비동기 작업이 마친 후 실행되는 콜백 함수들을 각종 큐에서 우선순위에 맞게 꺼내와서 자바스크립트 엔진에게 전달해준다.
싱글스레드로 작동하며, Node.js를 위해 개발되었지만 현재는 다른 언어들도 사용한다. libuv는 Node.js의 특징인 Event-driven, Non-Blocking I/O 모델을 구현하고 있다.
Node.js 기본 라이브러리 : 브라우저가 아닌 일반 머신 환경에서 실행되기 때문에 브라우저의 Web API와는 다른 라이브러리들이 포함되어 있다.
ex) fa, path, crypto, Stream, zilb, child_process, EventEmitter


3. Node.js 특징

• 싱글 스레드(Single-thread)

Thread와 Process 개념
Thread(스레드)는 프로세스 내에서 실행되는 흐름의 단위로 프로세스는 스레드를 여러 개 생성하여 여러 작업을 동시에 처리할 수 있다. 스레드들은 부모 프로세스의 자원을 공유하고, 같은 주소의 메모리에 접근이 가능하므로 데이터 공유가 가능하다.
Process(프로세스)는 운영체제에서 할당하는 작업의 단위로, 프로세스 간에는 메모리 등의 자원을 공유하지 않는다.

Node.js는 싱글 스레드이며, 스레드가 하나라는 의미이다. 하지만, 엄밀히 말하면 사실은 싱글 스레드가 아니다. 노드를 실행하면 하나의 프로세스가 생성되고, 그 프로세스는 내부적으로 여러 개의 스레드들을 생성하는데 이 중에서 개발자가 직접 제어할 수 있는 스레드는 하나이기 때문에 노드는 싱글 스레드라고 하는 것이다.

노드가 싱글 스레드로 동작하지 않는 2가지 경우
• Thread Pool : 노드는 특정 동작을 수행할 때 스스로 멀티 스레드를 사용
• Worker Thread : CPU 작업이 많은 경우 워커 스레드 사용

• 이벤트 기반(Event-driven)

이벤트 기반이란, 이벤트가 발생할 때 미리 지정해둔 작업을 수행하는 것이다. Node.js는 이벤트 리스너에 등록해둔 콜백함수를 실행하는 방식으로 동작한다. 이벤트 기반 시스템에서는 이벤트에 따라 호출되는 콜백함수를 관리하는 이벤트 루프가 존재한다.
이벤트 루프 : 이벤트 발생 시 호출할 콜백 함수들을 관리하고, 호출된 콜백 함수의 실행 순서를 결정하는 역할을 한ㄷ. 노드가 종료될 때까지 이벤트 처리를 위한 작업을 반복한다.
태스크 큐 : 이벤트 발생 후 호출되어야 할 콜백 함수들이 기다리는 공간이다. 콜백들이 이벤트 루프가 정한 순서대로 줄을 서있으므로 콜백 큐라고도 부른다.
백그라운드 : 타이머나 I/O 작업 콜백 또는 이벤트 리스너들이 대기하는 곳이다.

  • Node.js의 비동기 동작 방식은 기본적으로 브라우저 상에서 자바스크립트의 동작 방식과 동일하다.
    ① 이벤트 루프를 통해 함수를 호출 스택에 쌓는다.
    ② 호출된 함수를 백그라운드작업에 넘겨야 하는지 판단하여 실행하거나 백그라운드 작업으로 이관한다.
    ③ 백그라운드는 작업한 결과를 태스크큐에 저장한다.
    ④ 태스큐 큐에 저장된 콜백은 호출스택이 모두 비워진 상태에서만 실행된다.

• 논 블로킹 I/O 모델(Non Blocking I/O Model)

Blocking과 Non-Blocking 개념
Blocking이란 이전 작업이 반드시 끝나야 다음 작업을 수행하는 순차적 실행 방식을 의미한다. 작업이 길어지면 다음 작업이 지연이 되는 문제가 있다. (자바스크립트에서는 동기라고도 한다)
Non-Blocking이란 이전 작업을 실행시키고 완료될 때까지 대기하지 않고 바로 다음 작업을 수행하는 것을 말한다. 작업이 길어져도 다음 작업이 지연이 되는 문제가 없다. (자바스크립트에서는 비동기라고도 한다.)

Node.js에서의 논블로킹 I/O 모델은 Input과 Output이 관련된 작업(http, Database CRUD, third party api, filesystem) 등의 블로킹 작업들을 백그라운드에서 수행하고, 이를 비동기 콜백함수로 이벤트 루프에 전달하는 것을 말한다.
즉, Non-Blocking I/O는 Read/Write 이벤트가 시작하자마자 모듈을 변환시켜 다른 작업을 하도록 준비상태가 된다. 그래서 동기식에 비해 속도가 빠르고 메모리 낭비도 덜하다.
* Node.js는 특성상 IO 관련 작업(file, network)이 많을 수록 효율이 좋고 반대로 싱글 스레드 특성상 CPU를 많이 사용하는 작업(고차원 연산)이 많을 수록 효율이 극단적으로 떨어진다.


4. Node.js 기본 생태계

• 패키지 매니저

패키지 매니저는 node.js 프로젝트의 의존성 관리, 테스크 작성, npm registry 배포, 프로젝트에 관련된 메타데이터 작성 등 전체적인 프로젝트 관리를 담당한다.
npm(Node Packaged Modules)은 Node.js로 만들어진 모듈을 인터넷에서 받아서 설치해주는 패키지 매니저이다. 그 외에도 yarn과 pnpm이 있다.

• npm registry

npm registry는 Node.js/VanillaJS로 개발한 서드 파티 라이브러리/모듈을 다른 개발자가 사용할 수 있도록 올려놓을 수 있는 공간이다. 개발자들은 registry로부터 필요한 서드 파티 라이브러리/모듈을 받아 사용할 수 있다.


참고 자료
🐰 엘리스 SW 엔지니어 트랙 2기
🔗 Node.js 개념 이해
🔗 Node.js 동작원리
🔗 Node.js - 기본 개념

profile
과거의 나에게 묻기 위한 기록

0개의 댓글