Node.js 란?
💡 Node.js
Node.js는 Chrome V8 JavaScript 엔진으로 빌드 된 JavaScript Runtime이며 nvm.
즉, 노드를 통해 다양한 자바스크립트 어플리케이션을 실행할 수 있으며, 서버를 실행하는데 많이 사용된다.
- JavaScript를 서버에서도 사용할 수 있도록 만든 프로그램이다.
- V8 이라는 JavaScript 엔진 위에서 동작하는 자바스크립트 런타임(환경)이다.
- 서버사이트 스크립트 언어가 아닌 프로그램(환경)이다.
- 웹 서버와 같이 확장성 있는 네트워크 어플리케이션을 제작하기 위해 만들어졌다.
- 내장 HTTP 서버 라이브러리를 포함하고 있어 웹 서버에서 아파치 등의
별도 소프트웨어 없이 동작한다.
사용 이유
Node.js를 사용하려면 JavaScript를 배워야 한다.
- JavaScript를 웹으로부터 독립시킨 것으로 Node.js를 사용하면 터미널에서 Node.js를 입력하여
브라우저 없이 바로 실행할 수 있다. - 웹 브라우저와 무관한 프로그램을 만들수 있고 서버를 만들 수 있다는 점이 장점이다.
- Node.js가 나오기 이전은 Server-Client 사이트를 만들 때 웹에서 표시되는 부분은
JavaScript를 사용하여 만들어야만 했으며 서버는 Ruby, Java등 다른 언어를 써서
만들어야 했는데 마침내 한가지 언어로 전체 웹 페이지를 만들 수 있게 된 것이다.
Nvm & Npm
nvm (Node Version Manager)은 Node.js의 버전 관리자이다.
npm (Node Package Manager)은 Node.js의 패키지 매니저 이다.
nvm
- Node.js의 여러 버전의 사용을 돕는다.
- 각 버전을 유지하면서 시스템을 구성해야 하는 경우를 위해 사용
설치 순서
- nvm -> Node.js -> npm (추천)
- brew -> Node.js -> npm (OS에 직접 설치, 비추천)
- Node.js -> nvm (불가능)
npm
- Node.js로 개발된 프로그램 (npm 패키지)를 편리하게 설치, 업데이트 및 삭제 지원.
- Node.js가 설치된 상태에서 npm 명령어를 통해 npm 서비스에 등록된 Node.js로 작성된패키지 관리
- Node.js 설치 시, npm이 같이 설치 됨
정리
- nvm 설치 후 원하는 버전으로 세팅
- Node.js 설치
- npm으로 필요한 패키지 추가 설치
Event-Driven
- Node는 V8과 더불어 libuv라는 라이브러리를 사용한다.
- libuv 라이브러리는 노드의 특성인 이벤트 기반, 논 블로킹 I/O 모델을 구현한다.
- 이벤트 기반(Event-Driven)이란 이벤트가 발생할 때 미리 지정해둔 작업을 수행하는 방식을 의미하며,
특정 이벤트가 발생할 때 어떤 동작을 할 지 정해두고, 이를 이벤트 리스너에 콜백함수로 등록한다. - 이후 이벤트가 끝나면 노드는 다음 이벤트가 발생할 때까지 대기한다.
Event Loop
여러 이벤트가 동시에 발생했을 때 어떤 순서로 콜백함수를 호출할 지 이벤트 루프가 판단한다.
노드는 이벤트가 종료될 때까지 이벤트 처리를 위한 작업을 반복하므로 루프(Loop)라고 한다.
즉, 콜 스택의 함수가 더이상 없으면 콜백 큐의 비동기 함수를 가져와 실행시킨다.
Non-Blocking I/O
이벤트 루프를 활용하여 오래 걸리는 작업을 효율적으로 처리할 수 있다.
작업에는 두가지 종류가 있으며 동시에 실행될 수 있는 작업과 동시에 실행될 수 없는 작업이 있다.
특히 파일시스템 접근, 네트워크를 통한 요청 작업은 입력(Input) / 출럭(Output)의 일종이며,
이러한 작업을 할 때 노드는 비동기 방식으로 블로킹을 만들지 않게끔 (Non-Blocking) 처리한다.
- 동기
- 이전 작업이 끝나야만 다음 작업 수행
- 비동기
- 이전 작업이 완료될 때까지 대기하지 않고 동시에 작업 수행
자세히 얘기하면 함수 호출 시 당장 실행하는것이 아니라 (동기 -> 블로킹)
일단 쌓아두고 동시에 요청을 처리(비동기 -> 논 블로킹)하고
요청이 완료된 순서대로(스택) 처리한다.
Single Thread
이벤트 기반, 논 블로킹 모델과 더불어 노드를 설명하는 키워드 중 하나는 싱글 스레드이다.
자바스크립트 코드는 동시에 실행될 수 없는데 그 이유는 노드가 싱글 스레드 기반이기 때문이다.
프로세스
- 운영체제에서 할당하는 작업의 단위이다.
- 노드나 웹 브라우저같은 프로그램은 개별적인 프로세스이다
- 프로세스 간 메모리 등의 자원을 공유하지 않는다.
스레드
- 프로세스 내에서 실행되는 작업의 단위이다.
- 프로세스는 스레드를 여러 개 생성해 여러 작업을 동시에 처리 가능하다. (멀티 스레드)
- 스레드들은 부모 프로세스의 자원을 공유한다.
- 같은 주소의 메모리에 접근 가능하므로 데이터를 공유할 수 있다.
Node.js는 싱글스레드, 논 블로킹 모델로 싱글 스레드가 혼자서 일을 처리하지만 들어오는 요청 순이 아닌
논 블로킹 방식으로 이전 작업이 완료될 때까지 대기하지 않고 다음 작업을 수행한다.
Express
Node.js의 프레임워크이다.
- 작업을 시작부터 끝까지 라이브러리로 지원한다는 점이 단순 라이브러리와 차이가 나는 부분이다.
- 예를 들어, jQuery는 JavaScript 라이브러리로 다양한 용도를 가지고 있지만
jQuery 자체가 무엇 하나를 이루기 위한 목적을 가지고 있지는 않다.
결론
노드는 기본적으로 싱글 스레드, 논 블로킹 모델을 채용하므로,
I/O가 많이 발생되면 노드를 서버로 사용하는것이 좋다.
하지만, CPU 부하가 큰 작업을 처리하기엔 적합하지 않다.
왜냐하면,
우리가 작성하는 코드는 모두 하나의 스레드에서 처리되기 때문에 코드가 CPU 연산을 많이 요구하면
스레드 하나가 감당하기 어렵기 때문이다.
즉, 개수는 많고 크기는 작은 데이터를 실시간으로 주고 받는데 가장 적합하다.
예를 들면 실시간 채팅, 네트워크, DB, 디스크 작업같은 I/O에 특화되어 있다.