Express๋ฅผ ์ฌ์ฉํ ์ผ๋ฐ์ ์ธ NodeJS์ค์ ์ ๋๋ค.
WebRTC์ Websockets๋ฅผ ํ์ฉํ Zoom ํด๋ก ์ฝ๋ฉ
Pug๋ก view engine์ ์ค์ ํฉ๋๋ค.
Express์ template์ด ์ด๋์๋์ง ์ง์ ํด์ค๋๋ค.
public url์ ์์ฑํด์ ์ ์ ์๊ฒ ํ์ผ์ ๊ณต์ ํฉ๋๋ค.
home.pug๋ฅผ ๋ ๋ํด์ฃผ๋ route handler๋ฅผ ๋ง๋ญ๋๋ค.(server.js)
v16.18.0 (v14.17.3 ์ด์ ํ์)
- package.json
- Babel
- Nodemon
npm init -y
์
๋ ฅํด์, package.json์ ์์ฑํฉ๋๋ค.- Nodemon์ด๋, ํ๋ก์ ํธ๋ฅผ ์ดํด๋ณด๊ณ ๋ณ๊ฒฝ์ฌํญ์ด ์์์,
์๋ฒ๋ฅผ ์ฌ์์ํด์ฃผ๋ ํ๋ก๊ทธ๋จ์
๋๋ค.
- ์๋ฒ๋ฅผ ์ฌ์์ํ๋ ๋์ , babel-node๋ฅผ ์คํํ๊ฒ ์ค์ ํฉ๋๋ค.
- Babel์ด๋, ์์ฑํ ์ฝ๋๋ฅผ ์ผ๋ฐ NodeJS๋ก ์ปดํ์ผํฉ๋๋ค.
- ๊ทธ ์์
์ src/server.js์์ ์ฒ๋ฆฌํด์ค๋๋ค.
- server.jsํ์ผ์์๋ express๋ฅผ importํด์
express ์ดํ๋ฆฌ์ผ์ด์
์ ๊ตฌ์ถํฉ๋๋ค.
- view engine์ Pug๋ก ์ค์ , views ๋๋ ํ ๋ฆฌ๊ฐ ์ค์ ๋ฉ๋๋ค.
- ๋ํ, publicํ์ผ๋ค์ ๋ํด์๋ ๋๊ฐ์ ์์
์ ํด์ฃผ๊ณ ์์ต๋๋ค.
- publicํด๋ ๋ด ํ์ผ๋ค์ Front์์ ๊ตฌ๋๋๋ ์ฝ๋์
๋๋ค.
- app.js๊ฐ ํ๋ก ํธ, server.js๊ฐ ๋ฐฑ์๋์
๋๋ค.
- ์ ์ ๋ /public์ผ๋ก ์ด๋ํ ์, publicํด๋ ๋ด์ฉ์ ๋ณผ ์ ์์ต๋๋ค.
- viewsํด๋์ ์๋ home.pug๋ฅผ ๋ ๋ํ๋ฉด ๋์
๋๋ค.
- babel-node๋ฅผ ์คํ์ํค๋ฉด, babel-node๋ ๋ฐ๋ก
- babel.config.json์ ์ฐพ์ต๋๋ค.
- ๊ทธ๊ณณ์์ ์ฝ๋์ ์ ์ฉ์ํฌ preset๋ฅผ ์คํ์ํต๋๋ค.
npm i nodemon -D
๋ก node_modules๋ฅผ ์์ฑํฉ๋๋ค.touch babel.config.js
๋ก ํ์ผ์ ์์ฑํฉ๋๋ค.nodemon.json
ํ์ผ์ ์์ฑํฉ๋๋ค.server.js
๋ฅผ ๋ง๋ค์ด์ค๋๋ค.git init.
์ ํตํด, git๊ณผ ์ฐ๊ฒฐํฉ๋๋ค.npm i @babel/core @babel/cli @babel/node -D
๋ก ๋ฐ๋ฒจ์ ์ค์นํฉ๋๋ค.touch .gitignore
gitignore๋ฅผ ์์ฑํฉ๋๋ค./node_modules
๋ฅผ ์
๋ ฅํด์ git์ด ๋ชจ๋์ ๋ฌด์ํ์ฌ git ์
๋ก๋์์ ์ ์ธํ๋๋ก ํฉ๋๋ค.nodemon.json
์๋ exec
๋ช
๋ น์ด๋ฅผ ํ๋ ๋ฃ์ต๋๋ค. exec๋ server.js
๋ฅผ ์คํ์ํค๋๋ก ํฉ๋๋ค.exec
๋ช
๋ น์ด๋ฅผ ์ด์ฉํด์ ์ด ๋ช
๋ น๋ง ์คํํ๋๋ก ํฉ๋๋ค.{
"exec": "babel-node src/server.js"
}
babel.config.json
์์๋ preset
์ ์ค์ ํฉ๋๋ค.npm i @babel/preset-env -D
์ผ๋ก ์ค์นํฉ๋๋ค.package.json
์๋ scripts
๋ฅผ ๋ฃ์ด์ค๋๋ค."scripts":{
"dev": "nodemon"
}
nodemon์ด ํธ์ถ๋๋ฉด nodemon์ด nodemon.json์ ์ดํด๋ณด๊ณ , ๊ฑฐ๊ธฐ์๋ ์ฝ๋๋ฅผ ์คํํฉ๋๋ค.
14. express
๋ฅผ ์ค์นํฉ๋๋ค. npm i express
์คํ
15. pug
๋ฅผ ์ค์นํฉ๋๋ค. npm i pug
์คํ
16. server.js์ express๋ฅผ importํฉ๋๋ค.
17. server.js์์ app์ ๋ง๋ญ๋๋ค.
{
"name": "zoom",
"version": "1.0.0",
"description": "Zoom Clone using WebRTC and Websockets",
"keywords": [],
"author": "",
"license": "MIT",
"scripts": {
"dev": "nodemon"
},
"devDependencies": {
"@babel/cli": "^7.20.7",
"@babel/core": "^7.20.12",
"@babel/node": "^7.20.7",
"@babel/preset-env": "^7.20.2",
"nodemon": "^2.0.20"
},
"dependencies": {
"express": "^4.18.2",
"pug": "^3.0.2"
}
}
- app์ console.log("hello")๋ฅผ ์คํํ๊ณ , ํฌํธ 3000์ listenํฉ๋๋ค.
- ์ฝ์์ฐฝ์์ npm run dev๋ฅผ ์คํ์์ผ ํ์ธํฉ๋๋ค.
import express from "express";
const app = express();
console.log("hello, server");
app.listen(3000);
... ์์
์ ์ํ ํ๋ก์ ํธ ์ค์ ์ด ๋๋ฌ์ต๋๋ค.
npm run dev
๋ฅผ ์
๋ ฅํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํฉ๋๋ค.
localhost:3000
์ผ๋ก ๊ฐ๋ฉด ํ์ด์ง์์๋ ์๋ฌด๊ฒ๋ ๋ณผ ์ ์์ง๋ง, ํ์ด์ง๋ฅผ ์ฐพ์ ์ ์๋ค๋ ํ๋ฉด์ ๋จ์ง ์์์ผํฉ๋๋ค.
Cannot GET /
...์๋ฒ๋ ๊ตฌ๋๋๊ณ ์๋ค๋ ์๋ฏธ์ ๋๋ค.
- static files ๋๋ ์ฌ์ฉ์์๊ฒ ๋ณด๋ด๊ฒ๋ ํ์ผ๋ค์ ๊ตฌํํฉ๋๋ค.
- webpack์ ์ฌ์ฉํ์ง ์์ต๋๋ค.
- JS๋ฅผ ์ ์ ์๊ฒ ๋ณด๋ด๊ณ ๊ทธ๊ฒ์ ๋ธ๋ผ์ฐ์ ์์ ์ดํดํ ์ ์๋๋ก ํฉ๋๋ค.
- src > public > js > app.js๋ฅผ ๋ง๋ญ๋๋ค.
- pugํ๋ฉด๋จ ํ์ด์ง๋ฅผ ๋ ๋ํ๊ธฐ์ํด pug์ค์ ์ ํฉ๋๋ค.
- Express์ ํ ์ผ์ views๋ฅผ ์ค์ ํ๊ณ renderํด์ฃผ๋ ๊ฒ ์
๋๋ค.
- ๋๋จธ์ง๋ websocket์์ ์ค์๊ฐ์ผ๋ก ์ผ์ด๋ฉ๋๋ค.
mport express from "express";
const app = express();
app.set("view engine", "pug");
app.set("views", __dirname + "/views");
app.get("/", (req, res) => res.render("home"));
const handleListen = () => console.log(`Listening on http://localhost:3000`);
app.listen(3000, handleListen);
... npm run dev ํด๋ณด๋ฉด home.pug ํ๋ฉด์ ๋ ๋๋งํฉ๋๋ค.
- srcํด๋ ์์ viewsํด๋, ๊ทธ๋ฆฌ๊ณ ๊ทธ ์์ Home.pugํ์ผ์ ์์ฑํฉ๋๋ค.
import express from "express";
const app = express();
app.set("view engine", "pug");
app.set("views", __dirname + "/views");
app.use("/public", express.static(__dirname + "/public"));
app.get("/", (req, res) => res.render("home"));
const handleListen = () => console.log(`Listening on http://localhost:3000`);
app.listen(3000, handleListen);
http://localhost:3000/public/js/app.js
์ผ๋ก ๊ฐ๋ณด๋ฉด ์๋ฌด๊ฒ๋ ์๋ ํ๋ฉด์ด ๋น๋๋ค.
ํ์ง๋ง, public/js/app.js ์์ ๋ด์ฉ์ ์์ฑํ๋ฉด ๋ฐ์์ด ๋ฉ๋๋ค.
- views๋ ์๋ฒ๋ฅผ ์์ ํ ๋๋ง nodemon์ด ์ฌ์์๋๋๋ก ์ค์ ํฉ๋๋ค.
- FE ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์์ ํ ๋๋ nodemon์ด ์๋ก๊ณ ์นจํ์ง ์๋๋ก ์ค์ ํฉ๋๋ค.
{
"ignore": [
"src/public/*"
],
"exec": "npx babel-node src/server.js"
}
์๋ฒ๋ฅผ ์ข
๋ฃ์ํค๊ณ , ๋ค์ ์คํ์์ผ app.js์์ hello๋ฅผ ์ ์ฅํด๋ด
๋๋ค.
๐ ๋์ด์ nodemon์ด ์ฌ์คํ๋์ง์์ต๋๋ค.
server.js > ์ ์ ๊ฐ ์ด๋ค url๋ก ์ด๋ํ๋ ์ง, home์ผ๋ก ๋ณด๋
๋๋ค.
๋ค๋ฅธ url์ฌ์ฉํ์ง ์๊ณ , home๋ง ์ฌ์ฉํฉ๋๋ค.
app.get("/*", (req, res) => res.redirect("/"));
- ์ถ๊ฐ์ ์ธ css์์ฑ ์์ด ์คํ์ผ๋ง์ ํ ์ ์์ต๋๋ค.
- ์ ๊ณต๋๋ cdn์ header์ ์ฐ๊ฒฐ๋ง ํฉ๋๋ค.