Node.js

younghyun·2022년 7월 31일
0

Node.js

Node.js는 JavaScript를 웹 브라우저 프로그램 이외 환경인 서버에서도 사용할 수 있도록 만든 프로그램(런타임 환경 = 실행 환경). 오픈 소스

사용 이유

Node.js를 사용하려면 먼저 JavaScript를 배워야함. Node.js는 JavaScript를 사용하기 위해 만들어졌기 때문.
JavaScript는 C/C++, Java와 같은 프로그래밍 언어.JavaScript는 독립적인 언어가 아닌 스크립트 언어. 웹 브라우저 프로그램 안에서만 동작함. Node.js를 설치하면 Terminal Program(윈도우 cmd, 맥 terminal 등)에서 Node.js를 입력해 브라우저 없이 실행 가능.
이전에는 Server-Client 웹사이트를 만들 때 웹에 표시되는 부분은 JavaScript를 사용해 만들어야만 했으며, 서버는 Ruby, Java 등 다른 언어를 써서 만들었어야 했는데 마침내 한 가지 언어로 전체 웹 페이지를 만들 수 있게 된 것.

장점

  1. JavaScript에서 분리된 언어이기 때문에 문법은 같음.
  2. Node.js를 이용하여 서버를 만들 수 있음.
  3. 웹 브라우저와 무관한 프로그램을 만들 수 있게 됨.
  4. 멀티 스레드 방식에 비해 적은 컴퓨터 자원을 사용
  5. I/O 작업이 많은 서버로 적합
  6. 웹 서버가 내장되어 있어 별도의 웹서버를 설치할 필요가 없음.
  7. 자바스크립트를 사용하기 때문에 JSON 형식과 쉽게 호환
  8. Local에서 server만 켜도 정말 가볍다는 것 알 수 있음.
  9. 이벤트 기반 비동기방식이어서 서버 무리가 적음.
  10. Chrome V8 JavaScript 엔진으로 빌드된 JavaScript 런타임이어서 속도가 빠름.
  11. 한 가지로 언어로 server-client 모두 개발 가능.

단점

  1. 이벤트 기반 비동기방식이라 서버단 로직이 복잡한 경우 콜백함수의 늪에 빠질 수 있음. 예를 들어, 한번의 요청에 대해 DB에서 조회한 결과값에 따라 다른 로직을 처리해야 하며, 이런 로직이 여러개인 경우 콜백함수 늪 (Callback Hell) 에 빠짐.
  2. 코드를 순차적으로 실행하는 것이 아니라 비동기 방식으로 이벤트를 보내고, 응답(이벤트)이 오면 처리하는 방식이기 때문에 java 개발을 했던 방식으로 설계하고 프로그래밍하면 큰 문제가 발생.
  3. 단일 쓰레드(Single Thread)이기 때문에 하나의 작업 자체가 많이 걸리는 웹서비스에는 어울리지 않음. 게시판형태와 같이 가벼운 I/O가 많은 웹서비스에 어울림.
    (CPU를 많이 사용하지 않는 작업 위주 개발)
  4. 코드가 수행되어야 코드에 에러가 있는지 알 수 있으며, 에러가 날 경우 프로세스가 내려가기 때문에 테스트가 엄청 중요. 반드시 모든 케이스에 대해 소스코드를 검증해야함.

Node.js가 어울리는 서비스

  1. 간단한 로직.
  2. 대용량(동시에 여러 request를 처리)
  3. 빠른 응답시간 요구
  4. 빠른 개발 요구
  5. 비동기방식에 어울리는 서비스(네트워크 스트리밍 서비스, 채팅 서비스 등)
    Ex) Netflix, Linkedin, Paypal, Uber, Facebook 같은 회사들 역시 자신의 서비스에 적극적으로 Node.js를 사용

Node.js 가 어울리지 않는 웹서비스

  1. 단일 처리가 오래 걸리는 경우 : 싱글 쓰레드이기 때문
  2. 서버 체크로직이 많은 경우 : 비동기방식이기 때문에 CallBack Hell에 빠지지 않기 위해
  3. 업무 복잡도/난이도가 높은 경우 : 에러가 나면 서버가 죽기 때문에 코드 품질 중요

자바스크립트 런타임

  • 런타임 : 특정 언어로 만든 프로그램을 실행할 수 있는 환경
  • Node.js는 JavaScript Program을 컴퓨터에서 실행할 수 있게 하는 자바스크립트 실행기

이벤트 기반

  • 노드는 V8과 더불어 libuv라는 라이브러리 사용.
  • libuv 라이브러리는 노드의 특성인 이벤트 기반, 논 블로킹 I/O 모델을 구현하고 있음.
  • 이벤트 기반(Event-driven)이란 이벤트가 발생할 때 미리 지정해둔 작업을 수행하는 방식을 의미.
  • 즉, 이벤트 기반 시스템에서는 특정 이벤트가 발생할 때 무엇을 할지 미리 등록해두고, 이를 이벤트 리스너에 콜백함수를 등록.
  • 이후 이벤트가 발생하면 리스너에 등록해둔 콜백함수를 호출하며, 이벤트가 끝난 후 노드는 다음 이벤트가 발생할 때까지 대기.

이벤트 루프

  • 여러 이벤트가 동시에 발생했을 때 어떤 순서로 콜백함수를 호출 할지를 이벤트 루프가 판단.
  • Node.js는 이벤트가 종료될 때까지 이벤트 처리를 위한 작업을 반복하므로 루프(loog)라고 부름.

논 블로킹 I/O

  • 이벤트 루프를 잘 활용하면 오래 걸리는 작업을 효율적으로 처리할 수 있음.
  • 작업에는 두 가지 종류가 있는데 동시에 실행될 수 있는 작업과 동시에 실행될 수 없는 작업.
  • 특히 파일 시스템 접근, 네트워크를 통한 요청 작업은 입력(Input)/출력(Output)의 일종이며, 이러한 작업을 할 때 노드는 비동기 방식으로 블로킹을 만들지 않게 끔(논 블로킹) 처리함.
  • 비동기이란 이전 작업이 완료될 때까지 대기하지 않고 동시에 작업을 수행.
  • 반대로 동기는 이전 작업이 끝나야만 다음 작업을 수행.
  • 자세하게 풀어서 아야기하면 함수 호출 시 당장 실행하는 것이 아니라(동기→블로킹) 일단 어느 곳에 쌓아 놓고 동시에 요청을 처리하고(비동기→논 블로킹) 요청이 완료된 순서대로처리(스택 이용) 한다는 말.

싱글 스레드

이벤트 기반, 논 블로킹 모델과 더불어 노드를 설명하는 키워드 중 하나는 싱글 스레드
자바스크립트 코드는 동시에 실행될 수 없는데 그 이유는 노드가 싱글 스레드 기반이기 때문

  • 프로세스 : 운영체제에서 할당하는 작업의 단위. 노드나 웹 브라우저 같은 프로그램은 개별적인 프로세스. 프로세스 간에는 메모리 등의 자원을 공유하지 않음.
  • 스레드 : 스레드는 프로세스 내에서 실행되는 흐름의 단위. 프로세스는 스레드를 여러 개 생성해 여러 작업을 동시에 처리할 수 있음. 스레드들은 부모 프로세스의 자원을 공유. 같은 주소의 메모리에 접근 가능하므로 데이터를 공유할 수 있음.
    Node.js는 싱글스레드, 논 블로킹 모델로 하나의 쓰레드가 request를 받으면 바로 다음 처리에 요청을 보내놓고 다른 작업을 처리하다가 먼저 요청한 작업이 끝나면 이벤트를 받아서 응답을 보냄.
    동시 request가 오더라도 처리가 완료될때까지 기다리지 않아도 되기 때문에 서버 부하가 적음.

결론

노드는 기본적으로 싱글 스레드, 논 블로킹 모델을 채용하므로 I/O 요청이 많이 발생하면 노드를 서버로 사용하는 것이 좋음. 하지만 노드는 CPU 부하가 큰 작업에는 적합하지 않음.

우리가 작성하는 코드는 모두 스레드 하나에서 처리되기 때문에 코드가 CPU 연산을 많이 요구하면 스레드 하나가 혼자서 감당하기 어려움.

즉, 개수는 많지만 크기는 작은 데이터를 실시간으로 주고받는데 노드는 적합. 예를 들어 네트워트나 데이터베이스, 디스크 작업 같은 I/O에 특화되어있음. 실시간 채팅 애플리케이션, 주식 차트도 포함.

Express

Express는 Node.js를 사용하여 서버를 개발하고자 하는 개발자들을 위하여 서버를 쉽게 구성할 수 있게 만든 프레임워크.
Node.js를 이용하여 웹 애플리케이션을 만들기 위한 틀(Frame)을 제공하는 클래스, 라이브러리의 집합.
즉, Node.js를 사용하여 쉽게 서버를 구성할 수 있게 만든 클래스와 라이브러리의 집합체.

장점

  1. 웹 애플리케이션을 만들기 위한 각종 라이브러리와 미들웨어 등이 내장돼 있어 개발하기 편함.
  2. 수많은 개발자들에게 개발 규칙을 강제해 코드 및 구조의 통일성을 향상시킬 수 있음.
  3. 가장 보편적으로 사용해서 구글링을 통해 레퍼런스 체크가 편함.
  4. 코드 양을 줄여주고, 추후 유지보수를 쉽게 만들어줌.
  5. 사용자에게 최소한의 프레임워크를 제공하고 사용자는 익스프레스의 기능 중 필요한 것만 추가하고 필요하지 않다면 제거할 수 있음.
  6. 클라이언트(브라우저, 모바일 기기, 다른 서버, 데스크톱 애플리케이션, 기타 HTTP를 사용하는 모든 것)의 HTTP 요청을 받고, 응답을 반환함.
  7. 현재 익스프레스는 트래픽이 많은 웹 사이트에서 최고의 성능을 발휘
  8. 자바스크립트 생태계의 특징 중 하나는 크기와 다양성. 익스프레스는 이러한 특징을 인지하고, 애플리케이션을 개발할 때 원하는 구성 요소를 쉽게 추가할 수 있도록 극도로 유연한 미들웨어(middleware) 시스템을 만듦.

단점

  1. 규모가 큰 프로덕트의 경우 많은 개발자들이 손을 대게 됨. 많은 개발자들의 개성, 편의에 따라 수많은 종류가 생길 것이고, 이것이 통일성을 해치게 되어 어지러움이 유발될 수 있음.

FrameWork

어떠한 작업을 쉽게 완성하기 위한 라이브러리의 집합
작업을 시작부터 끝까지 라이브러리로 지원한다는 점이 단순한 라이브러리와 차이.
예를 들면 jQuery는 JavaScript 라이브러리로 다양한 용도를 가지고 있지만, jQuery 자체가 무엇 하나를 이루기 위한 목적을 가지고 있지는 않음.

const express = require('express'); // 모듈 익스프레스가 내보낸 무엇이든 express 변수에 할당됨.
const app = express(); // express함수 호출.
const port = 3000;

app.get('/', (req, res) => {
  res.send('Hello World!');
});

app.listen(port, () => {
  console.log(`Example app listening on port ${port}`);
}); // 원하는 포트에 서버를 오픈하는 문법. 오픈할 포트번호, 서버 오픈시 실행할 코드

require

NodeJS에서 사용되고 있는 외부 라이브러리 불러오는 CommonJS 키워드

CommonJS

자바스크립트를 서버에서 사용할 수 있는 큰 이유 중 하나는 모듈화가 가능하기 때문이다. 자바스크립트 모듈화 명세를 만든 대표적인 그룹 중 'CommonJS'가 있고, 이 CommonJS의 명세가 현재 node 표준이 됨.

node 표준(=CommonJS의 명세)이 require와 module.exports.

그런데 ES6로 넘어오면서 자바스크립트 자체에서 ES6 Module이라는 이름으로 모듈화를 지원하기 시작했고 이것이 바로 import 와 export.

라우팅

라우팅은 URI(또는 경로) 및 특정한 HTTP 요청 메소드(GET, POST 등)인 특정 엔드포인트에 대한 클라이언트 요청에 애플리케이션이 응답하는 방법을 결정하는 것
매우 기본적인 라우트의 예

app.METHOD(PATH, HANDLER)

app은 express의 인스턴스.
METHOD는 HTTP 요청 메소드.
PATH는 서버에서의 경로.
HANDLER는 라우트가 일치할 때 실행되는 함수.

홈 페이지에서 Hello World!로 응답:

app.get('/', function (req, res) {
  res.send('Hello World!');
});

애플리케이션의 홈 페이지인 루트 라우트(/)에서 POST 요청에 응답:

app.post('/', function (req, res) {
  res.send('Got a POST request');
});

/user 라우트에 대한 PUT 요청에 응답:

app.put('/user', function (req, res) {
  res.send('Got a PUT request at /user');
});

/user 라우트에 대한 DELETE 요청에 응답:

app.delete('/user', function (req, res) {
  res.send('Got a DELETE request at /user');
});

라우트 메소드

라우트 메소드는 HTTP메소드 중 하나로부터 파생, express 클래스 인스턴스에 연결됨.

Express는 HTTP 메소드에 해당하는 다음과 같은 라우팅 메소드를 지원. get, post, put, head, delete, options, trace, copy, lock, mkcol, move, purge, propfind, proppatch, unlock, report, mkactivity, checkout, merge, m-search, notify, subscribe, unsubscribe, patch, search 및 connect.

참고
https://hanamon.kr/nodejs-%EA%B0%9C%EB%85%90-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0/
https://expressjs.com/ko/guide/routing.html
https://velog.io/@leobit/CommonJS

profile
선명한 기억보다 흐릿한 메모

0개의 댓글