분류 Nodejs

Node.js 시작하기 : 소개

컨텐츠 정보

  • 조회 289 (작성일 )

본문

Node.js 애플리케이션 작성을 위한 초보자 안내서


Tim Berners-Lee 경이 오늘날 인터넷으로 알고 있는 것에 대한 비전을 제안한 것은 1989 년이었습니다. 제안서가 잘 접수되지는 않았지만 웹의 초기 버전에서 작업 할 시간이 주어졌으며 앞으로 몇 달 동안 HTML, URI 및 HTTP의 초안과 첫 번째 브라우저 인 WorldWideWeb.app가 첫 번째 웹 서버 인 httpd.


https://contextneutral.com/story/getting-started-with-nodejs-what-and-how 


그 이후로, 초기 제안은 모든 인간의 필수품이 되기 위해 번성했으며, httpd 서버는 오늘날 웹 서비스가 작성되는 중심 아이디어가되었습니다.


그렇다면 이 서버는 무엇이며 왜 웹 아키텍처에서 필요합니까? 음, 위키 백과에서 말했듯이


서버는 컴퓨터 프로그램 또는 "클라이언트"라고 하는 다른 프로그램이나 장치에 기능을 제공하는 장치입니다. 


서버는 단순히 사용자 요청을 계산하고 결과를 반환하는 원격 컴퓨터입니다. 그러나 컴퓨터는 어떤 요청이 들어오는 지 어떻게 알 수 있습니까? 자, 여기에서 서버 측 프로그래밍이 시작됩니다. 수년 동안 우리는 Java, Ruby on Rails, Django, PHP, ASP.NET, Apache HTTP Server 등을 보유하고 있으며 비즈니스에서 최고가 되기 위해 경쟁을 벌였습니다. 그들이 충분하지 않은 시간.


방금 언급 한 모든 프레임 워크가 그들이 하는 일에 훌륭하다는 것을 알 수 있습니다. 그들은 상당히 많은 시간 동안 업계에서 가장 좋아하는 것이었지만 인터넷이 발전함에 따라 더 역동적 인 서버 런타임의 필요성이 대두 되었습니다.


폴링 응용 프로그램을 만들어야 하는 상황을 생각해보십시오. 우리의 클라이언트 응용 프로그램은 수백 마이크로 초마다 내용을 업데이트하려고합니다. 기술을 사용하여 이전 단락을 언급 했으므로 클라이언트 응용 프로그램이 영구적으로 연결 요청을 중단하거나 연결 종료를 요청할 때까지 새 클라이언트마다 새 스레드가 생성되므로 문제가 발생합니다. 처음에는 정상적인 것처럼 보이지만 초당 수천 개의 새 클라이언트를 처리하는 시스템을 확장한다고 생각하면 서버에 쉽게 리소스가 부족하거나 단순히 C10K 문제가 발생할 수 있습니다.


10861fed7a770c040a7f298ef3d29f3b.png 

여러 장치가 최근 콘텐츠에 대해 서버를 동시에 폴링 할 수 있습니다.



Node.js 또는 Nginx와 같은 이벤트 중심 아키텍처는 C10K 문제를 효율적으로 처리하는 데 그 이상을 제공합니다. 실제로 문제를 해결하기 위해 구축되었습니다. 이 기사를 위해 Node.js가 무엇인지, 무엇을 할 수 있고 어떻게 수행 하는지에 초점을 맞추자. Nginx에 대한 자세한 내용은 향후 게시물에서 볼 수 있습니다.


그렇다면 Node.js는 무엇입니까? 


Node.js는 Ryan Dahl이 2009 년 초에 기존 웹 서버의 제한된 가능성, 이미 많은 동시 요청을 처리 할 수 없고 실행 차단 스타일 (순차 프로그래밍)을 처리 할 수 ​​없다는 비판을 받은 2009 년 초에 작성되었습니다. 그는 동시성을 염두에 두고 Node.js를 작성하여 Chrome의 오픈 소스 JavaScript 엔진 V8과 이벤트 루프의 조합 위에 구축했습니다. V8과 이벤트 루프의 이러한 조합은 Node.js에게 핵심 동작을 제공합니다. I / O를 차단하지 않고 단일 스레드에서 여러 개의 동시 요청을 처리 할 수 ​​있습니다.


이벤트 루프 이해 


Node.js의 모든 것은 비동기 작업입니다. 입력 스크립트의 초기화부터 시스템의 모든 콜백에 이르기까지 모든 작업은 비동기식으로 이루어지며 작업 완료 또는 실패시 발생합니다.


이벤트 루프는 비동기 스레드를 가능한 한 단일 스레드 JavaScript 환경에서 시스템 커널로 오프 로드 하는 주요 연산자입니다. 오늘날 대부분의 운영 체제는 비동기 작업을 오프로드 하기 위한 커널 인터페이스를 제공하지만 그렇지 않은 시스템이 있을 수 있습니다. 이러한 상황에서 Node.js에 이벤트 루프를 제공하는 라이브러리 인 Libuv는 비동기 I / O 작업을 오프로드 하기 위해 4 개의 스레드 풀을 만듭니다.


Node.js의 내부 작업에 대한 자세한 정보를 수집하려는 경우 도움이 될 수 있습니다. Node.js의 이벤트 루프 및 내부 동작에 대한 자세한 내용은 별도의 게시물에서 확인할 수 있습니다.


Node.js 서버 시작 


간단한 Node.js 애플리케이션을 작성하는 데 실제로 두 부분이 있습니다. 먼저 Node.js에서 제공하는 HTTP 모듈을 가져와야 합니다. 공통 js의 require 메소드 또는 ECMAScript 가져 오기를 사용하여 모듈을 가져 오면 인수, 요청 및 응답으로 콜백 함수를 등록하는 "createServer"메소드를 사용하여 서버를 시작해야 합니다.


const http = require('http')
const server = http.createServer((req, res) => {
    res.setHeader('Content-Type', 'text/plain')
    res.end('Hello, this is a sample server!')
})
server.listen(8080)

앞에서 언급 했듯이 Node.js 환경에서 실행되는 모든 코드는 비동기 작업입니다. 이벤트 루프에 방금 등록한 createServer 메소드의 콜백 함수는 새 요청이 서버에 도달하고 요청 및 응답 오브젝트가 모두 스레드 풀 또는 OS 커널의 비동기 인터페이스에 의해 준비 될 때마다 트리거 됩니다.


콜백을 따르는 것은 매우 간단합니다. 우리는 요청 객체 (요청)를 가져 와서 가능한 경우 필요한 세부 정보를 꺼내고 res 객체를 사용하여 요구에 대한 응답으로 요청의 발신자 (클라이언트)에게 응답을 다시 보냅니다. 간단하지 않습니까? 어쩌면 먼저 이 두 콜백 객체가 무엇인지 확인한 다음 그 의미를 이해 하려고 합니다.


요청 오브젝트 이해 


이름에서 알 수 있듯이 요청은 서버에 도달 한 모든 요청에 ​​대한 처리기입니다. 대상의 요청에 대한 모든 세부 사항, 특히 요청하는 클라이언트의 IP 주소, 호스트 이름, 헤더, 본문 (JSON 또는 기타), 매개 변수, 쿼리 문자열 및 관련 정보가 포함 된 일반 JavaScript 객체입니다. 모든 서버 환경에서 합법적 인 요청을 합니다.


# 요청 URL의 매개 변수 읽기 

const params = req.params

요청을 올바르게 구문 분석하고 적절하게 응답하는 것은 서버의 책임입니다. Node.js가 요청을 구문 분석하는 동안 요청 객체를 읽고 요청-응답 트랜잭션을 완료하기 위해 응답하는 것은 프로그래머의 일입니다.


그리고 응답 객체 


트랜잭션을 완료하려면 유효한 응답을 클라이언트로 다시 보내야 합니다. 그러나 무엇이 유효하고 무엇이 아닌가? 답장을 보내려면 어떻게 해야 합니까?


Node.js는 이러한 상황을 제거하기 위한 최소한의 응답 API를 제공합니다. 요청에 대한 콜백으로 수신되는 응답 객체는 클라이언트에 회신하는 데 필요한 모든 메소드, 응답 헤더를 설정하기 위한 setHeader 또는 응답 본문에 데이터를 첨부하기 위한 추가 메소드 또는 최종적으로 응답 프로세스를 종료하기 위한 end 메소드를 보유합니다. 

res.setHeader('Content-Type', 'text/plain')

미리 정의 된 방법을 사용한다고 해서 전송 된 응답이 유효해야 한다는 것은 아니지만 오류율을 최소로 유지해야 합니다.


우리는 왜 듣습니까? 


퍼즐의 마지막 부분은 듣기 방법입니다. 서버 인스턴스를 초기화 한 후에는 무엇이며 왜 필요합니까?


글쎄, 당신이 네트워킹 클래스를 했다면, 당신은 클라이언트가 임의적이지만, 서버는 연결하려는 모든 클라이언트에게 주소가 알려진 단일 시스템이라는 것을 이미 알고 있을 것입니다. 이제 모든 서버에 표시하기 위해 서버는 청취 및 수락 아키텍처를 구현합니다. 요청이 이루어지면 대기열에 들어가고 서버가 수락 할 준비가 되면 꺼냅니다.


여기에서, 청취 메소드는 Node.js 아키텍처에서 청취 부분을 수행하는 반면 createServercallback은 승인으로 처리 될 수 있습니다.


듣기에는 네 가지 매개 변수가 사용됩니다. 첫 번째는 Node.js 프로세스가 실행되어야 하는 포트 번호이며, 두 번째는 포트와 함께 서버의 고유 한 프로세스 식별자를 생성하는 호스트 이름입니다.

const PORT = 8080,
      HOSTNAME = '127.0.0.1',
      BACKLOG = 10
      
server.listen(PORT, HOSTNAME, BACKLOG, () => {
    console.log('Server is now listening on', PORT)
})

메소드의 세 번째 및 네 번째 매개 변수는 각각 보류중인 리스너 큐에 대한 기본 백 로그 및 리스너의 성공적인 시작에 대한 콜백입니다.


모든 수신 대기 매개 변수는 선택 사항이지만, 필요한 경우 백 로그에 대해 포트 및 호스트 이름에 값을 지정하는 것이 좋습니다. 그렇게 하는 이유는 기본값입니다. OS가 사용자 정의 포트를 찾지 못하거나 0으로 설정되어 있으면 임의의 미사용 포트를 프로세스에 할당합니다. 호스트 이름도 마찬가지입니다. 서버가 사용자 정의 값을 찾지 못하면 지정되지 않은 IPv4 주소 (0.0.0.0) 또는 지정되지 않은 IPv6 주소 (: :)에서 연결을 수락합니다 (사용 가능한 경우). 프록시 서버 뒤에서 실행하든 HTTP에서 직접 실행하든 (포트 80) 프로덕션 환경에서는 두 기본값을 모두 사용할 수 없습니다.


이 간단한 코드 설정으로 일반 텍스트를 반환하는 최소한의 서버를 쉽게 시작할 수 있습니다. "여보세요, 샘플 서버입니다!" -모든 종류의 요청에. 위의 코드 조각을 js 파일 (server.js)에 정리하고 다음과 같이 노드 프로세스를 실행하십시오.

node server.js

리스너 콜백에서 정의한 대로 스크립트가 "서버가 현재 8080을 수신 중입니다"라는 로그 메시지를 리턴 함을 알 수 있습니다. 무엇보다도 가장 좋은 점은 Node.js가 계속 실행되고 청취를 위해 CPU 리소스를 소모하지 않으며, 처리해야 할 새로운 요청이 없는 한 단순히 절전 모드로 전환한다는 것입니다.


이것으로 Node.js 소개를 요약합니다. Node.js가 무엇인지, Node.js와 같은 단일 스레드 서버 아키텍처가 긴급한 이유, 이벤트 루프가 무엇인지, 간단한 HTTP 서버를 시작하는 방법을 알아야 합니다. 또한 요청 및 응답 객체가 무엇인지, Node.js가 새로운 요청을 수신 및 수락하고 처리하여 이벤트 루프를 통해 요청-응답 트랜잭션을 완료하는 방법을 알아야 합니다.