Node.js 에 대해 자세히 알아보자
FE BE 개발 메모장/Node.js, API

Node.js 에 대해 자세히 알아보자

Node.js를 처음에 맛보기로만 배웠을 때 단순히 백엔드 개발자에만 맞춰진 런타임이라고 생각했었다. 그러나 Node.js란? 이라는 글을 보고 생각이 조금 바뀌게되었다. 그래서 우선 가장 기본적인 내용만 정리해보려고 한다.

 

Node.js란 무엇일까?

 Node.js는 Chrome V8 JavaScript 엔진으로 빌드된 JavaScript 런타임이다. 단순히 이렇게 해석해서는 잘 이해가 되지 않는다. 여기서 런타임이란 프로그래밍 언어가 구동되는 환경을 말하는데, Node.js가 나오기전 까진 크롬, 파이어폭스 같은 브라우저(browser)에서만 동작했다.

 

 그러한 한계를 극복하고 탄생한 것이 바로 Node.js이다. 브라우저 외부 즉 컴퓨터 로컬 내에서도 다양한 용도로 확장하기 위한 JavaScript Runtime이다. 즉 우리가 Axios, Express를 사용해 웹서버를 제작하는것 외에도, Python처럼 다른 브라우저의 정보를 크롤링해올 수 있다.

 

결국, Node.js는 백엔드 개발자 뿐만 아니라 프론트엔드 개발자도 충분히 사용이 가능한 환경을 말하며, NPM과 같은 방대한 자료를 받을 수 있는 기능을 제공한다.

 

Node.js의 특징은 뭐지?

비동기 I/O 처리: Node.js내의 라이브러리는 모든 API는 비동기식(Async)이다. None-Blocking이라는 절대 멈추지 않는다는 의미가 있는데 Node.js 기반 서버가 실행됬을때, 데이터를 반환할때까지 기다리지 않고 바로 다음 API를 실행한다. 이전에 실행했던 API가 결과값을 반환한다면, Node.js 이벤트 알림 메커니즘을 통해 받아온다.

 

빠른속도: 크롬 V8 JS엔진을 사용해 빠른 처리속도를 제공한다. 그래서 어플리케이션엔 데이터 버퍼링이 없고 chunk로 출력한다.

 

뛰어난 확장성: Node.js는 싱글 쓰레드 모델이다. (JavaScript 언어가 싱글 쓰레드 방식으로 동작하다 보니 그런것 같다.) 이벤트 메커니즘은 서버가 멈추지 않고 반응하도록 해주어 서버의 확장성을 키워준다.

 

 

그러면 Node.js를 사용하기 적합한 환경은 뭘까?

  • 알림이나 실시간 대화같은 데이터의 실시간 처리가 필요한 애플리케이션
  • 데이터 스트리밍 애플리케이션
  • JSON API 기반의 애플리케이션
  • 단일페이지(SPA, Single Page Application) 애플리케이션
  • 사용자의 입, 출력이 잦은 애플리케이션

 

Node.js를 사용하는 대표적인 회사

 

그러면 Node.js 사용이 적합하지 않는 곳은 어디?

Data Science 같이 복잡한 데이터를 처리하기 위해 CPU, RAM 등 하드웨어를 사용해야 하는 곳에 적합하지 않다.

이러한 환경에 적합한 언어는 Python이나 Django가 있다.

 

 

Node.js 사용방법

가장 먼저 npm 으로 필요한 라이브러리를 설치해준다.

const fs = require('fs')
const http = require('http')
const url = require('url')
const path = require('path')

 

간단한 서버 생성

우선  EventEmitters와 Streams을 (추후에 정리하도록함) 알아야 하며, 간단하게 요약하자면

EventEmitters는 자바스크립트 자체에는 이벤트와 관련된 객체가 없기 때문에 Node.js에서 event객체를 가져온다.

Streams는 배열이나 문자열 같은 데이터 컬렉션으로, 흩어진 코드를 조합할 수 있도록 도와준다.

 

모든 node 웹 서버 애플리케이션은 웹 서버 객체를 만들기 위해 .createServer을 사용한다.

 

const http = require('http');

const server = http.createServer((request, response) => {
 //...statement
})

//축약문법
server.on('request', (request, response) => {
 //...statement
});

 

메소드, URL, 헤더 넣는 법

 

const { headers, method, url } = request

const userAgent = headers['user-agent'];

 

http메소드를 쓸 경우 if문으로 나누는 방법

const { headers, method, url } = request

const userAgent = headers['user-agent'];

if(method === 'GET'){
  //...body
}

else if(metohd === 'POST'){
 //...body
}

 

요청 바디

let body = [];
request.on('data', (chunk) => {
  body.push(chunk);
}).on('end', () => {
  body = Buffer.concat(body).toString();
})

HTTP 트랜잭션 

 

 

 

출처 -

 

nodejs.org/ko/docs/guides/anatomy-of-an-http-transaction/ 

www.huskyhoochu.com/nodejs-eventemitter/

perfectacle.github.io/2017/06/18/what-is-node-js/

geonlee.tistory.com/92

'FE BE 개발 메모장 > Node.js, API' 카테고리의 다른 글

NPM과 NVM 그리고 NPX  (0) 2021.06.17
CORS (Cross Origin Resource Sharing) 적용 방법  (0) 2021.06.16
Express API  (0) 2021.03.03
fetch API  (0) 2021.02.03