자바스크립트라는 언어가 있더랬다
적어도 이 언어를 만든 브랜든 아이크는 이 언어가
지금까지 꾸준히 사랑받는 언어일 줄 알았다면
고작 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 의 장점이 부각된다
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
은 원하는 포트에 서버를 오픈해준다
두개의 파라미터를 받는데
( 서버를 오픈할 포트번호, 서버 오픈시 실행할 코드)
라고 생각하면 된다
포트는 컴퓨터가 외부와 통신할 수 있는 종단점 이라고 생각하면 쉽다
그리고 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];
배열이나 오브젝트에서 자주쓰는 자바스크립트 기법이라고 한다
신기했다 🧐
헤매진 않고 생각했던 것 보다 오히려 많이 쉬웠는데
음.. 뭐라고 할까
프론트엔드 할 때는 다른분들이 예쁘게 짜신 코드들을 보면 설레고 좋았는데
백엔드는 그런 예쁜 코드들도 첫장부터 너무 딱딱해서 거부감이 들었다
🧐🧐🧐