>웹 프론트엔드 >JS 튜토리얼 >Node.js가 정확히 무엇인가요? Node.js의 이점은 무엇입니까? _node.js

Node.js가 정확히 무엇인가요? Node.js의 이점은 무엇입니까? _node.js

WBOY
WBOY원래의
2016-05-16 15:57:191345검색

Node는 서버 작동 방식의 개념을 바꾸는 서버측 JavaScript 해석기입니다. 그 목표는 프로그래머가 확장성이 뛰어난 애플리케이션을 구축하고 하나(단 하나의) 물리적 시스템에 대한 수만 개의 동시 연결을 처리할 수 있는 코드를 작성하도록 돕는 것입니다.

소개

Node.js가 무엇인지 설명하기 위해 이 기사에서는 Node.js가 해결하는 문제, 작동 방식, 간단한 애플리케이션을 실행하는 방법, 마지막으로 Node가 좋은 솔루션인 경우 등 몇 가지 배경 정보를 간략하게 제공합니다. 이 문서에서는 복잡한 Node 애플리케이션을 작성하는 방법을 다루지 않으며 포괄적인 Node 튜토리얼도 아닙니다. 이 기사를 읽으면 Node를 계속 학습하여 비즈니스에 사용할 것인지 결정하는 데 도움이 될 것입니다.

Node는 어떤 문제를 해결하도록 설계되었나요?

Node의 명시된 목표는 "확장 가능한 네트워크 프로그램을 구축하는 간단한 방법을 제공하는 것"입니다. 현재 서버 프로그램에 어떤 문제가 있나요? 수학 문제를 풀어보자. Java™ 및 PHP와 같은 언어에서는 각 연결이 새 스레드를 생성하며, 각 새 스레드에는 2MB의 동반 메모리가 필요할 수 있습니다. 8GB RAM이 장착된 시스템에서 이론상 최대 동시 연결 수는 4,000명입니다. 고객 기반이 성장함에 따라 웹 애플리케이션이 더 많은 사용자를 지원하도록 하려면 더 많은 서버를 추가해야 합니다. 물론 이로 인해 서버 비용, 트래픽 비용, 인건비 등 비용이 증가하게 됩니다. 이러한 비용 상승 외에도 사용자가 각 요청에 대해 서로 다른 서버를 사용할 수 있으므로 공유 리소스를 모든 서버에서 공유해야 하는 잠재적인 기술적 문제도 있습니다. 위의 모든 이유로 인해 전체 웹 애플리케이션 아키텍처(트래픽, 프로세서 속도 및 메모리 속도 포함)의 병목 현상은 서버가 처리할 수 있는 최대 동시 연결 수입니다.

이 문제에 대한 Node의 해결책은 서버에 연결하는 방식을 변경하는 것입니다. 각 연결에 대해 새 OS 스레드를 생성하고 그에 따른 일부 메모리를 할당하는 대신 각 연결은 노드 엔진 프로세스에서 실행되는 이벤트를 생성합니다. 노드는 잠금을 전혀 허용하지 않고 I/O 호출을 직접 차단하지 않기 때문에 교착 상태가 발생하지 않는다고 주장합니다. Node는 또한 Node가 실행되는 서버가 수만 개의 동시 연결을 지원할 수 있다고 주장합니다.
이제 수만 개의 동시 연결을 처리할 수 있는 프로그램이 생겼으니 실제로 Node로 무엇을 구축할 수 있을까요? 너무 많은 연결을 처리해야 하는 웹 애플리케이션이 있다면 무서울 것입니다! 그것은 "이런 문제가 있으면 전혀 문제가 아니다"라는 종류의 문제입니다. 위의 질문에 답하기 전에 Node가 어떻게 작동하고 어떻게 작동하도록 설계되었는지 살펴보겠습니다.

노드는 확실히 뭐지?

네, Node는 서버 프로그램입니다. 그러나 기본 Node 제품은 확실히 Apache나 Tomcat과 다릅니다. 기본적으로 이러한 서버는 서버 제품을 "설치할 준비가 되어 있는" 상태이므로 애플리케이션을 즉시 배포할 수 있습니다. 이러한 제품을 사용하면 1분 이내에 서버를 가동하고 실행할 수 있습니다. Node는 확실히 이 제품이 아닙니다. 개발자가 보안 연결을 구현하기 위해 PHP 모듈과 SSL 모듈을 추가하여 동적 웹 페이지를 생성할 수 있는 Apache와 유사하게 Node에도 Node 코어에 모듈을 추가할 수 있는 모듈 개념이 있습니다. Node에는 문자 그대로 수백 개의 모듈을 선택할 수 있으며 커뮤니티는 모듈 생성, 게시 및 업데이트에 매우 적극적이며 하루에 수십 개의 모듈을 처리할 수도 있습니다. Node의 전체 모듈 부분은 이 문서의 뒷부분에서 논의됩니다.

노드는 어떻게 작동하나요?

노드 자체는 V8 JavaScript를 실행합니다. 잠깐만요, 서버에 JavaScript가 있나요? 예, 당신이 읽은 것이 맞습니다. 서버사이드 자바스크립트는 클라이언트에서만 자바스크립트를 사용하는 프로그래머들에게는 새로운 개념일 수 있지만, 개념 자체는 무리가 없는데 왜 클라이언트에서 사용하는 것과 동일한 프로그래밍 언어를 서버에서 사용할 수 없는 걸까요?

V8이란 무엇입니까? V8 JavaScript 엔진은 Google이 Chrome 브라우저에 사용하는 기본 JavaScript 엔진입니다. 클라이언트 시스템에서 JavaScript가 실제로 무엇을 하는지 고려하는 사람은 거의 없습니까? 실제로 JavaScript 엔진은 코드를 해석하고 실행하는 역할을 담당합니다. Google은 V8을 사용하여 엔진을 다운로드하여 모든 애플리케이션에 삽입할 수 있는 또 다른 고유한 기능을 갖춘 C로 작성된 초고속 인터프리터를 만들었습니다. V8 JavaScript 엔진은 하나의 브라우저에서만 실행되는 것으로 제한되지 않습니다. 따라서 Node는 실제로 Google이 작성한 V8 JavaScript 엔진을 가져와 서버에서 작동하도록 다시 빌드합니다. 완벽해요! 이미 좋은 솔루션이 있는데 왜 새로운 언어를 만들어야 할까요?

이벤트 중심 프로그래밍

많은 프로그래머는 객체 지향 프로그래밍이 완벽한 프로그래밍 설계라고 믿도록 교육을 받아 다른 프로그래밍 방법을 무시하게 됩니다. 노드는 소위 이벤트 중심 프로그래밍 모델을 사용합니다.

목록 1. 클라이언트에서 jQuery를 사용한 이벤트 중심 프로그래밍

코드 복사 코드는 다음과 같습니다.

// 이벤트 기반 프로그래밍의 작동 방식을 보여주는 클라이언트측 jQuery 코드

// 버튼을 누르면 이벤트가 발생합니다. 처리하세요
// 바로 여기 익명 함수에 있습니다. 여기서 모든
// 필요한 변수가 존재하며 직접 참조가 가능합니다
$("#myButton").click(function(){
If ($("#myTextField").val() != $(this).val())
Alert("필드는 버튼 텍스트와 일치해야 합니다.");
});

사실 서버측과 클라이언트측에는 차이가 없습니다. 예, 버튼을 클릭하거나 텍스트 필드에 입력하는 것은 없지만 더 높은 수준에서는 이벤트가 발생합니다. 연결이 완료되었습니다. 이벤트입니다! 연결을 통해 데이터를 받는 것도 이벤트입니다! 연결을 통한 데이터 흐름이 중단됩니다. 이는 여전히 이벤트입니다!
이러한 유형의 설정이 Node에 이상적인 이유는 무엇입니까? JavaScript는 익명 함수 및 클로저 사용을 허용하고 더 중요한 것은 해당 구문이 코드를 작성한 모든 사람에게 친숙하다는 점에서 훌륭한 이벤트 중심 프로그래밍 언어입니다. 이벤트 발생 시 호출되는 콜백 함수는 이벤트가 캡쳐된 시점에 작성할 수 있습니다. 따라서 복잡한 객체 지향 프레임워크, 인터페이스, 과도한 엔지니어링 가능성 없이 코드를 쉽게 작성하고 유지 관리할 수 있습니다. 이벤트를 듣고, 콜백 함수를 작성하고, 시스템이 다른 모든 것을 처리하도록 하세요!

샘플 노드 애플리케이션

마지막으로 코드를 살펴보겠습니다! 논의한 모든 내용을 종합하여 첫 번째 Node 애플리케이션을 만들어 보겠습니다. 우리는 Node가 트래픽이 많은 애플리케이션을 처리하는 데 이상적이라는 것을 이미 알고 있으므로 최대 속도를 위해 구축된 매우 간단한 웹 애플리케이션을 만들 것입니다. 샘플 애플리케이션에 대한 "보스"의 특정 요구 사항은 다음과 같습니다. 난수 생성기 RESTful API를 만듭니다. 이 애플리케이션은 "number"라는 매개변수라는 하나의 입력을 허용해야 합니다. 그런 다음 애플리케이션은 0과 이 매개변수 사이의 임의의 숫자를 반환하고 결과 숫자를 호출자에게 반환합니다. "상사"는 응용 프로그램이 널리 인기 있는 응용 프로그램이 되기를 원하므로 50,000명의 동시 사용자를 처리할 수 있어야 합니다. 다음 코드를 살펴보겠습니다.

목록 2. 노드 난수 생성기

코드 복사 코드는 다음과 같습니다.

// 이 모듈을 사용하려면 가져와야 합니다.
// 노드에는 여러 모듈이 있습니다.  #include와 같습니다
// 또는 다른 언어로 된 import 문
var http = require("http");
var url = require("url");

// Node 파일에서 가장 중요한 줄입니다.  이 기능
// 서버를 생성하는 실제 프로세스를 수행합니다.  기술적으로
// 노드는
// 연결이 이루어졌습니다. 이 특정 콜백 함수는
// 실행되었습니다.  REST API로 웹서비스를 제작하고 있으니
// 우리는 http 변수가 필요한 HTTP 서버를 원합니다
// 위의 줄에서 생성했습니다.
// 마지막으로 콜백 메소드가 '요청'을 받는 것을 볼 수 있습니다
// 자동으로 '응답' 객체를 생성합니다.  익숙할 거에요
// 모든 PHP 또는 Java 프로그래머에게.
http.createServer(함수(요청, 응답) {

     // 응답은 모든 헤더와 반환 코드를 처리해야 합니다
     // 이러한 유형의 작업은 서버 프로그램에서 자동으로 처리됩니다
     // Apache 및 Tomcat과 비슷하지만 Node에서는 모든 작업을 직접 수행해야 합니다
     response.writeHead(200, {"Content-Type": "text/plain"});

     // 독특해 보이는 코드는 다음과 같습니다.  Node가 검색하는 방법은 다음과 같습니다
     // 클라이언트 요청에서 전달된 매개변수입니다.  URL 모듈
     // 이 모든 기능을 처리합니다.  구문 분석 기능
     // URL을 분해하고 쿼리 키-값을
     // 쿼리 객체.  "숫자" 키의 값을 찾을 수 있습니다
     // 직접 참조함으로써 - JavaScript의 아름다움.
     var params = url.parse(request.url, true).query;
     var 입력 = params.number;

     // 다음은 생성할 일반적인 JavaScript 메소드입니다.
     // 호출자에게 다시 전달되는 임의의 숫자
     var numInput = 새 숫자(입력);
     var numOutput = new Number(Math.random() * numInput).toFixed(0);
    
     // 응답에 난수를 씁니다
     response.write(numOutput);
    
     // 노드에서는 이 연결을 명시적으로 종료해야 합니다.  그 이유는
     // 노드를 사용하면 연결을 열어두고 데이터를 주고받을 수 있습니다.
     // 이 글에서는 고급 주제를 다루지 않습니다.
     response.end();

   // 서버를 생성할 때 HTTP 서버를 명시적으로 연결해야 합니다.
   // 포트.  표준 HTTP 포트는 80이므로 거기에 연결하겠습니다.
}).listen(80);

// 서버가 시작되면 콘솔에 문자열을 출력하여 모든 것을 알려줍니다
// 올바르게 시작됩니다
console.log("난수 생성기 실행 중...");

启动应用程序


复代码 代码如下:
root@ubuntu:/home/moila/ws/mike# 노드 무작위.js
난수 생성기 실행 중...

앱 접속

애플리케이션이 실행 중입니다. 노드가 모든 연결을 수신하고 있습니다. 테스트해 보겠습니다. 간단한 RESTful API를 만들었으므로 웹 브라우저를 사용하여 애플리케이션에 액세스할 수 있습니다. 다음 주소를 입력하세요(위 단계를 완료했는지 확인하세요): http://localhost/?number=27.
브라우저 창이 0에서 27 사이의 임의의 숫자로 변경됩니다. 브라우저에서 "새로고침" 버튼을 클릭하면 또 다른 임의의 숫자를 얻게 됩니다. 이것이 바로 첫 번째 Node 애플리케이션입니다!

노드의 장점은 무엇인가요?

이 시점에서 "Node란 무엇인가"라는 질문에 답할 수 있지만 "Node는 무엇을 위해 사용되는가?"라는 또 다른 질문이 있을 수도 있습니다. 노드에서 이익을 얻을 수 있습니다.

무엇에 좋은가요?

앞서 본 것처럼 Node는 잠재적으로 높은 트래픽이 예상되지만 클라이언트에 응답하기 전에 많은 서버 측 로직과 처리가 필요하지 않을 것으로 예상되는 상황에 적합합니다. 뛰어난 노드의 일반적인 예는 다음과 같습니다.

RESTful API

RESTful API를 제공하는 웹 서비스는 여러 매개변수를 수신하여 구문 분석하고 응답을 조합하여 사용자에게 응답(대개 적은 텍스트)을 반환합니다. 이는 수만 개의 연결을 처리하도록 노드를 구축할 수 있기 때문에 이상적인 상황입니다. 여전히 많은 논리가 필요하지 않습니다. 기본적으로 일부 데이터베이스에서 일부 값을 찾아 응답으로 구성합니다. 응답은 소량의 텍스트이고 인바운드 요청은 소량의 텍스트이므로 트래픽이 높지 않으며 단일 시스템으로 가장 바쁜 회사의 API 요구 사항도 처리할 수 있습니다.

트위터 대기열

트윗을 수신하고 이를 데이터베이스에 기록해야 하는 트위터와 같은 회사를 상상해 보세요. 실제로 초당 거의 수천 개의 트윗이 도착하므로 데이터베이스가 피크 시간대에 필요한 쓰기 수를 적시에 처리하는 것은 불가능합니다. 노드는 이 문제를 해결하는 데 중요한 부분이 됩니다. 보시다시피 Node는 수만 개의 인바운드 트윗을 처리할 수 있습니다. 별도의 프로세스가 이를 데이터베이스에 쓸 수 있는 메모리 내 대기열 메커니즘(예: memcached)에 빠르고 쉽게 기록합니다. 여기서 Node의 역할은 트윗을 신속하게 수집하고 이 정보를 작성을 담당하는 다른 프로세스에 전달하는 것입니다. 대체 설계(일반 PHP 서버가 데이터베이스 자체에 대한 쓰기를 처리하려고 시도하는 경우)를 상상해 보십시오. 데이터베이스 호출이 채널을 차단하기 때문에 각 트윗이 데이터베이스에 기록되는 데 짧은 지연이 발생합니다. 이러한 방식으로 설계된 시스템은 데이터베이스 대기 시간으로 인해 초당 2000개의 인바운드 트윗만 처리할 수 있습니다. 초당 1백만 개의 트윗을 처리하려면 500개의 서버가 필요합니다. 대신 Node는 채널을 차단하지 않고 각 연결을 처리하므로 최대한 많은 트윗을 캡처할 수 있습니다. 50,000개의 트윗을 처리할 수 있는 노드 시스템에는 20개의 서버만 필요합니다.

비디오 게임 통계

Call of Duty 온라인 게임을 플레이해 본 적이 있다면 게임 통계를 보면 바로 알 수 있습니다. 그 정도 수준의 통계를 생성하려면 엄청난 양의 정보를 추적해야 한다는 것입니다. 이런 방식으로 동시에 온라인에서 플레이하는 수백만 명의 플레이어가 있고 게임에서 서로 다른 위치에 있다면 엄청난 양의 정보가 매우 빠르게 생성될 수 있습니다. 노드는 게임에서 생성된 데이터를 수집하고 데이터 병합을 최소화한 다음 데이터베이스에 기록될 수 있도록 데이터를 대기열에 넣기 때문에 이 시나리오에 적합한 솔루션입니다. 게임에서 플레이어가 발사하는 총알 수를 추적하기 위해 전체 서버를 사용하는 것은 어리석은 것처럼 보입니다. Apache와 같은 서버를 사용하는 경우 몇 가지 유용한 제한이 있을 수 있지만 반대로, 게임 데이터에 대한 모든 통계를 추적하기 위해 전용 서버를 사용하는 경우에는 다음과 같습니다. , Node를 실행하는 서버에서와 마찬가지로 이는 현명한 조치처럼 보입니다.

노드 모듈

이 기사의 원래 주제는 아니지만 독자층의 인기로 인해 노드 모듈 및 노드 패키지 관리자에 대한 소개를 포함하도록 이 기사가 확장되었습니다. Apache 사용에 익숙한 개발자와 마찬가지로 모듈을 설치하여 Node의 기능을 확장할 수도 있습니다. 그러나 Node에 사용 가능한 모듈은 제품을 크게 향상시키며 이러한 모듈은 Node를 사용할 개발자가 일반적으로 여러 모듈을 설치할 정도로 유용합니다. 따라서 모듈은 점점 더 중요해지고 있으며 심지어 전체 제품의 핵심 부분이 되고 있습니다.
"참조" 섹션에는 사용 가능한 모든 모듈이 나열된 모듈 페이지에 대한 링크가 제공되어 있습니다. 모듈이 제공할 수 있는 가능성을 보여주기 위해 사용 가능한 수십 개의 모듈 중에 다음 모듈을 포함했습니다. 하나는 동적으로 생성된 페이지(예: PHP)를 작성하기 위한 모듈, 하나는 MySQL 사용을 단순화하기 위한 모듈, 다른 하나는 WebSockets 사용을 돕는 모듈, 텍스트 및 매개변수 구문 분석을 지원합니다. 이 개요 문서는 Node를 이해하고 (다시) 더 깊이 배울 필요가 있는지 결정하는 데 도움을 주기 위한 것이므로 이러한 모듈에 대해 자세히 설명하지 않을 것입니다. 사용 가능한 모듈.

또한 Node의 특징 중 하나는 Node 모듈을 설치하고 관리하기 위해 내장된 기능인 Node Package Module입니다. 종속성을 자동으로 처리하므로 설치하려는 모든 모듈이 올바르게 설치되고 필요한 종속성을 포함할 것이라고 확신할 수 있습니다. 또한 커뮤니티에 가입하고 자신만의 모듈을 작성하기로 선택한 경우 Node 커뮤니티에 자신의 모듈을 게시하는 것도 지원합니다. NPM은 Node 설치 중단에 대한 걱정 없이 Node의 기능을 쉽게 확장할 수 있는 방법으로 생각할 수 있습니다. 마찬가지로, Node를 사용하기로 결정했다면 NPM은 Node 솔루션의 중요한 부분이 될 것입니다.

결론

이 글을 읽은 후에는 이 글의 시작 부분에서 가졌던 "Node.js가 정확히 무엇인가요?"라는 질문에 대한 답을 얻었어야 하고, 몇 가지 명확하고 간결한 문장으로 이 질문에 대답할 수 있어야 합니다. 그렇다면 당신은 이미 많은 프로그래머보다 앞서 있습니다. Node에 대해 많은 사람들과 이야기를 나눴지만 그들은 Node가 실제로 어떤 용도로 사용되는지 항상 혼란스러워했습니다. 당연히 그들은 서버가 애플리케이션이고 HTML 파일을 넣으면 모든 것이 작동하는 Apache 사고 방식을 가지고 있습니다. 대부분의 프로그래머는 Apache와 그 사용법에 익숙하므로 Node를 설명하는 가장 쉬운 방법은 Apache와 비교하는 것입니다. Node는 Apache가 할 수 있는 모든 작업(몇 가지 모듈의 도움으로)을 수행할 수 있을 뿐만 아니라 구축할 수 있는 확장 가능한 JavaScript 플랫폼으로서 훨씬 더 많은 작업을 수행할 수 있는 프로그램입니다.
이 기사에서 볼 수 있듯이 Node는 확장성이 뛰어난 서버를 제공하려는 목표를 달성합니다. Google의 매우 빠른 JavaScript 엔진인 V8 엔진을 사용합니다. 이벤트 기반 디자인을 사용하여 코드를 최소화하고 읽기 쉽게 유지합니다. 이러한 모든 요소는 확장성이 뛰어난 솔루션을 더 쉽게 작성할 수 있도록 하는 Node의 이상적인 목표에 기여합니다.

Node가 무엇인지 이해하는 것만큼 중요한 것은 노드가 아닌 것을 이해하는 것입니다. Node는 단순히 Apache를 대체하는 것이 아니라 PHP 웹 애플리케이션을 더 쉽게 확장할 수 있도록 설계되었습니다. 진실에서 더 이상 벗어날 수 있는 것은 없습니다. Node는 아직 초기 단계이지만 매우 빠르게 성장하고 있으며 커뮤니티 참여도가 매우 높으며 커뮤니티 구성원이 수많은 훌륭한 모듈을 만들어 1년 이내에 이 진화하는 제품이 귀하의 비즈니스에 적용될 수 있습니다.

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.