mir.pe (일반/어두운 화면)
최근 수정 시각 : 2024-03-27 23:49:22

Node.js

<colbgcolor=#ffffff,#1f2023><colcolor=#5DAD47> Node.js®
파일:Node.js 로고.svg 파일:Node.js 로고 화이트.svg
종류 JavaScript 런타임(실행환경)
개발 Node.js contributors
버전 20.12.0
2024년 3월 26일 업데이트
공개일 2009년 5월 27일
라이선스 MIT 라이선스
파일:홈페이지 아이콘.svg | 파일:GitHub 아이콘.svg 파일:GitHub 아이콘 화이트.svg

1. 개요2. 사용해 보기
2.1. 설치
2.1.1. NVM을 이용한 설치2.1.2. 리눅스에서 패키지 매니저를 이용한 설치
2.2. Hello, World!
3. 특징
3.1. 비동기 이벤트3.2. 오류 처리3.3. 멀티 프로세싱
4. 패키지 매니저
4.1. npm4.2. yarn4.3. pnpm
5. 버전 관리자
5.1. Node Version Manager5.2. Fast Node Manager5.3. Volta
6. 여담
6.1. Node.js는 프레임워크?6.2. 성능 이야기
7. 같이 보기
7.1. 참조 문서7.2. 프레임워크7.3. 쇼케이스7.4. 기타

[clearfix]
#!syntax javascript
console.log("Hello, World!");

1. 개요

Node.js JavaScript 코드를 브라우저 밖에서 실행할 수 있게 해주는 런타임 환경이다.

빈번한 I/O처리에 있어서의 우수한 성능[1], 서버 확장의 용이성, 무엇보다도 JavaScript라는 프론트엔드 필수 언어로 백엔드까지 작성할 수 있다는 엄청난 장점 때문에 출시 이후로 빠르게 점유율을 높여가고 있다.

2009년 5월 27일 처음 출시되었으며, 오픈 소스 JavaScript 엔진인 크롬 V8에 비동기 이벤트 처리 라이브러리인 libuv를 결합하여 구현되었다. Ryan Dahl이 처음 개발했으며,[2] 처음엔 리눅스와 macOS만 지원되었으나 2011년 7월에 Windows 버전도 발표되었다.

2014년 12월 한때 Node.js의 포크인 io.js가 나타나면서 Node.js 0.12 버전, io.js 3.3 버전까지 서로 분열된 모습으로 이어지는 듯했지만, 2015년 9월에 Node.js 4.0 버전으로 병합되어 현재에 이르렀다.

2024년 03월 27일 기준으로 최신 버전은 21.7.1, LTS 버전은 20.12.0이다. 최신 버전은 기능이 불안정하거나 일부 모듈[3](패키지)이 작동하지 않을 수 있으므로 안정성을 보장하고 싶으면 LTS 버전을 사용하는 게 좋다.

2. 사용해 보기

2.1. 설치

대표적인 방법은 홈페이지에 대문짝만하게 나와있는 다운로드 버튼을 누르는 것이다.

다만 Node.js를 이용해 구현된 프로그램 혹은 웹사이트를 실행하거나 빌드하다 보면 프로그램마다 다른 노드 버전을 지원하는 것을 경험할 수 있는데, 이 때는 NVM(Node Version Manager)을 이용해서 쉽게 다른 버전의 node.js를 설치하고 전환할 수 있다. 사실 이 목적이 아니라도, node.js를 쉽게 업데이트하기 위해 nvm을 쓰게 된다.

소스코드에서 직접 빌드해서 쓸 수도 있다. 이곳을 참고하면 된다. 다만 방대한 노드 코드를 모두 빌드해야 하기에 시간이 많이 걸린다는 점을 고려하자. 사실 소스에서 직접 빌드할 생각을 할 때면 이미 시간 같은 건 상관이 없을 것이다

2.1.1. NVM을 이용한 설치

비공식 Node.js 버전 관리자 프로그램인 NVM을 이용해 간단히 설치 및 관리를 할 수 있다.

bash가 지원되는 환경인 리눅스, 맥[4]에서는 아래 코드 두 줄 중 하나를 터미널에 입력하여 설치할 수 있다.
#!syntax sh
$ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
$ wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
만약 자신이 bash와 명령어가 호환되지 않는 fish를 사용한다면 여기서 fish용 nvm을 설치하거나 이곳에서 fish용 bash-nvm의 wrapper를 추가로 설치해주어야 한다. zsh 사용자는 여기서 zsh용 플러그인을 설치해주면 된다.

설치 이후 다음의 명령어를 이용해 Node.js를 설치할 수 있다.
#!syntax sh
$ nvm install 18.20.0 # 예시로 18.20.0 버전의 node와 그에 맞는 npm 설치
$ nvm use 18.20.0 # 해당 버전 활성화

2.1.2. 리눅스에서 패키지 매니저를 이용한 설치

주요 리눅스 배포판에서는 NodeSource에서 제공하는 바이너리를 버전별로 패키지 매니저를 이용하여 받아 쓸 수 있다. 우분투, 데비안 리눅스에서는 아래와 같이 하면 된다.
#!syntax sh
$ curl -sL https://deb.nodesource.com/setup_[메이저 버전].x | sudo -E bash -
$ sudo apt-get install -y nodejs
예를들어 Node.js 14 버전대를 설치하고자 한다면 다음과 같이 실행한다.
#!syntax sh
$ curl -sL https://deb.nodesource.com/setup_14.x | sudo -E bash -
$ sudo apt-get install -y nodejs
다만 이렇게 Node.js를 설치하면 한 번에 하나의 버전대만 쓸 수 있다는 단점이 있다.

만약 다른 리눅스 배포판을 쓴다면 이곳에서 직접 자신의 배포판에 맞는 명령줄을 찾아 입력하자.[5]

2.2. Hello, World!

【HTTP(웹)로 Hello, World! 출력하기】
Node.js가 설치된 상태에서 아무 에디터나 띄우고 다음과 같이 코드를 붙여넣는다. 이때 주의할 점은 메모장을 쓴다면 저장 시 인코딩을 UTF-8로 저장해야 한다.[6]
#!syntax javascript
const http = require('http');
http.createServer((req, res) => {
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end('Hello, World!\n');
}).listen(8080, '127.0.0.1');
console.log('Server running at http://127.0.0.1:8080/');
저장하고 터미널 등에서 'node filename'[7] 이라고 입력해주고 나서, 역시 아무 브라우저나 켜고 localhost:8080으로 들어가면 아마 ' Hello, world!'라고 뜰 것이다.

JavaScript에 익숙하지 않고 프로그래밍을 처음 시작하는 입문자의 경우 사실 Hello, World!부터 복잡해보이긴 하다. 때문에 Hello, World! 예제를 조금 풀어서 설명해보자면 다음과 같다.
  • #!syntax javascript const http = require('http');Node의 대부분의 기능은 '모듈'이라고 하는 외부 어플리케이션 혹은 라이브러리를 통해 제공된다. 이 코드는 그런 모듈들 중 가장 기본적인 HTTP 모듈을 로드해서 로컬 상수에 할당하는 코드이다. 사실상 별도의 프레임워크를 사용하지 않는다면 대부분 이 코드로 시작하게 된다. 참고로 한번 할당하고 굳이 치환하지 않는 경우에는 var 대신 const 키워드를 쓴다. 변수접근에 불필요한 인덱싱을 완화하기 위함이다.
  • #!syntax javascript http.createServer((req, res) => { /* 함수 내용 */ })createServer 메소드로 새로운 서버를 생성하였으며 이 때 매개변수로 아무런 이름이 없는 익명 함수가 전달된다. 이 익명 함수에 전달되는 두 개의 매개변수는 각각 서버 요청(req)과 서버 응답(res)를 의미한다. 0.x 버전을 사용 중인 경우 function(req, res) { ... } 를 사용해야 한다.
  • #!syntax javascript res.writeHead(200, {'Content-Type': 'text/plain'});서버 응답 매개변수에 writeHead라는 메서드를 활용하여 응답 상태와 응답 헤더를 보내고 있다. 응답 해더에는 예제에 나온 Content-Type 외에도 다른 정보들을 포함시킬 수 있다.
  • #!syntax javascript res.end('Hello, World!\n');end 메서드로 통신의 종료를 알린다. end 메서드는 문자열뿐만 아니라 버퍼가 될 수 있는 데이터 청크도 넣을 수 있다. 또한 문자열의 경우 두 번째 매개변수로 문자열의 인코딩을 지정할 수 있다. 기본값은 UTF-8이므로 이외의 인코딩을 써줘야 할 경우에만 입력하면 된다.
  • #!syntax javascript /* http.createServer 함수의 반환값 */.listen(8080, '127.0.0.1');createServer와 이에 매개변수로 전달된 익명함수를 종결하고 listen 메서드로 해당 포트(8080)로 들어오는 연결들을 대기한다. 이 때 listen 메서드는 반드시 생성된 서버 뒤에 붙어야 하며 포트를 명시해줘야 한다. 두 번째 매개변수인 호스트 네임(127.0.0.1)은 반드시 제공하지 않아도 되는데, 이 경우엔 http://0.0.0.0 (localhost와 비슷한 주소이다)으로 연결을 허용한다. 이 listen은 node의 알파이자 오메가라고 할 수 있는 비동기로, http 연결이 맺어지기 전까지 프로그램 실행을 차단하지 않는다.
위 예제는 콜백이라는 비동기 방식으로 Hello, World를 표시해주는 개념이므로, 초심자들은 왜 저렇게 하는지 당장 모르겠어도 겁먹지 말고 생활코딩 등과 같은 Node.js 가이드를 찬찬히 보자.

【터미널(stdout)로 Hello, World! 출력하기】
Node.js도 Python, Lua와 마찬가지로 런타임 바이너리에서 자체 대화형 콘솔(REPL; Read-Eval-Print Loop)을 제공한다.
CMD 또는 터미널에서 아무런 매개변수 없이 node를 입력하면 기본적으로 REPL 인터페이스가 나타난다. 해당 화면에서 아래 코드를 입력해보자.
#!syntax javascript
console.log("Hello, World!")
아래와 같이 뜨면 잘 실행이 된 것이다.
> console.log("Hello, World!")
Hello, World!
undefined
Hello, World!console.log 함수가 실행되면서 표준 출력 스트림으로 내보낸 버퍼이고, 아래에 붙는 undefinedconsole.log 함수가 정상적으로 끝나면서 반환한 결과값이다.

참고로 REPL에서 나가기 위해서는 <kbd>Ctrl(cmd)</kbd>+<kbd>D</kbd>를 눌러 EOL 문자를 입력하면 된다.

【텔넷 클라이언트로 Hello, World! 출력하기】
텔넷 서버를 지원하기 때문에 사설 BBS도 만들 수 있다.
#!syntax javascript
const net = require('net');
const telnet = net.createServer();

telnet.on('connection', client => {
    client.write('Hello, world!');
});

telnet.listen(23);


방대한 npm 패키지 덕분에 거의 모든 프로토콜로 출력이 가능하다.

3. 특징

3.1. 비동기 이벤트

Node.js는 고성능의 비동기 애플리케이션 작성 플랫폼으로 설계되었다. 최초 작성자인 Ryan Dahl은 웹 프로그램 분야에서 브라우저의 JavaScript 엔진이 UI 스레드를 공유할 수밖에 없는 환경[8]에서 락을 피하고자 시분할과 이벤트로 비동기 프로그램을 작성하는 모습을 보고 괜찮은 방법론이라 생각해 만들었다고 한다.

이때 프로그램은 리액터 패턴에 의한 CPS(Continuation-Passing Style)로 작성되는데, 이것이 Node.js에 고성능을 선사하는 기법인 동시에 비숙련자에게 디버깅 지옥을 만드는 애증의 관계를 지니고 있다. 궁금하면 위의 간단한 http 서버에서 createServer가 인자로 전달받은 함수를 http 요청에 이어지는 실행지점으로 사용한다는 점을 보도록 하자. Node.js가 자랑하는 고성능 비동기 프로그램을 작성하기 위해서는 파일시스템을 포함한 프로그램 전체가 비동기화 지점마다 저렇게 CPS로 연결되어야 한다.

이 CPS 특징 때문에 Node.js 초심자는 콜백 지옥을 경험하게 된다. 쉽게 설명하자면 코드가 무한 들여쓰기로 작성돼서 소스코드가 대각선으로 쓰여지는 현상을 말하는데, 이를 피하는 방법 중 하나는 익명 함수를 포기하고 아래와 같이 작성하는 것이 있다.
#!syntax javascript
const http = require('http');
const server = http.createServer(helloResponse);

function helloResponse(req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello World\n');
}

server.listen(8080, '127.0.0.1');
console.log('Server running at http://127.0.0.1:8080/');
함수를 선언하기 전에 사용하고 있지만 JavaScript는 함수를 굳이 코드의 위쪽에 선언할 필요 없이 해당 스코프 안에 정의만 돼 있으면 자동 호이스팅이 돼서 사용할 수가 있다. 이게 깔끔하지 않다고 생각해서 콜백 함수를 createServer 위쪽에 선언할 생각을 할 수도 있는데, 이렇게 짜면 피하려고 했던 콜백 지옥에 다시 뛰어드는 꼴이 된다. 콜백을 실행하는 순서는 함수의 자연스러운 실행 순서와 정반대인 아래에서 위로 올라가는 방향이기 때문이다.

콜백 지옥에서 벗어나기 위한 발버둥의 산물로 Generator와 Promise가 등장하였다. 이후 ES2017에서는 Promise를 기반으로 동작하는 async/await 키워드가 도입되어 타 프로그래밍 언어와 거의 차이가 없는 방식으로 비동기적 코드를 쓸 수 있게 되었다.

3.2. 오류 처리

노드는 기본적으로 오류 핸들링을 안 하면 예외발생으로 프로그램이 꺼진다. 하다 못해 보안접속 하는 형태에 피치 못할 사정으로 접속을 항시 유지한다면 매 주기별로 재응답 해주겠으나 혹시 모를 접속 끊김이 발생할 여지는 많은데 절대로 간과하면 안 되는 형태로 되어있다. 따라서 오류 핸들링을 통한 재접속을 하든가 다음 처리가 요청될 때까지 접속 끊김을 명확하게 제어해야 한다.

웹 GET 요청의 예제 error 핸들링 참고.
#!syntax javascript
const http = require("http");
const req = http.request( {host:"ip", path:"/"}, (res) => {
  let text = "";
  res.on("data", (chunk) => {
    text += chunk;
  });
  res.on("close", () => {
    console.log(text);
  });
  res.on("error", () => {
    //예를들면 여기에 횟수제한, 지연대기, req.end(); 형태로 쓴다
  });
});
req.on("timeout", () => {
  //예를들면 이러한 중복되는 재시도 기능을 특정 함수로 재사용한다.
});
req.on("error", (e) => {
  //예를들면 이러한 중복되는 재시도 기능을 특정 함수로 재사용한다.
});
req.end();

3.3. 멀티 프로세싱

Node.js는 단일 프로세스에서 작동하기 때문에 멀티코어를 완전히 사용하려면 코어 개수만큼의 프로세스를 띄우고 라우터나 로드 밸런서 등으로 요청을 각 프로세스로 분산시켜주어야 한다. 다만 서버에서 Node.js 하나만 돌리지는 않고 Node.js는 CPU보다는 I/O에 유리한 녀석이므로 꼭 멀티프로세싱을 할 필요는 없다. 멀티코어를 더 잘 활용하는 DB 등 다른 프로세스에 자원을 양보해주자. 물론 컨텐츠 딜리버리 서버 같이 양보해 줄 다른 프로세스가 없는 경우는 예외다.

4. 패키지 매니저

4.1. npm

Node.js를 설치하면 함께 설치되는 기본 패키지 관리자이다. 공식 홈페이지는 이곳이다.

2010년 1월에 도입되었다. Java Maven, Python의 pip에 버금가는 입지를 가진 플랫폼이기도 하다.
파일:상세 내용 아이콘.svg   자세한 내용은 npm 문서
번 문단을
부분을
참고하십시오.

4.2. yarn

Facebook에서 2016년 8월에 공개한 패키지 및 배포 관리자이다. 공식 홈페이지는 이곳이다.

초창기에는 npm을 압도하는 성능과 다양한 기능을 제공하여 인기를 끌었는데, 2020년 현재는 npm이 개선을 거듭하여 설치 및 링크 퍼포먼스 측면에서 npm과 yarn은 큰 차이가 없다고 한다.

npm과 동일한 저장소를 쓰기 때문에 yarn import만 해주면 npm에서 yarn으로 쉽게 마이그레이션할 수 있다.

다만 yarn의 패키지 링크 알고리즘 상 npm과는 달리 모든 환경에서 동일한 의존성을 보장한다고 한다.

Yarn 개발자들은 현재 node_modules의 근본적인 문제점을 해결하기 위해 `.pnp.js` 라는 새로운 방식의 통합 의존성 파일을 이용하는 방법을 모색하고 있고, 이는 yarn 2버전대에서 이용해볼 수 있다.

4.3. pnpm

홈페이지

빠른 성능과 디스크 절약을 처음부터 끝까지 강조하고 있는 패키지 관리자. 모듈형 라이브러리 및 프레임워크에서 적극적으로 사용하고 있는 추세이며, yarn 처럼 npm 을 pnpm 으로 마이그레이션이 쉽게 지원된다.
yarn 의 경우 2 버전부터 워크스페이스를 지원한 반면, pnpm 은 정식 버전 출시 전부터 워크스페이스를 지원한다.
이 pnpm의 장점이자 단점이 될 수 있는 양날의 검이 바로 불필요하거나 중복된 패키지 미설치를 통한 디스크 용량 절약인데, 라이브러리나 프레임워크처럼 배포형태를 염두에 둔다면 좋은 선택이지만, 프로젝트를 생각한다면, 종속성이 사용하는 모듈을 프로젝트에서 기본적으로 사용할 수 없다. 이는 npm 에서는 있을 수 없는 일이며, yarn 의 경우 2 버전부터 나타날 수 있는 특징이다. 이를 해결하려면 종속성을 직접 명시하여 설치하는 게 가장 최선이지만, 일부 모듈의 경우 모듈의 종속성을 설치 없이 사용하는 경우가 있어서 이로 인한 라이브러리 누락 오류로 인해 빌드가 실패하는 경우가 있다. 이런 이슈에 대해서는 모듈 개발자가 해결해주지 않는 이상 해결이 불가능하여, pnpm 및 yarn 2 이상 대신 npm 이나 yarn 을 이용해야 하는 경우도 있다.
이 문제 때문에 한국에서는 어째 선호하지 않아 잘 사용하지 않는 패키지 관리자이다.

5. 버전 관리자

Node.js로 프로그램을 개발하다 보면 여러 버전의 Node.js를 바꿔가며 사용해야 할 때가 있다. 이때마다 기존 버전을 삭제하고 다른 버전을 설치하는 작업을 매번 하기는 번거로우므로, 여러 개의 버전을 컴퓨터에 미리 설치해 놓고 필요할 때마다 특정 버전을 활성화하는 프로그램을 사용한다. 이러한 프로그램을 버전 관리자(version manager)라고 부른다.

5.1. Node Version Manager

nvm
nvm for Windows
대중적으로 널리 알려지고 오래된 node 버전 매니저. 설치와 사용법이 단순하여 오래 사랑받고 있는 버전 관리자이다.
초창기에는 많은 불안정성과 버그로 인해 개발 환경에서만 추천되었으나, 요즘은 많이 안정화되어 운영 환경에서 node 버전 마이그레이션 검증 용도로 쓰고 있는 추세다.

nvm은 Linux 쉘 스크립트 언어로 만들어졌기 때문에, Windows에서는 사용할 수 없다. Windows에서 사용하려면 WSL을 설치하여 리눅스 환경을 마련한 다음 사용하거나, nvm-windows라는 프로그램을 사용해야 한다.

5.2. Fast Node Manager

fnm
Rust 로 만든 크로스 플랫폼 Node 버전 관리자로, 빠른 속도로 주목받고 있는 초신성급 관리자. 사용법도 nvm과 큰 차이가 없고, 윈도우를 제외한 환경에서는 쉘 설치 환경을 사용하거나, OS에 맞게 설치한 패키지 관리자로 그냥 설치만 하면 사용 가능하다.

5.3. Volta

Volta
이 또한 Rust로 만든 크로스 플랫폼 패키지 관리자로, 범용 자바스크립트 도구 관리자를 목표로 현재는 node.js 및 이에 대한 도구를 지원하고 있다. 특징으로는 yarn 같은 node.js 의 범용 도구(npm i -g 명령어로 설치하는 패키지들)를 Volta가 직접 관리하고 있는데, 아직 유연성이 부족하나 차후 유연성을 가질 예정이라 밝혔으며, IntelliJ IDEA 도구와의 호환성이 2022.1 버전부터 추가되어 여러 도구 호환성 발전을 통한 빠른 연결성으로도 주목받고 있다.

6. 여담

6.1. Node.js는 프레임워크?

우리나라에서는 프레임워크로 표현되기도 하는데,[15] 엄밀히 말해 Node.js는 프레임워크가 아니다.

과거 Node.js 홈페이지의 About에는 "As an asynchronous event driven framework, Node.js is..." 하는 설명이 있는데 이는 Node.js가 이벤트 드리븐에 있어 특정하게 지정된 디자인을 제공한다는 의미의 설명이다. 근데 이게 Node.js에 이벤트 드리븐 프레임워크를 포함된다는 것이지 이벤트 드리븐 프레임워크 자체가 Node.js라는 말은 아니다. 만약 저걸 근거로 Node.js가 프레임워크라고 불려야 한다면 특정 방법론을 구현하는 디자인을 내장한 거의 모든 현대 프로그래밍 언어가 프레임워크라 불려야 한다. 논란이 많기는 많았는지 현재의 홈페이지에서는 아예 "As an asynchronous event driven JavaScript runtime"로 내용이 바뀌었다. 굳이 6 버전대에 와서 홈페이지의 내용을 바꾼 것으로 보아, 이전의 문구가 실제로 오해를 불러일으켰다는 점을 인정했다고 볼 수 있다. 다만 이제 홈페이지의 내용도 정정되었으니, Node.js를 프레임워크로 표현하는 것은 명백한 잘못이라 할 수 있을 것이다.

6.2. 성능 이야기

비동기 처리로 인하여 I/O 처리가 고성능이고 기반이 되는 구글 V8도 꽤 빠른 성능을 내는 JIT 구현이지만 개별 프로세스 내부에서 작동하는 JavaScript 코드는 무조건 싱글 스레드로 실행한다는 제약이 걸려있어 병렬연산에는 취약하다. 단, Node.js에서 싱글 스레드는 성능상의 제약이 아니라 프로그래밍 모델에 포함된 사양이다. 복잡한 비동기 I/O 응용 프로그램을 싱글 스레드 JavaScript로 작성하여 결과물의 실행 속도와 개발 편의성 측면에서 좋다는 것이 Node.js의 근간을 이루는 개념이며, CPU의 높은 연산력을 요구하는 프로그램을 Node.js로 짜면 영 좋지 않은 성능이 나온다. 작성자인 Ryan Dahl은 순수하게 연산력이 중요한 요소는 C로 짜서 붙이라는 상식적인 사실을 이야기했다.

Node.js가 고성능을 발휘하는 분야는 비교적 가벼운 I/O가 발생하는 대다수의 웹 서버나 동영상, 스트리밍 등의 컨텐츠 딜리버리 서버다. 사실 C로 똑같이 비동기 처리를 구현하면 Node.js보다 빨라지지만 코딩 난이도가 높은 편이다.

다만, 비동기 처리 자체에 대해서는 Node.js만의 장점이라고 말하기는 힘들다. C#의 경우 async/await 키워드 및 Task 등에 기반하여 비동기 프로그래밍을 언어적으로 지원하며, 이쪽은 멀티 스레드 기법까지 활용하기 때문에 더 완성도가 높다. 사실상 같은 싱글 스레드 언어인 Python 역시 비슷한 수준의 지원을 가지고 있다. 아예 언어 문법 차원에서 지원하는 케이스에는 도저히 비할 바가 못 되나 Java C++ 등도 별도의 라이브러리를 통해 어느 정도 비동기 구현의 난이도를 낮추는 방법을 제공한다. 아직 초안인 C++20는 이를 공식적으로 지원할 예정이다.

또한, Boost.Asio와 같이 잘 설계된 C++ 라이브러리가 네트워크에 대해 비동기 처리를 지원하며 동기 처리를 하더라도 Node.js보다 성능이 뛰어나다는 결과를 보여주고 있다. 라이브러리가 잘 구현되더라도 C++가 비교적 어렵고 복잡한 언어이기 때문에 확산이 잘 안 될 뿐이다.

7. 같이 보기

7.1. 참조 문서

7.2. 프레임워크

7.3. 쇼케이스

7.4. 기타



[1] 이는 특히 Node.js의 두드러진 강점인데, 엄청나게 많은 양의 인풋 아웃풋 데이터를 처리해야 하는 넷플릭스같은 서비스에도 이용될 정도이다. [2] 초기에는 여러 개발자들을 모으고 Node.js의 개발 및 유지 관리를 주도했으나 2012년 1월에 물러났다. [3] node-pre-gyp 등 [4] 윈도우는 NVM이 지원되지 않으며, 대체 프로그램으로 NVM-Windows가 있다. [5] 아쉽게도 아치리눅스 계열은 지원하지 않는데, 이 경우 위에 나와 있는 nvm을 쓰면 간단하게 설치할 수 있다. [6] 비 ASCII 문자가 있는 경우. [7] 당연한거지만 filename에 실행할 파일의 주소를 입력한다. cd로 해당 파일이 들어있는 폴더를 지정해주면 더 편하다. [8] 브라우저가 DOM API와 JavaScript 엔진을 동기화하기 위해서는 어쩔 수 없다. [9] JavaScript에서는 이런 상황에서 이렇게 하자고 미리 약속한 것이기 때문에, C나 Java에서 에러를 내는 것뿐이지 잘못된 것은 아니지만 수많은 버그의 원인이기도 하다. [10] 예를 들어 for .. in 문법에서 인덱스 객체의 타입이 숫자가 아닌 문자열 객체가 들어가서 i = '1' 일 때 i + 1 의 값이 2가 아니라 11(1 뒤에 1을 덧붙임)이 되는 등. 자바스크립트는 더할 수 없으면 문자열로 자동으로 바꾸어 더한다. [11] 요새는 ESLint 등을 써서 자잘한 실수들은 아예 에러로 처리하도록 설정할 수 있다. [12] 이것이 없으면 비동기 함수 반복문을 하려면 재귀 함수를 이용해야 하는데 코드가 매우 복잡해진다. [13] 공식적으로는 XP에서는 6.0에서 실행이 불가능하다고 하지만 실제로는 버전 6.12.3까지는 윈도우 버전만 Windows 7로 속여주면 Windows XP에서 정상 작동한다. [14] 관련 도구로는 Babel 등이 있다. [15] 사실 해외에서도 조금씩 나오는 이야기다. [16] Visual Studio Code, Atom, Discord, Skype, Slack, Twitch 데스크톱 앱이 모두 이 Electron으로 만들어졌다. [17] 끄투도 Node.js의 Express 프레임워크 및 WebSocket 처리를 이용해 만들어진 게임이다. 참고로 cluster를 사용하여 여러개의 프로세스로 구동된다. 이하 문서 참조. [18] Node.js의 일부 문제점을 해결하기 위해 Node.js의 개발자 중 한 명이 만든 자바스크립트/ 타입스크립트 런타임이다.