Node.js 란 무엇입니까? JavaScript 런타임 설명

확장 성, 대기 시간 및 처리량은 웹 서버의 핵심 성능 지표입니다. 지연 시간을 낮게 유지하고 처리량을 높게 유지하면서 확장 및 축소는 쉽지 않습니다. Node.js는 요청 처리에 '비 차단'접근 방식을 취하여 짧은 지연 시간과 높은 처리량을 달성하는 자바 스크립트 런타임 환경입니다. 즉, Node.js는 I / O 요청이 반환되기를 기다리는 데 시간이나 리소스를 낭비하지 않습니다.

웹 서버를 만드는 전통적인 접근 방식에서는 들어오는 각 요청 또는 연결에 대해 서버 가 새 실행 스레드를 생성 하거나 요청을 처리하고 응답을 보내기 위해 새 프로세스분기 하기도 합니다 . 개념적으로 이것은 완벽하게 이해되지만 실제로는 많은 오버 헤드가 발생합니다.

스레드 생성 은 프로세스를 분기하는 것보다 메모리와 CPU 오버 헤드가 적지 만 여전히 비효율적 일 수 있습니다. 많은 수의 스레드가 있으면로드가 많은 시스템이 스레드 스케줄링 및 컨텍스트 전환에 귀중한주기를 소비하여 지연 시간을 추가하고 확장 성 및 처리량에 제한을 부과 할 수 있습니다.

Node.js는 다른 접근 방식을 취합니다. 연결을 처리하기 위해 시스템에 등록 된 단일 스레드 이벤트 루프를 실행하고 각각의 새 연결로 인해 JavaScript 콜백 함수 가 실행됩니다. 콜백 함수는 비 차단 I / O 호출로 요청을 처리 할 수 ​​있으며, 필요한 경우 풀에서 스레드를 생성하여 차단 또는 CPU 집약적 인 작업을 실행하고 CPU 코어에서 부하를 분산 할 수 있습니다. 콜백 함수를 사용한 확장에 대한 Node의 접근 방식은 Apache HTTP Server, 다양한 Java 애플리케이션 서버, IIS 및 ASP.NET, Ruby on Rails를 포함하여 스레드로 확장되는 대부분의 경쟁 아키텍처보다 더 많은 연결을 처리하는 데 더 적은 메모리를 필요로합니다.

Node.js는 서버뿐 아니라 데스크톱 애플리케이션에도 매우 유용합니다. 또한 Node 애플리케이션은 순수 JavaScript에 국한되지 않습니다. TypeScript 및 CoffeeScript와 같이 JavaScript로 변환되는 모든 언어를 사용할 수 있습니다. Node.js는 Babel과 같은 ES6에서 ES5 로의 트랜스 파일러없이 ECMAScript 2015 (ES6) 구문을 지원하는 Google Chrome V8 JavaScript 엔진을 통합합니다.

Node 유틸리티의 대부분은 npm명령으로 액세스 할 수있는 대형 패키지 라이브러리에서 제공 됩니다. 노드 패키지 관리자 인 NPM은 자체 웹 사이트가 있지만 표준 Node.js 설치의 일부입니다.

자바 스크립트 역사

1995 년 Netscape의 계약자였던 Brendan Eich는 웹 브라우저에서 실행되는 JavaScript 언어를 10 일 만에 만들었습니다. JavaScript는 처음에는 브라우저 DOM (문서 개체 모델)의 애니메이션 및 기타 조작을 가능하게하기위한 것이 었습니다. Netscape Enterprise Server 용 JavaScript 버전이 곧 도입되었습니다.

당시 썬의 자바 언어가 널리 퍼 졌기 때문에 JavaScript라는 이름은 마케팅 목적으로 선택되었습니다. 사실, 자바 스크립트 언어는 실제로는 표면적 인 자바와 같은 의미 체계를 가진 Scheme 및 Self 언어를 주로 기반으로했습니다.

처음에 많은 프로그래머들은 자바 스크립트가 컴파일 된 언어보다 훨씬 느리게 실행되기 때문에 자바 스크립트를 "실제 작업"에 쓸모 없다고 일축했습니다. 자바 스크립트를 더 빠르게 만들기위한 여러 연구 노력이 결실을 맺기 시작하면서 상황이 바뀌 었습니다. 가장 두드러진 점은 Just-In-Time 컴파일, 인라인 및 동적 코드 최적화를 수행하는 오픈 소스 Google Chrome V8 JavaScript 엔진이 실제로 일부로드에서 C ++ 코드를 능가 할 수 있으며 대부분의 사용 사례에서 Python을 능가합니다.

JavaScript 기반 Node.js 플랫폼은 2009 년에 Ryan Dahl이 Linux 및 MacOS 용으로 Apache HTTP Server에 대한보다 확장 가능한 대안으로 도입했습니다. Isaac Schlueter가 작성한 NPM은 2010 년에 출시되었습니다. 기본 Windows 버전의 Node.js는 2011 년에 데뷔했습니다.

Joyent는 수년 동안 Node.js 개발 노력을 소유, 관리 및 지원했습니다. 2015 년에 Node.js 프로젝트는 Node.js 재단에 넘겨졌고 재단의 기술 운영위원회의 관리를 받게되었습니다. Node.js도 Linux Foundation Collaborative Project로 채택되었습니다. 2019 년에는 Node.js 재단과 JS 재단이 합병되어 OpenJS 재단을 형성했습니다.

기본 Node.js 아키텍처

높은 수준에서 Node.js는 Google V8 JavaScript 엔진, 단일 스레드 비 차단 이벤트 루프 및 낮은 수준의 I / O API를 결합합니다. 아래에 표시된 제거 된 예제 코드 =>는 콜백에 ES6 화살표 함수 (뚱뚱한 화살표 연산자를 사용하여 선언 된 익명의 Lambda 함수)를 사용하는 기본 HTTP 서버 패턴을 보여줍니다 .

코드의 시작 부분은 HTTP 모듈을로드하고 서버 hostname변수를 localhost(127.0.0.1)로 설정하고 port변수를 3000으로 설정합니다. 그런 다음 서버와 콜백 함수를 만듭니다.이 경우 항상 동일한 값을 반환하는 뚱뚱한 화살표 함수를 만듭니다. 모든 요청에 ​​대한 응답 : statusCode200 (성공), 콘텐츠 유형 일반 텍스트 및 텍스트 응답 ”Hello World\n”. 마지막으로 서버에 localhost소켓을 통해 포트 3000 에서 수신하도록 지시하고 서버가 수신을 시작하면 콘솔에 로그 메시지를 인쇄하는 콜백을 정의합니다. node명령을 사용하여 터미널 또는 콘솔에서이 코드를 실행 한 다음 동일한 컴퓨터에서 웹 브라우저를 사용하여 localhost : 3000을 검색하면 브라우저에 "Hello World"가 표시됩니다. 서버를 중지하려면 터미널 창에서 Control-C를 누릅니다.

이 예제에서 수행되는 모든 호출은 비동기식이며 차단되지 않습니다. 콜백 함수는 이벤트에 대한 응답으로 호출됩니다. createServer콜백은 클라이언트 요청 이벤트를 처리하고 응답을 반환합니다. listen콜백은 처리 listening이벤트를.

Node.js 라이브러리

아래 그림의 왼쪽에서 볼 수 있듯이 Node.js는 라이브러리에 다양한 기능을 가지고 있습니다. 이전 샘플 코드에서 사용한 HTTP 모듈에는 그림의 오른쪽에서 볼 수 있듯이 클라이언트 및 서버 클래스가 모두 포함되어 있습니다. TLS 또는 SSL을 사용하는 HTTPS 서버 기능은 별도의 모듈에 있습니다.

단일 스레드 이벤트 루프의 내재 된 문제 중 하나는 이벤트 루프 스레드가 단일 CPU 코어 만 사용하기 때문에 수직 확장이 없다는 것입니다. 한편 최신 CPU 칩은 종종 8 개 이상의 코어를 노출하고 최신 서버 랙에는 종종 여러 CPU 칩이 있습니다. 단일 스레드 애플리케이션은 강력한 서버 랙의 24 개 이상의 코어를 최대한 활용하지 못합니다.

추가 프로그래밍이 필요하지만이를 수정할 수 있습니다. 우선 Node.js는 시스템 popen(3)호출이 작동 하는 방식과 유사하게 child_process.spawn() 및 관련 메서드를 사용하여 자식 프로세스를 생성하고 부모와 자식간에 파이프를 유지할 수 있습니다 .

클러스터 모듈은 확장 가능한 서버를 만들기위한 자식 프로세스 모듈보다 훨씬 더 흥미 롭습니다. 이 cluster.fork()메서드 child_process.spawn()는 커버 아래를 사용하여 부모의 서버 포트를 공유하는 작업자 프로세스를 생성합니다 . 클러스터 마스터는 기본적으로 작업자 프로세스로드에 민감한 라운드 로빈 알고리즘을 사용하여 작업자간에 들어오는 연결을 배포합니다.

Node.js는 라우팅 로직을 제공하지 않습니다. 클러스터의 연결에서 상태를 유지하려면 작업자 RAM이 아닌 다른 위치에 세션 및 로그인 객체를 유지해야합니다.

Node.js 패키지 생태계

NPM 레지스트리는 120 만 개 이상의 무료 재사용 가능한 Node.js 코드 패키지를 호스팅하므로 세계에서 가장 큰 소프트웨어 레지스트리입니다. 대부분의 NPM 패키지 (기본적으로 package.json 파일에 설명 된 프로그램을 포함하는 폴더 또는 NPM 레지스트리 항목)에는 여러 모듈 ( require문으로 로드하는 프로그램 )이 포함되어 있습니다 . 두 용어를 혼동하기 쉽지만이 맥락에서 두 용어는 특정한 의미를 가지며 서로 바꿔서는 안됩니다.

NPM은 특정 프로젝트의 로컬 종속성 인 패키지와 전역 적으로 설치된 JavaScript 도구를 관리 할 수 ​​있습니다. 로컬 프로젝트의 종속성 관리자로 사용되는 경우 NPM은 package.json 파일을 통해 프로젝트의 모든 종속성을 하나의 명령으로 설치할 수 있습니다. 전역 설치에 사용되는 경우 NPM에는 종종 시스템 (sudo) 권한이 필요합니다.

당신은하지 않습니다 공공 NPM 레지스트리에 액세스 할 NPM 명령 줄을 사용 할 수 있습니다. Facebook의 Yarn과 같은 다른 패키지 관리자는 대체 클라이언트 측 경험을 제공합니다. NPM 웹 사이트를 사용하여 패키지를 검색하고 찾아 볼 수도 있습니다.

NPM 패키지를 사용하려는 이유는 무엇입니까? 대부분의 경우 NPM 명령 줄을 통해 패키지를 설치하는 것이 사용자 환경에서 실행되는 안정적인 최신 버전의 모듈을 얻는 데 가장 빠르고 편리하며, 일반적으로 소스 저장소를 복제하고 저장소에서 설치를 빌드하는 것보다 작업이 적습니다. 최신 버전을 원하지 않는 경우 NPM에 버전 번호를 지정할 수 있습니다. 이는 한 패키지가 다른 패키지에 의존하고 최신 버전의 종속성으로 중단 될 때 특히 유용합니다.

예를 들어, 최소한의 유연한 Node.js 웹 애플리케이션 프레임 워크 인 Express 프레임 워크는 단일 및 다중 페이지, 하이브리드 웹 애플리케이션을 빌드하기위한 강력한 기능 세트를 제공합니다. 쉽게 복제 할 수있는 Expresscode 저장소는 //github.com/expressjs/express에 있고 Express 설명서는 //expressjs.com/에 있지만 Express 사용을 시작하는 빠른 방법은 이미 초기화 된 로컬 작업 개발에 설치하는 것입니다. 와 디렉토리 npm예를 들어 명령 :

$ npm install express —save

—saveNPM 5.0 이상에서 기본적으로에 실제로 옵션은, 설치 후 package.json 파일 종속성 목록에 Express 모듈을 추가 패키지 관리자를 알려줍니다.

Express 사용을 시작하는 또 다른 빠른 방법은 실행 가능 생성기를express(1) 전역으로 설치 한 다음이를 사용하여 새 작업 폴더에 로컬로 응용 프로그램을 만드는 것입니다.

$ npm install -g express-generator @ 4

$ express / tmp / foo && cd / tmp / foo

완료되면 NPM을 사용하여 생성기가 생성 한 package.json 파일의 내용에 따라 필요한 모든 종속성을 설치하고 서버를 시작할 수 있습니다.

$ npm 설치

$ npm 시작

NPM의 백만 개 이상의 패키지 중에서 하이라이트를 선택하기는 어렵지만 몇 가지 범주가 두드러집니다. Express는 Node.js 프레임 워크의 가장 오래되고 가장 두드러진 예입니다. NPM 저장소의 또 다른 큰 범주는 모듈 번 들러 인 browserify를 포함한 JavaScript 개발 유틸리티입니다. bower, 브라우저 패키지 관리자; grunt, JavaScript 작업 실행기; 스트리밍 빌드 시스템 인 gulp. 마지막으로 엔터프라이즈 Node.js 개발자에게 중요한 범주는 데이터베이스 클라이언트이며,이 중에는 redis, mongoose, firebase 및 PostgreSQL 클라이언트 인 pg와 같은 인기있는 모듈을 포함하여 8,000 개 이상이 있습니다.

요약하면 Node.js는 서버 및 애플리케이션을위한 크로스 플랫폼 JavaScript 런타임 환경입니다. 단일 스레드, 비 차단 이벤트 루프, Google Chrome V8 JavaScript 엔진 및 저수준 I / O API를 기반으로합니다. 클러스터 모듈을 포함한 다양한 기술을 통해 Node.js 앱은 단일 CPU 코어 이상으로 확장 할 수 있습니다. 핵심 기능 외에도 Node.js는 NPM 저장소에 등록되고 버전이 관리되고 NPM 명령 줄 또는 Yarn과 같은 대안을 사용하여 설치할 수있는 백만 개 이상의 패키지 생태계에 영감을주었습니다.