Node.js

Node.js는 윈도우, 리눅스, 유닉스, macOS 등에서 실행될 수 있는 크로스 플랫폼, 오픈 소스 자바스크립트 런타임 환경이다. Node.js는 V8 자바스크립트 엔진에서 실행되며, 웹 브라우저 외부에서 자바스크립트 코드를 실행한다.

Node.js를 사용하면 개발자는 자바스크립트를 이용해 명령줄 도구를 작성하고 서버 측 스크립트를 작성할 수 있다. 서버에서 자바스크립트 코드를 실행하는 기능은 종종 페이지가 사용자의 웹 브라우저로 전송되기 전에 동적 웹페이지 콘텐츠를 생성하는 데 사용된다. 결과적으로 Node.js는 "모든 곳의 자바스크립트" 패러다임을 대표하며, 서버 측과 클라이언트 측 프로그래밍에 다른 언어를 사용하는 대신 단일 프로그래밍 언어를 중심으로 웹 애플리케이션 개발을 통합한다.

Node.js는 비동기 I/O가 가능한 이벤트 기반 아키텍처를 가지고 있다. 이러한 설계 선택은 많은 입출력 작업이 있는 웹 애플리케이션뿐만 아니라 실시간 웹 애플리케이션(예: 실시간 통신 프로그램 및 웹 게임)에서도 처리량과 확장성을 최적화하는 것을 목표로 한다.

Node.js의 분산 개발 프로젝트는 이전에 Node.js 재단이 관리했으며, 현재 JS Foundation과 합병하여 OpenJS 재단을 형성했다. OpenJS 재단은 리눅스 재단의 협업 프로젝트 프로그램을 통해 운영된다.

 역사 
섬네일|Node.js의 창시자, 라이언 달 (2010년)|alt=
섬네일|로켓 터틀, 2024년 2월부터 Node.js의 공식 마스코트|upright=0.7
Node.js는 2009년 라이언 달이 처음 작성했으며, 이는 최초의 서버 측 자바스크립트 환경인 넷스케이프의 LiveWire Pro Web이 도입된 지 약 13년 후였다. 초기 릴리스는 리눅스와 맥 OS X만 지원했다. 개발 및 유지 관리는 달이 주도했으며 나중에 조이언트의 후원을 받았다.

달은 아파치 HTTP 서버가 많은(10,000개 이상) 동시 연결을 처리하는 제한된 기능과, 애플리케이션이 전체 프로세스를 차단하거나 동시 연결을 위해 여러 실행 스택을 생성할 수 있는 순차 프로그래밍의 지배적인 프로그래밍 패러다임을 비판했다.

달은 2009년 11월 8일 유럽 JSConf 창립 행사에서 프로젝트를 시연했다. Node.js는 구글의 V8 자바스크립트 엔진, 이벤트 루프, 저수준 I/O API를 결합했다.

2010년 1월, Node.js 환경을 위한 패키지 관리자인 npm이 도입되었다. 이 패키지 관리자는 프로그래머가 Node.js 패키지와 함께 소스 코드를 게시하고 공유할 수 있도록 하며, 패키지의 설치, 업데이트 및 제거를 간소화하도록 설계되었다.

2011년 6월, 마이크로소프트와 조이언트는 Node.js의 기본 윈도우 버전을 구현했다. 윈도우를 지원하는 첫 번째 Node.js 빌드는 2011년 7월에 릴리스되었다.

2012년 1월, 달은 프로젝트 관리를 npm 제작자인 아이작 슐루터에게 넘겼다. 2014년 1월, 슐루터는 티모시 J. 폰테인이 프로젝트를 이끌 것이라고 발표했다.

2014년 12월, 페도르 인더트니는 조이언트의 거버넌스에 대한 불만으로 Node.js의 포크인 io.js를 생성했다. 이는 별도의 기술 위원회를 가진 개방형 거버넌스 대안으로 만들어졌다. 목표는 당시 Node.js의 접근 방식과 달리 최신 구글 V8 자바스크립트 엔진 릴리스로 io.js를 업데이트하는 것을 포함하여 커뮤니티 의견에 더 수용적인 구조를 가능하게 하는 것이었다.

Node.js와 io.js를 단일 기치 아래 통합하기 위해 Node.js 재단이 2015년 2월에 발표되었다. 이 합병은 2015년 9월 Node.js v0.12와 io.js v3.3이 Node v4.0으로 결합되면서 실현되었다. 이 합병은 V8 ES6 기능을 Node.js에 통합하고 장기 지원 릴리스 주기를 시작했다. 2016년까지 io.js 웹사이트는 Node.js로 돌아갈 것을 권장했으며 더 이상의 io.js 릴리스는 없을 것이라고 발표하여 사실상 포크를 종료하고 합병의 성공을 공고히 했다.

2019년, JS Foundation과 Node.js Foundation은 합병하여 OpenJS 재단을 형성했다.

 브랜딩 
Node.js 로고는 겹치는 띠가 있는 녹색 육각형으로 런타임의 크로스 플랫폼 특성을 나타낸다. 로켓 터틀은 2024년 2월 디자인 콘테스트를 거쳐 Node.js의 공식 마스코트로 선정되었다.

 개요 
Node.js는 자바스크립트와 다양한 핵심 기능을 처리하는 "모듈" 컬렉션을 사용하여 웹 서버 및 네트워킹 도구를 생성할 수 있게 한다. 파일 시스템 I/O, 네트워킹(DNS, HTTP, TCP, TLS/SSL 또는 UDP), 이진 데이터(버퍼), 암호학 기능, 데이터 스트림 및 기타 핵심 기능을 위한 모듈이 제공된다. Node.js의 모듈은 서버 애플리케이션 작성의 복잡성을 줄이기 위해 설계된 API를 사용한다.

자바스크립트는 Node.js가 기본적으로 지원하는 유일한 언어이지만, 많은 JS 컴파일 언어를 사용할 수 있다. 결과적으로 Node.js 애플리케이션은 커피스크립트, 다트, 타입스크립트, 클로저스크립트 등으로 작성될 수 있다.

Node.js는 주로 웹 서버와 같은 네트워크 프로그램을 구축하는 데 사용된다. Node.js와 PHP의 가장 큰 차이점은 PHP의 대부분의 함수가 완료될 때까지 블록되는 반면(이전 명령이 완료된 후에만 명령 실행), Node.js 함수는 논블로킹이라는 점이다(명령이 동시에 실행되며 콜백을 사용하여 완료 또는 실패를 알림). 따라서 대부분의 웹 서버 애플리케이션에는 본질적으로 없는 새로운 공격 표면이 열린다.

Node.js는 리눅스, 및 마이크로소프트 윈도우 8.1 및 서버 2012(이후 버전)에서 공식적으로 지원되며, 스마트OS 및 IBM AIX에 대한 Tier 2 지원, FreeBSD에 대한 실험적 지원을 제공한다. OpenBSD에서도 작동하며, IBM i (AS/400)용 LTS 버전도 사용할 수 있다. 소스 코드는 공식적으로 지원되지 않는 유사한 유닉스 서버나 NonStop OS와 같은 운영 체제에서도 빌드할 수 있다.

 플랫폼 아키텍처 
Node.js는 이벤트 기반 프로그래밍을 사용하여 자바스크립트에서 빠른 웹 서버를 개발할 수 있게 한다. 개발자는 작업을 완료했음을 알리는 콜백을 사용하는 단순화된 모델을 사용하여 스레딩 없이 확장 가능한 서버를 만들 수 있다. Node.js는 스크립트 언어(자바스크립트)의 용이성과 유닉스 네트워크 프로그래밍의 강력함을 연결한다.

Node.js는 BSD 라이선스로 오픈 소스화된 구글의 V8 자바스크립트 엔진을 기반으로 구축되었으며, HTTP, DNS 및 TCP와 같은 기본 프로토콜에 대한 포괄적인 지원을 포함한다. 자바스크립트의 기존 인기는 Node.js를 웹 개발 커뮤니티에 접근 가능하게 만들었다.

 산업 지원 
Node.js를 위한 수천 개의 오픈 소스 라이브러리가 있으며, 대부분은 npm 웹사이트에서 호스팅된다. NodeConf, Node Interactive, Node Summit을 비롯한 여러 개발자 컨퍼런스 및 행사가 Node.js 커뮤니티를 지원하며, 다수의 지역 행사도 개최된다.

오픈 소스 커뮤니티는 애플리케이션 개발을 가속화하기 위해 웹 프레임워크를 개발했다. 이러한 프레임워크에는 Express.js, Socket.IO, Sails.js, Next.js 및 미티어가 포함된다. 마이크로소프트 .NET과 같은 다른 언어 또는 런타임 환경과 인터페이스하기 위한 다양한 패키지도 생성되었다.

최신 데스크톱 IDE는 Node.js 애플리케이션을 위한 편집 및 디버깅 기능을 제공한다. 이러한 IDE에는 아톰, 브래킷츠, 젯브레인즈 WebStorm, 마이크로소프트 비주얼 스튜디오 (Node.js Tools for Visual Studio 포함, 또는 Node 정의가 있는 타입스크립트), 넷빈즈, Nodeclipse Enide Studio (이클립스 기반) 및 비주얼 스튜디오 코드가 포함된다. 일부 온라인 IDE도 Node.js를 지원한다. 예를 들어 Codeanywhere, Eclipse Che, 클라우드9 IDE 및 Node-RED의 시각적 흐름 편집기가 있다.

Node.js는 Jelastic, 구글 클라우드 플랫폼, AWS 일래스틱 빈스토크, Azure Web Apps 및 조이언트와 같은 여러 클라우드 호스팅 플랫폼에서 지원된다.

 릴리스 

Node.js의 새로운 주요 릴리스는 6개월마다 깃허브 메인 브랜치에서 분기된다. 짝수 버전은 4월에, 홀수 버전은 10월에 분기된다. 새로운 홀수 버전이 릴리스되면 이전 짝수 버전은 장기 지원(LTS)으로 전환되며, 해당 버전은 LTS로 지정된 날짜로부터 12개월 동안 활성 지원을 받는다. 이 12개월이 만료된 후, LTS 릴리스는 추가로 18개월 동안 유지보수 지원을 받는다. 활성 버전은 현재 릴리스에 적용된 후 몇 주 이내에 비파괴적인 변경 사항 백포트를 받는다. 유지보수 릴리스는 중요한 수정 사항과 문서 업데이트만 받는다. LTS 워킹 그룹은 Node.js 재단의 기술 운영 위원회와 협력하여 전략 및 정책을 관리한다.

 기술적 세부 사항 
Node.js는 이벤트 루프라고 불리는 루프에서 들어오는 요청을 처리하는 자바스크립트 런타임 환경이다.

 내부 
Node.js는 비동기 이벤트를 처리하기 위해 내부적으로 libuv를 사용한다. Libuv는 윈도우 및 POSIX 기반 시스템(예: 리눅스, macOS, NonStop의 OSS, Unix)에서 네트워크 및 파일 시스템 기능에 대한 추상화 계층이다. Node.js는 HTTP 지원을 위해 nghttp2에 의존한다. 버전 20부터 Node.js는 최신 WHATWG URL 준수를 제공하는 ada 라이브러리를 사용한다. 버전 19.5부터 Node.js는 빠른 유니코드 유효성 검사 및 트랜스코딩을 위해 simdutf 라이브러리를 사용한다. 버전 21.3부터 Node.js는 빠른 JSON 파싱을 위해 simdjson 라이브러리를 사용한다.

 스레딩 
Node.js는 단일 스레드 이벤트 루프에서 작동하며, 논블로킹 I/O 호출을 사용하여 스레드 컨텍스트 전환 비용 없이 수만 개의 동시 연결을 지원할 수 있다. 옵서버 패턴을 사용하는 모든 요청에 단일 스레드를 공유하도록 설계된 이 방식은 I/O를 수행하는 모든 함수가 콜백을 사용해야 하는 고도로 동시적인 애플리케이션을 구축하기 위한 것이다. 단일 스레드 이벤트 루프를 수용하기 위해 Node.js는 libuv 라이브러리를 사용하는데, 이는 일부 논블로킹 비동기 I/O 작업을 처리하는 고정 크기 스레드 풀을 사용한다.

스레드 풀은 Node.js에서 병렬 작업의 실행을 처리한다. 메인 스레드 함수 호출은 공유 작업 큐에 작업을 게시하고, 스레드 풀의 스레드가 이를 가져와 실행한다. 네트워킹과 같은 본질적으로 논블로킹 시스템 함수는 커널 측 논블로킹 소켓으로 변환되는 반면, 파일 I/O와 같은 본질적으로 블로킹 시스템 함수는 자체 스레드에서 블로킹 방식으로 실행된다. 스레드 풀의 스레드가 작업을 완료하면 이를 메인 스레드에 알리고, 메인 스레드는 깨어나 등록된 콜백을 실행한다.

이러한 단일 스레드 방식의 단점은 Node.js가 클러스터, StrongLoop Process Manager 또는 pm2와 같은 추가 모듈을 사용하지 않고서는 실행되는 머신의 CPU 코어 수를 늘려 수직 확장을 허용하지 않는다는 것이다. 그러나 개발자는 libuv 스레드 풀의 기본 스레드 수를 늘릴 수 있다. 서버 운영 체제(OS)는 이러한 스레드를 여러 코어에 분산시킬 가능성이 있다. 또 다른 문제는 오래 지속되는 계산 및 기타 CPU 바운드 작업이 완료될 때까지 전체 이벤트 루프를 멈추게 한다는 것이다.

 V8 

V8은 원래 구글 크롬을 위해 구축된 자바스크립트 실행 엔진이다. 2008년 구글에 의해 오픈 소스화되었다. C++로 작성된 V8은 자바스크립트 소스 코드를 실행 시에 기본 기계 코드로 컴파일한다. 2016년 현재, 바이트코드 인터프리터인 Ignition도 포함한다.

 패키지 관리 
npm은 Node.js 서버 플랫폼을 위한 사전 설치된 패키지 관리자이다. 이는 npm 레지스트리에서 Node.js 프로그램을 설치하고 타사 Node.js 프로그램의 설치 및 관리를 조직한다.

 이벤트 루프 
Node.js는 운영 체제에 등록하여 새 연결과 같은 비동기 I/O 이벤트를 운영 체제로부터 알림받는다. Node.js 런타임 내에서 이벤트는 콜백을 트리거하고 각 연결은 작은 힙 할당으로 처리된다. 전통적으로 상대적으로 무거운 OS 프로세스나 스레드가 각 연결을 처리했다. Node.js는 프로세스나 스레드 대신 동시 I/O를 위해 이벤트 루프를 사용한다. 다른 이벤트 기반 서버와 달리 Node.js의 이벤트 루프는 명시적으로 호출될 필요가 없다. 대신 콜백이 정의되면 서버는 콜백 정의가 끝날 때 자동으로 이벤트 루프에 진입한다. Node.js는 더 이상 수행할 콜백이 없을 때 이벤트 루프를 종료한다.

 웹어셈블리 
Node.js는 웹어셈블리를 지원하며 Node 14부터는 WASI, 즉 웹어셈블리 시스템 인터페이스에 대한 실험적 지원을 제공한다.

 네이티브 바인딩 

Node.js는 N-API라는 C 기반 API를 통해 "애드온"을 생성하는 방법을 제공하는데, 이를 사용하여 C/C++로 작성된 소스 코드에서 로드 가능한 (가져올 수 있는) `.node` 모듈을 생성할 수 있다. 이 모듈은 메모리에 직접 로드되어 JS 환경 내에서 단순한 CommonJS 모듈로 실행될 수 있다. N-API의 구현은 내부 C/C++ Node.js 및 V8 객체에 의존하며, 사용자들은 Node.js 고유 헤더를 네이티브 소스 코드에 포함해야 한다.

Node.js API는 이진 수준에서 파괴적인 변경에 취약하므로, 모듈은 올바르게 작동하기 위해 특정 Node.js 버전에 맞춰 빌드되고 제공되어야 한다. 이 문제를 해결하기 위해 타사에서 API 위에 오픈 소스 С/С++ 래퍼를 도입하여 문제를 부분적으로 완화했다. 이들은 인터페이스를 단순화하지만, 부작용으로 유지보수자가 처리해야 할 복잡성을 도입할 수도 있다. Node.js의 핵심 기능은 자바스크립트 내장 라이브러리에 있지만, C++로 작성된 모듈을 사용하여 애플리케이션의 기능을 향상시키고 성능을 개선할 수 있다.

이러한 모듈을 생성하려면 적절한 C++ 컴파일러와 필요한 헤더(후자는 일반적으로 Node.js 자체에 포함됨), 예를 들어 gcc, 클랭 또는 MSVC++가 필요하다.

N-API는 자바 네이티브 인터페이스와 유사하다.

 프로젝트 거버넌스 

2015년, Node.js 커뮤니티의 다양한 지부들은 벤더 중립적인 Node.js 재단 아래에서 협력하기 시작했다. 조직의 명시된 목적은 "Node.js의 성공에 투자된 생태계에 의한 참여, 기술 기여 및 장기적인 관리 프레임을 장려하는 개방형 거버넌스 모델을 통해 Node.js 및 기타 관련 모듈의 광범위한 채택을 가능하게 하고 개발을 가속화하는 것"이다.

Node.js 재단 기술 운영 위원회(TSC)는 Node.js 재단의 기술 거버넌스 기관이다. TSC는 핵심 Node.js 리포지토리뿐만 아니라 의존적이고 인접한 프로젝트를 담당한다. 일반적으로 TSC는 이러한 프로젝트의 관리를 실무 그룹 또는 위원회에 위임한다. 장기 지원 릴리스를 관리하는 LTS 그룹도 그러한 그룹 중 하나이다. 현재 다른 그룹으로는 웹사이트, 스트림, 빌드, 진단, 국제화(i18n), 에반젤리즘, Docker, 애드온 API, 벤치마킹, 사후 분석, Intl, 문서화 및 테스트가 있다.

2017년 8월, TSC 구성원의 3분의 1이 프로젝트의 행동 강령과 관련된 분쟁으로 사임했다.

 같이 보기 
 자바스크립트
 V8 (자바스크립트 엔진)

 각주 

 더 읽어보기 
 
 
 
 
 

 외부 링크 
 
 
 깃허브 저장소
 The Node Beginner Book

분류:자바스크립트 라이브러리
분류:C++로 작성된 자유 소프트웨어
분류:자바스크립트로 작성된 자유 소프트웨어
분류:MIT 라이선스 소프트웨어
분류:리눅스 재단 프로젝트