ํ๋ก ํธ, ๋ฐฑ์๋ ์ค๋น๋ฅผ ์ํด ๋ฏธ๋ฆฌ 0.0~0.4๋ฅผ ๋ค์ด์ผํ๋ค...
์๋ค์๋ค๊ฐ ์ง๊ธ 1์๊ฐ์งธ ํํ์ณค๋ค...
https://ssocoit.tistory.com/188 ์ฐธ๊ณ
#0.2 server Setup
https://www.npmjs.com/package/ws
๋จผ์ node, ws, express, pug ์ค์น
๋๋ ์ด๋ฏธ ๋ ธ๋๋ ์ค์น๋์ด ์์ผ๋ฏ๋ก ๋๋จธ์ง ์ธ๊ฐ๋ง ์ถ๊ฐ๋ก ์ค์นํจ..
npm i ws
npm i express
npm i pug
github์ ์ฌ๋ฆฐ๋ค๋ฉด readme ํ์ผ๋ ์ถ๊ฐ๋ก ์์ฑํด์ค ์ ์๋ค.
ํฐ๋ฏธ๋์ npm init-y ๋ฅผ ์ ๋ ฅํ๋ฉด ๋ญ๊ฐ ์์ด๋ณด์ด๋ ๊ธฐ๋ณธ package.json ํ์ผ์ ์์ ํด์ค๋ค. ๊ฑฐ๊ธฐ์ ์ถ๊ฐ๋ก ๋ง๋ถ์ด๊ณ ์ถ์ ๋ด์ฉ์ ์์ฑํ๋ฉด ๋๋ค.
nodemon๊ณผ babel์ ์ฌ์ฉํ ๊ฒ์ด๋ ํฐ๋ฏธ๋์ ์ค์น ๋ช ๋ น์ ์ ๋ ฅํ๋ค.
npm i @babel/core @babel/cli @babel/node -D
npm i nodemon -D
npm i @babel/preset-env -D
๊ทธ๋ฆฌ๊ณ babel.config.json, nodemon.json์ด๋ผ๋ ํ์ผ์ ๋ง๋ค์ด์ค๋ค.
nodemon.json
ignore์ ํด๋น ํด๋์ ๊ทธ ์์ ์๋ ๋ชจ๋ ํ์ผ์ ๋ฌด์ํ๋ ๊ฒ์ ์๋ฏธํ๋ค. public ํด๋ ๋ด์ ํ์ผ์ด ์์ ๋์ด๋ nodemon์ด ์ฌ์์๋์ง ์๋๋ก ํ๋ ๊ฒ์ด๋ค.
{
"ignore": ["src/public/*"],
"exec": "babel-node src/server.js"
}
babel.config.json
{
"presets": ["@babel/preset-env"]
}
src ํด๋๋ฅผ ๋ฐ๋ก ๋ง๋ค์ด ์ฌ๊ธฐ์ server.js ํ์ผ์ ๋ง๋ค์ด์ค๋ค.
์์ฑ๋ package.json
{
"dependencies": {
"express": "^4.18.2",
"node": "^19.6.0",
"pug": "^3.0.2",
"ws": "^8.12.1"
},
"scripts": {
"dev": "nodemon",
"start": "node server.js"
},
"name": "zoom_clonecoding",
"version": "1.0.0",
"main": "server.js",
"devDependencies": {
"@babel/cli": "^7.21.0",
"@babel/core": "^7.21.0",
"@babel/node": "^7.20.7",
"@babel/preset-env": "^7.20.2",
"nodemon": "^2.0.20"
},
"keywords": [],
"author": "",
"license": "hykim",
"description": "zoom cloneCoding using NodeJS, WebRTC and WebSockets"
}
server.js์์ ์๋ฒ ํ ์คํธ
import express from "express";
const app = express();
console.log("hello");
app.listen(3000);
์๋ฒ ์คํ๋ฌธ
npm run dev
#0.3 Frontend Setup
๋๋ ๊ทธ๋๋ ์์ง๊น์ง html์ ๋ง์ด ๊ธธ๋ค์ฌ์ ธ์์ด์ pug๋ ์ ๋ง ์ ์์ด ์๋๋๋ฐ... ์ด๋ค๋ ๋ญ ์จ๋ด์ผ์ง
๊ทธ๋ฆฌ๊ณ pug ํ์ผ์ ์์๊ฒ ๊พธ๋ฉฐ์ค ์ ์๋๋ก mvp.css๋ฅผ ์ด์ฉํ๋ค.
home.pug
doctype html
html(lang="en")
head
meta(charset="UTF-8")
meta(http-equiv="X-UA-Compatible", content="IE=edge")
meta(name="viewport", content="width=device-width, initial-scale=1.0")
title Noom
//- mvp.css ์ฌ์ฉ
link(rel="stylesheet", href="https://unpkg.com/mvp.css")
body
header
h1 Noom
main
h2 Welcome to Noom
script(src="/public/js/app.js")
server.js
import express from "express";
// <---- express ์๋ฒ ์ค๋น
const app = express();
// pug ํ์ด์ง๋ฅผ rendering ํ๊ธฐ ์ํจ
app.set('view engine', 'pug');
// views directory๊ฐ src ์์ ์์ผ๋ฏ๋ก
app.set('views', __dirname + "/views");
// public ํด๋ ๋ด์ jsํ์ผ์ด๋ cssํ์ผ์ ์ ๊ทผํ๋๋ก
app.use("/public", express.static(__dirname + "/public"));
// home์ผ๋ก ๊ฐ๋ฉด req, res๋ฅผ ๋ฐ๊ณ res.render (์ฐ๋ฆฌ๊ฐ ๋ง๋ home์ render)ํ๋ route
app.get("/", (req, res) => res.render("home"));
// ---->
const handleListen = () => console.log(`Listening on http://localhost:3000`);
app.listen(3000, handleListen);
#1.0 Introduction
๋ง๋ค ํ๋ก๊ทธ๋จ
- ์ต๋ช ์ผ๋ก ์ฑํ ๋ด์ฉ์ ์ฃผ๊ณ ๋ฐ์ ์ ์์
- ๋๋ค์์ ์ถ๊ฐํด ๋๊ตฌ๋ ๋ํํ๋์ง ์์ ์์
- ์ฑํ ๋ฐฉ์ ์ปจ์ ์ ์ ํจ.
- ์ ์ฅ, ํด์ฅ ์ด๋ฒคํธ ์ถ๊ฐ
- ์ค์๊ฐ์ผ๋ก ๋ฐฉ์ ๋ช ๋ช ์ด ์ ์ ์ค์ธ์ง ํ์ธ
- ์๋ฒ์ ์ค์๊ฐ์ผ๋ก ๋ฐฉ์ด ๋ช ๊ฐ์ธ์ง ํ์ธ
#1.1 HTTP vs WebSockets
- http, webSocket ๋๋ค protocol
- http : user๊ฐ requestํ๋ฉด server๊ฐ responseํ๋ ๋ฐฉ์
- server๋ user์๊ฒ ๋ฉ์์ง๋ฅผ ๋ณด๋ผ ์ ์์.
- request - response ๊ณผ์ ๋ค์๋ server๊ฐ user๋ฅผ ์๊ฒ ๋จ => ์ด๋ฅผ stateless๋ผ๊ณ ํจ.
// user๊ฐ home์ GET request๋ฅผ ๋ณด๋ด๋ฉด template๋ก ๋ฐ์
app.get("/", (_, res) => res.render("home"));
// user๊ฐ ์ด๋ค ํ์ด์ง์ GET request๋ฅผ ๋ณด๋ด๋ redirect๋ก ๋ฐ์
app.get("/*", (_, res) => res.redirect("/"));
WebSocket : server์ ์์ ์ฐ๊ฒฐ๋๋ ๊ฒ, server์ browser๊ฐ ์๋ฐฉํฅ ์ฐ๊ฒฐ์ด๋ฉฐ, server์ browser๋ ์ธ์ ๋ ์๋ก์๊ฒ ๋ฉ์์ง๋ฅผ ๋ณด๋ผ ์ ์์. disconnectํ์ง ์๋ ์ด์ ๊ณ์ ์ฐ๊ฒฐ๋์ด์์
ex. wifi, ์ ํ
=> ์ค์๊ฐ chat, notifictaion ๊ฐ์ ๊ธฐ๋ฅ ๊ตฌํ์ด ๊ฐ๋ฅ
#1.2 WebSockets in NodeJS
https://ssocoit.tistory.com/189 ๋ถ์ด ์ค๋ช ์ ์ ์จ๋์ผ์ ์ ์ฃผ์์ ๊ธ์ด์๋ค,,,
import http from "http";
import WebSocket from "ws";
import express from "express";
// app์ด๋ผ๋ ๋ณ์์ ๊ฐ์ ธ์์ ์ฌ์ฉ
const app = express();
// ๋ทฐ ์์ง์ pug๋ก ํ๊ฒ ๋ค
app.set("view engine", "pug");
// ๋๋ ํ ๋ฆฌ ์ค์
app.set("views", __dirname + "/views");
// public ํด๋๋ฅผ ์ ์ ์๊ฒ ๊ณต๊ฐ (์ ์ ๊ฐ ๋ณผ ์ ์๋ ํด๋ ์ง์ )
app.use("/public", express.static(__dirname + "/public"));
// ํํ์ด์ง๋ก ์ด๋ํ ๋ ์ฌ์ฉ๋ ํ
ํ๋ฆฟ์ ๋ ๋
app.get("/", (req, res) => res.render("home"));
// ํํ์ด์ง ๋ด ์ด๋ ํ์ด์ง์ ์ ๊ทผํด๋ ํ์ผ๋ก ์ฐ๊ฒฐ๋๋๋ก ๋ฆฌ๋ค์ด๋ ํธ (๋ค๋ฅธ url ์ฌ์ฉ ์ํ ๊ฑฐ๋ผ)
app.get("/*", (req, res) => res.redirect("/"))
const handleListen = () => console.log(`Listening on http://localhost:3000`)
// app.listen(3000, handleListen); // 3000๋ฒ ํฌํธ์ ์ฐ๊ฒฐ
// app์ requestlistener ๊ฒฝ๋ก - express application์ผ๋ก๋ถํฐ ์๋ฒ ์์ฑ
const server = http.createServer(app);
// http ์๋ฒ ์์ webSocket์๋ฒ ์์ฑ, ์์ http๋ก ๋ง๋ server๋ ํ์ X - ์ด๋ ๊ฒ ํ๋ฉด http / ws ์๋ฒ ๋ชจ๋ ๊ฐ์ 3000๋ฒ ํฌํธ๋ฅผ ์ด์ฉํด์ ๋๋ฆด ์ ์๋ค!
const wss = new WebSocket.Server({ server });
// ์์๋ก ๋ง๋ ํจ์
function handleConnection(socket) { // ์ฌ๊ธฐ์ socket์ ์ฐ๊ฒฐ๋ ๋ธ๋ผ์ฐ์
console.log(socket) // ์ฌ๊ธฐ ์๋ ์์ผ์ด frontend์ real-time์ผ๋ก ์ํตํ ์ ์๋ค
};
// on method์์๋ event๊ฐ ๋ฐ๋๋๋ ๊ฒ์ ๊ธฐ๋ค๋ฆฐ๋ค
// event๊ฐ connection / ๋ค์ ์ค๋ ํจ์๋ event๊ฐ ์ผ์ด๋๋ฉด ์๋
// ๊ทธ๋ฆฌ๊ณ on method๋ backend์ ์ฐ๊ฒฐ๋ ์ฌ๋์ ์ ๋ณด๋ฅผ ์ ๊ณต - ๊ทธ๊ฒ socket์์ ์ด
// socket์ callback์ผ๋ก ๋ฐ๋๋ค. webSocket์ ์๋ฒ์ ๋ธ๋ผ์ฐ์ ์ฌ์ด์ ์ฐ๊ฒฐ
wss.on("connection", handleConnection)
// ์๋ฒ๋ ws, http ํ๋กํ ์ฝ ๋ชจ๋ ์ดํดํ ์ ์๊ฒ ๋๋ค
server.listen(3000, handleListen);
๋ด์ผ ์์นจ 6์๊น์ง๋ ํฐ์ผ๋ฌ๋ค... ์ค๋ ์ค์ ์ ์ข ํด๋๊ฑธ...
'javascript > ์ค ํด๋ก ์ฝ๋ฉ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
DAY 3 #2.0 ~ #2.3 (0) | 2023.02.24 |
---|---|
DAY 2 #1.3 ~ 1.9 (0) | 2023.02.22 |