220809.til

Universe·2022년 8월 9일
0

study

목록 보기
23/49

Node.js ???

Node.js 는 어떻게 나오게 됐나요 ?

자바스크립트라는 언어가 있더랬다
적어도 이 언어를 만든 브랜든 아이크는 이 언어가
지금까지 꾸준히 사랑받는 언어일 줄 알았다면
고작 10일만에 만들지는 않았을 것이다

자바스크립트는 HTML 조작과 변경 그 하나의 목적을 위한 언어다
HTML 웹 페이지에 글 쓰고 그림넣는 언어
우리는 자바나 파이썬을 설치 하는 것 처럼 자바스크립트를 설치하지는 않는다
자바스크립트는 브라우저가 해석해주는 툴을 가지고 있기 때문에
브라우저 마다 자바스크립트 해석엔진이 있다
그중 크롬은 V8 엔진을 사용했다

그 훌륭한 자바스크립트 해석엔진을 크롬에서 떼와서
비동기 이벤트 처리 라이브러리 libuv를 결합해
런타임 패키지로 출시했던게 Node.js 다

런타임은 쉽게말해서 프로그램이 구동되는 환경,
어떤 프로그램이 동작할 때 프로그램이 동작되는 환경이라고 할 수 있겠다

Node.js의 개발은
Javascript 라는 언어를 다른 환경에서도 실행할 수 있게 하기 위해 되었다
따로 브라우저 없이도 자바스크립트 쓸 수 있다





그래서 장점이 뭔데요 ?

자바스크립트는 쉬운 언어이기에 (접근성이 좋다는 의미) 서버 만들기가 쉽다
근데 왜 하필 노드로 서버를 만들까 ? 그 이외의 다른 장점은 ?





예를들어...

일반적인 매표소에 4개의 요청이 들어온다 (blocking I/O 환경)

첫번째 사람이 A표 한장을,
두번째 사람이 B표 두장을,
세번째 사람이 A표 오백장, B표 오백장을,
네번째, 다섯번째 사람이 A표를 각각 한장씩 구매한다

그러면 blocking I/O 환경에서는
순서대로 처리한다
첫번째, 두번째 손님은 표를 주문하고 받는 데 까지 걸리는 시간이 아주 짧겠지만
매표소에 비이상적으로 많은 주문이 들어온 그 다음손님은
꼼짝없이 세번째 사람의 주문처리가 끝나는 시간까지 기다려야 한다

그렇다면 node.js 의 non-blocking I/O 환경에서는 어떻게 처리될까 ?
같은 주문이 들어왔다고 해보자
node 매표소에서는 일단 주문을 전부 받는다
그리고 요청순서와는 상관없이 작업이 완료되는 순서대로 표를 끊어준다

Blocking I/O 환경의 경우 서버에 버거운 요청이 들어오면
서버가 잠깐이나마 다른 요청을 받을 수 없는 반면에
Non-blocking I/O 환경, node.js 이 환경에서는
멈추거나 요청의 대기시간이 존재하지 않는다

요즘같이 SNS, 채팅시스템의 요청이 활발한 웹 서비스의 경우
한국인은 기다리는걸 그렇게 좋아하지 않으므로
이러한 node.js 의 장점이 부각된다





node.js 실습

express 라는 웹 애플리케이션 프레임워크을 사용한다

// server.js
const express = require('express');      // express 를 require 해온다
const app = express();                   // 그걸 app 에 담아서 사용할거야
app.listen(8000, function(){	         // 8000 포트에 할당할건데
	console.log('listening on 8000');	 // 들었으면 콘솔에 보여줘
});

// terminal
$ node server.js
== listening on 8000

app.listen 은 원하는 포트에 서버를 오픈해준다
두개의 파라미터를 받는데
( 서버를 오픈할 포트번호, 서버 오픈시 실행할 코드)
라고 생각하면 된다

포트는 컴퓨터가 외부와 통신할 수 있는 종단점 이라고 생각하면 쉽다

  • 0번 ~ 1023번: 잘 알려진 포트 (well-known port)
  • 1024번 ~ 49151번: 등록된 포트 (registered port)
  • 49152번 ~ 65535번: 동적 포트 (dynamic port)

그리고 API 를 만들어 줄건데

const users = [
  {
    id: 1,
    name: "Rebekah Johnson",
    email: "Glover12345@gmail.com",
    password: "123qwe",
  },
  {
    id: 2,
    name: "Fabian Predovic",
    email: "Connell29@gmail.com",
    password: "password",
  },
];
// user.js
const createUser = (req, res) => {
  const user = req.body.data;
  // const { id, name, email, password} = req.body.data // 구조분해할당
  console.log("추가된 계정 :", user);
  // users.push(req.body.data) // 이렇게 써두 댐
  users.push({
    id: user.id,
    name: user.name,
    email: user.email,
    password: user.password,
  });
  // users.push({ id, name, email, password})
  console.log("추가 후 계정목록 :", users);
  res.json({ message: "userCreated" });
};

module.exports = { createUser };

간단하게 서버에 post 요청이 들어오면 계정을 생성해주는 api
module.exprots = {createUser} 로 exports 해준 모듈은
메인 서버에서
const { createUser } = require("./user");
app.post("/signup", createUser);

이런 명령으로 불러올 수 있다
8000 포트의 /signup 로 post 요청을 보내면
createUser 를 실행해 주세요~ 하는 방식이다
createUser 함수는 응답을
users 오브젝트에 정해진 key - value 를 받아 push 하는 함수이다

const { id, name, email, password} = req.body.data
구조 분해 할당 하여 이렇게도 가져올 수 있다

구조 분해 할당은 다른게 아니고

let array = [1, 2, 3, 4, 5];
let [a, b, ...rest] = array;
console.log(rest); // [3, 4, 5];

배열이나 오브젝트에서 자주쓰는 자바스크립트 기법이라고 한다
신기했다 🧐





총평

헤매진 않고 생각했던 것 보다 오히려 많이 쉬웠는데
음.. 뭐라고 할까
프론트엔드 할 때는 다른분들이 예쁘게 짜신 코드들을 보면 설레고 좋았는데
백엔드는 그런 예쁜 코드들도 첫장부터 너무 딱딱해서 거부감이 들었다
🧐🧐🧐

profile
Always, we are friend 🧡

0개의 댓글