wetube-reloaded
Wetube Clone built using NodeJS, Express, Mongo and ES6 ๐
dev script
nodemon์ ์คํ์ํค๊ณ ํ์ผ์ด ๋ณํ ๋๋ง๋ค ์๋ฒ๋ฅผ ์ฌ์์ํด์ฃผ๋ nodemon์ babel-node src/server.js๋ฅผ ์คํํ๋ ๊ฒ.
dependencies & devDependencies
dependencies -> ํ๋ก์ ํธ๊ฐ ๋์๊ฐ๊ธฐ ์ํด ํ์ํ package๋ค
- ์ ์ node_modules ํด๋๋ ๊ณต์ ํ ํ์๊ฐ ์๋ค.
- ๊ทธ๋์ ์ ์ ๊ฐ package.json์ด ์๋ ์ํ์์ npm i๋ง ํ๋ฉด express๊ฐ ์ค์น๋จ.
- npm์ด dependencies, devDependencies๋ฅผ ์ฐพ์์ ๋ชจ๋ ๊ฑธ ์๋์ผ๋ก ์ค์นํด์ค.
devDependencies -> ๊ฐ๋ฐ์๊ฐ ๊ฐ๋ฐํ ๋ ํ์ํ ๊ฒ๋ค.
- ex.nodemon (ํ์ผ์ ๋ณด๊ณ ์๋ค๊ฐ ๋ณํ๊ฐ ์๊ธฐ๋ฉด commend๋ฅผ ์ฌ์์ํด์ค.)
- ex.babel (server.js๋ฅผ babel-node๋ก ๋๋ฆฌ๊ฒ๋ ๋ณํํด์ฃผ๋ ์ญํ . babel-node๊ฐ ์๋ฒ๋ฅผ ์๋ํด์ babel์ด ์น์ํ JavaScript๋ฅผ ์ดํดํ๊ณ , ํ๋ฒํ node.js๋ฐฉ์์ผ๋ก ๋ณํํด์ node.js ์๋ฒ๋ฅผ ์๋์ํค๋ ์ญํ .)
- babel-node๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด, bable.config.jsonํ์ผ์ ๋ง๋ค์ด์ผ ํ๋ค. babel์ ์ถ๊ฐํ๊ณ ์ถ์ plugin(์ต์ javascript๋ฅผ ์ฌ์ฉํ๊ฒ ํด์ฃผ๋ ๊ธฐ๋ฅ)์ ๋ฃ์ ๊ฒ.
Server
-
์๋ฒ๋ฅผ ๋ง๋ค๊ณ requests๋ฅผ listenํด์ฃผ๊ธฐ๋ง ํ๋ฉด ๋๋ค!!!!! ex. port4000์ listeningํ๊ณ ์๋ ์ํ์์ ๋ณด๋ฉด cannot GET / (root page) --- ์๋ฒ์ ๋๋ ๋ฌธ(routes) ๋๋๋ฆฌ๋ ์ค~ ---
-
URL(route)๋ฅผ ํตํด์ requests๋ฅผ ์ ๋ฌํ๋ ๊ฒ.
๋ธ๋ผ์ฐ์ ๋ ์๋ฒ์๊ฒ ํ์ด์ง๋ฅผ requestํ๋ ๊ฒ!
const handleHome = () => console.log("home");
app.get("/", handleHome);
-> ์๋ฒ๊ฐ ์ด request๋ฅผ ๋ฐ์๋ค์ด๊ณ , ๋ธ๋ผ์ฐ์ ์๊ฒ "๊ทธ๋, ํํ์ด์ง๋ฅผ ๊ฐ์ ธ๊ฐ๋ ์ข์!"๋ผ๊ณ ํ๊ณ , ๋๊ตฐ๊ฐ ํํ์ด์ง์ ์ค๋ ค๊ณ ํ๋ฉด ์๋ฒ๋ handleHome ํจ์๋ฅผ ์คํ์ํจ๋ค.
Router
: mini application
๋๋ฉ์ธ ๋ณ๋ก ๋๋๋ ๊ฒ์ด ํ์~
๋ผ์ฐํฐ๋ ์์ ์ค์ธ ์ฃผ์ ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก URL์ ๊ทธ๋ฃนํํด์ค๋ค.
url์ด ์ด๋ป๊ฒ ์์ํ๋์ง์ ๋ธ ๋๋๋ ๋ฐฉ๋ฒ.
router๊ฐ ์์ผ๋ฉด url์ ๊ฐ๋ณ๋ก ๊ธธ๊ฒ ๊ธธ๊ฒ ๋์ฌ์ ์ฐ๋ ๋ฐฉ๋ฒ์ผ๋ก ์ฝ๋ฉ์ ํด์ผ ํ๋๋ฐ ๊ทธ๊ฒ์ ๋งค์ฐ ๋นํจ์จ์ ์ด๋ค.
global Router
- / -> Home
- /join -> Join
- /login -> Login
- /search -> Search
user Router
- /users/:id -> See User
- /users/logout -> Log Out
- /users/edit -> Edit My Profile
- /users/delete -> Delete(Remove) My Profile
video Router
- /videos/:id -> See Video
- /videos/:id/edit -> Edit Video
- /videos/:id/delete -> Delete(Remove) Video
- /videos/upload -> Upload Video
more info...
- importํ ๋ ๊ฒฝ๋ก์ค์ ์ "../" : ์ง๊ธ ์๋ ํด๋์์ ๋ฒ์ด๋๋ ๊ฑธ ์๋ฏธํจ. "./" : ์ง๊ธ์ ์ฅ์๋ฅผ ์๋ฏธํจ.
- export default ํ 1๊ฐ์ ๊ฒฝ์ฐ๋ 'export default ๊ฒฝ๋ก';
- export default ํ ์ฌ๋ฌ ๊ฐ์ ๊ฒฝ์ฐ๋ ์ฌ๋ฌ๊ฐ์ ํด๋นํ๋ ์ฝ๋ ์์ชฝ์ export๋ฅผ ๋ฃ๋๋ค.
- ๊ทธ๋ฆฌ๊ณ ๋ ๊ฐ์ ๋ค๋ฅธ ํ์ผ์ importํ ๋ object{}๋ฅผ ์ด๋ค.
Router Parameter
- ":id"
-> id = ๋ณ์, parameter(์ซ์ ๊ฐ์ url์ ๊ฐ์ง๋ ๊ฑธ ๊ฐ๋ฅํ๊ฒ ํด์ฃผ๋ ์ญํ )
-> : = ํ
์คํธ๊ฐ ์๋๋ผ ๋ณ์๋ก ๋ง๋ค์ด์ฃผ๋ ์ญํ .
express๋ request object์ ์ด parameter๋ฅผ ๋ณด๋ด์ค๋ค.
videoRouter.get("/upload", upload); videoRouter.get("/:id", see); videoRouter.get("/:id/edit", edit);
Pug
pug๋ผ๋ ์ ์ ๊ฐ ๋ณด์ฌ์ค html๋ก ๋ฆฌํดํด์ฃผ๋ ํ์ผ์ด๋ค.
-
์๋์ ๊ฐ์ด ์ค์ ํด์ค ๊ฒ!
app.set("view engine", "pug"); app.set("views", process.cwd() + "/src/views")
pug๋ผ๋ ํ ํ๋ฆฟ์ ์ด๋ javascript code๋ผ๋ ๋ฃ์ ์ ์๋ค. ex. footer.pug
๊ทธ javascript code๋ฅผ ์คํํด์ ๊ทธ๊ฑธ ์ ์ ์๊ฒ ์ ๊ณตํด์ฃผ๋ ์ญํ ์ '๋ ๋๋ง'์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค.
๋ ๋๋งํ ๋ ๋ณด๋ด๋ ์ธ์๋ 2๊ฐ์ง์ธ๋ฐ, render("view์ ์ด๋ฆ", {ํ ํ๋ฆฟ์ ๋ณด๋ผ ๋ณ์} )
- ๊น๋ํ html์ ์์ฑํ๋๋ก ํด์ฃผ๊ธฐ ๋๋ฌธ์ด๋ค.
- ์ฐ๋ฆฌ์ html์ javascript๋ฅผ ํฌํจ์์ผ์ฃผ๊ธฐ ๋๋ฌธ์ด๋ค.
pug์ ๋ณ์๋ฅผ ์ ์ ๋๋ #{} ์ด๋ผ๊ณ ์ด๋ค.
includes(ํ์ผํฌํจ)
- ๋ฐ๋ณตํ์ง ์์๋ ๋๊ณ partialsํด๋๋ฅผ ์ฌ์ฉํ์ฌ ํ ํ์ผ๋ก ๋ชจ๋ ํ ํ๋ฆฟ์ ์ ๋ฐ์ดํธ ํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค. ex. include partials/footer.pug
inheritance(์์) with extends and block
-
base.pug ๊ธฐ๋ณธ ๋ฒ ์ด์ค์ ๋ฐ๋ผ home, watch, edit์ extends(ํ์ฅ) ํ๊ฒ ๋ ๊ฒ์. ex. extends base.pug
-
base.pug์ content๋ฅผ ์ํ ๊ณต๊ฐ์ด ๋ง๋ จ๋์ด์ผ ํจ. ex. block content block: ์ฐฝ๋ฌธ ๋๋ ๋ฌธ ์ด๋ผ ์๊ฐํ์.
MVP styles (Minimal Viable Product.css)
https://andybrewer.github.io/mvp/ ์ฌ์ฉํด์ base.pug์ ๋ฃ๋๋ค.
- ๊ฝค ๊ด์ฐฎ์ ์คํ์ผ๋ค์ HTML ํ๊ทธ์ ์ ํ๋ ์ญํ ์ ํจ.
Conditionals & Iteration & Mixin
- Conditional : ์กฐ๊ฑด๋ฌธ ์ฌ์ฉํด๋ณด๊ธฐ
- Iteration: list์ ๋ชจ๋ element๋ค์ HTML์ ๋ณด์ฌ์ฃผ๋ ๊ฒ. -> array์ ๋ชจ๋ element์ ๋ํด ํน์ ํ๋์ ์ทจํ ๋ ์ฌ์ฉํจ.
- mixin: ๋ค๋ฅธ ๋ฐ์ดํฐ๋ฅผ ํฌํจํ์ง๋ง ๊ฐ์ ํํ์ HTML์ ๋ณด์ฌ์ฃผ๋ ๊ฒ.
- footer.pug๋ partial๋ฅผ ์ฌ์ฉํ ์ด์ ์ ๊ฐ์ง๋ง, ์ด ๋ถ๋ถ์ ๋ณด์ฌ์ฃผ๋ ์ฉ๋๋ก ์ฐ์ผ ๋ฟ์ด๋ค.
- video.pug๋ mixin์ ์ฌ์ฉํ์ฌ, ๋ณด์ฌ์ค ๋ฟ๋ง ์๋๋ผ ๋ฐ์ดํฐ๋ ๋ฐ์ ์ ์๋ ๊ธฐ๋ฅ๊น์ง ์ถ๊ฐํ ์ด์ ์ด๋ค. '+' ์ฌ์ฉ! -> ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ ์ ์๋ ์ผ์ข ์ ๋ฏธ๋ฆฌ ๋ง๋ค์ด์ง Html block์ด๋ผ ๋ณผ ์ ์๋ค. Html์ฝ๋๋ฅผ ์ฌ์ฌ์ฉํ๋ ๊ธฐ๋ฅ.
- partial์ mixin์ template์ include ํด์ค์ผํ๋ค.
GET & POST
- GET : ๊ฐ์ ธ์จ๋ค!
- POST : ์ํํ๋ค!
- redirect : ๋ค์๋ณด๋ด๋ค
- parameter : ๋งค๊ฐ๋ณ์
- express๋ form์ผ๋ก ๋ณด๋ธ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ง ๋ชปํ๋ค.
- input์ name์ค์ ์ ํด์ฃผ์ง ์์ผ๋ฉด ๋ฐ์ดํฐ๊ฐ ์ ์ก๋์ง ์๋๋ค!!!
MongoDB & Mongoose
-
wsl ํฐ๋ฏธ๋์ ์ฐ๋ค.
-
'sudo apt update'์ ์ ๋ ฅํ๊ณ ,
-
'sudo apt-get install mongodb'์ ์ ๋ ฅํ๊ณ ์ค์นํ๋ค.
-
'mongod --version'์ ์ ๋ ฅํ๊ณ ์ค์น๊ฐ ๋์ด์๋์ง ํ์ธํ๋ค.
-
๋ฐ๋์ ๋ชฝ๊ณ ๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ์๋น์ค ์์!
sudo service mongodb start
-
๋ชฝ๊ณ ์ฌ์ฉํ๊ธฐ
mongo
-
๋ด๊ฐ ๊ฐ์ง db ๋ณด๊ธฐ
show dbs
-
ํ์ฌ ์ฌ์ฉ ์ค์ธ db ํ์ธ
db
-
์ฌ์ฉํ db ์ ํํ๊ธฐ
use dbName (ํ์ฌ ์์ ์์๋
use wetube
) -
db ์ปฌ๋ ์ ๋ณด๊ธฐ
show collections
-
db ์ปฌ๋ ์ ์์ documents ๋ณด๊ธฐ
db.collectionName.find() (ํ์ฌ ์์ ์์๋
db.videos.find()
) -
db ์ปฌ๋ ์ ์์ documents ๋ชจ๋ ์ ๊ฑฐํ๊ธฐ
db.collectionName.remove({}) (ํ์ฌ ์์ ์์๋
db.videos.remove({})
) -
๋ค ์ฌ์ฉํ์ผ๋ฉด ์๋น์ค๋ฅผ ์ข ๋ฃ!
sudo service mongodb stop
-
์ง๊ธ ์๋น์ค๊ฐ ์คํ์ค์ธ์ง ์ ์ ์๋ค.
sudo service mongodb status
- ([OK] or not [Fail])
- CRUD -> Create / Read / Update / Delete
Callback์ vs Promise์
- Callback์์ผ๋ก ํ๋ฉด,
console.log("start") // ์ฒซ๋ฒ์งธ ์์,
Video.find({}, (error, videos) => {
if(error) {
return res.render("server-error")
}
return res.render("home", { pageTitle: "Home", videos });
}); // ์ธ๋ฒ์งธ ์์
console.log("finished") // ๋๋ฒ์งธ ์์,
- Promise์์ผ๋ก ํ๋ฉด,
export const home = async (req, res) => {
try {
const videos = await Video.find({}); // await์ฌ์ฉ ๋๋ฌธ์ ์ด ์ฝ๋๋ถํฐ ์ฐจ๋ก๋๋ก ์คํ๋จ.
return res.render("home", { pageTitle: "Home", videos });
} catch {
return res.render("server-error");
}
};
-> await์ฌ์ฉ์ ํด๋นํจ์๊ฐ async์ผ ๋๋ง ๊ฐ๋ฅํ๋ค.
return & render
- return์ ์ญํ : ๋ณธ์ง์ ์ธ return์ ์ญํ ๋ณด๋ค๋ function์ ๋ง๋ฌด๋ฆฌ์ง๋ ์ญํ ๋ก ์ฌ์ฉ๋๊ณ ์์.
- ์ด๋ฌํ ๊ฒฝ์ฐ return์ด ์์ด๋ ์ ์์ ์ผ๋ก ๋์ํ์ง๋ง ์ค์๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด return์ ์ฌ์ฉ.
- renderํ ๊ฒ์ ๋ค์ renderํ ์ ์๋ค.
- redirect(). sendStatus(). end() ๋ฑ๋ฑ ํฌํจ (express์์ ์ค๋ฅ ๋ฐ์ํ๊ธฐ ๋๋ฌธ)
More...
-
Model.findByIdAndUpdate()๋ก ๋ถ๋ฌ์ค๊ธฐ์ ์์ ์ ํ๋ฐฉ์~
-
Model.exists(id๋ฅผ ์ ์ฉํ๋ ์ฝ๋) --- ex.Video.exists({_id: id})
-
์์ฑ์ด๋ ์ ๋ฐ์ดํธ ์ ์๋ํด์ผ ํ function์ ํ์์ฑ => Mongoose์ Middleware๋ฅผ ํ์ฉํ๋ค.
-
Model.findOneAndDelete() >> Model.findOneAndRemove() delete๋ฅผ ์ฌ์ฉํ ๊ฒ!
-
์ ํํ์ ์ค์ธ ๊ฒ์ด : Model.findByIdAndDelete()
-
์ ๊ท์ ํํ regular expression
-
์ฐ์ต์ฌ์ดํธ : https://regex101.com/
-
MDN ๊ณต์ ๋ฌธ์ : https://developer.mozilla.org/ko/docs/Web/JavaScript/Guide/Regular_Expressions
-
์ ๊ทํํ์ ์ฃผ์์ฌ์ฉ : https://www.regexpal.com
-
๋ชฝ๊ณ db regex : https://docs.mongodb.com/manual/reference/operator/query/regex
-
RegExp Mdn : https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/RegExp
-
์์ ์ฝ๋
$regex: new RegExp(`keyword`, "i") -> keyword ๋จ์ดํฌํจ. $regex: new RegExp(`^${keyword}`, "i") -> keyword๋ก ์์ํ๋ ๊ฒ๋ง. $regex: new RegExp(`${keyword}$`, "i") -> keyword๋ก ๋๋๋ ๊ฒ๋ง.
-
-
req.params : video link๋ฅผ ํด๋ฆญํ๋ฉด url์ id๋ฅผ ๋ฐ์ ์ ์๋ค.
-
req.body : form์ ๋ณด๋ด๋ฉด ๊ทธ ๋ด์ฉ์ req.body๋ก ๋ฐ์ ์ ์๋ค.
-
req.query : search ํ๋ฉด์์ keyword๋ฅผ ๋ฐ์ ์ ์๋ค. ์ฆ, URL์ ์๋ ๋ชจ๋ ์ ๋ณด๋ค์ ํ์ธํ ์ ์๋ค.
์ํ์ฝ๋ Status Code
[์ํ์ฝ๋] https://ko.wikipedia.org/wiki/HTTP_%EC%83%81%ED%83%9C_%EC%BD%94%EB%93%9C
- 200(OK): ์๋ฒ๊ฐ ์์ฒญ์ ์ ๋๋ก ์ฒ๋ฆฌํ๋ค๋ ๋ป์ด๋ค. ์ด๋ ์ฃผ๋ก ์๋ฒ๊ฐ ์์ฒญํ ํ์ด์ง๋ฅผ ์ ๊ณตํ๋ค๋ ์๋ฏธ๋ก ์ฐ์ธ๋ค.
- 400(Bad Request): ์๋ฒ๊ฐ ์์ฒญ์ ๊ตฌ๋ฌธ์ ์ธ์ํ์ง ๋ชปํ ๋ ๋ฐ์ํ๋ค. ํด๋ผ์ด์ธํธ ์ธก์์ ๋ฌธ์ ๊ฐ ์์ ๋ ์ฃผ๋ก ๋ฐ์ํ๋ค.
- 404(Not Found): ์๋ฒ๊ฐ ์์ฒญํ ํ์ด์ง๋ฅผ ์ฐพ์ ์ ์์ ๋ ๋ฐ์ํ๋ค. ์๋ฒ์ ์กด์ฌํ์ง ์๋ ํ์ด์ง์ ๋ํ ์์ฒญ์ด ์์ ๊ฒฝ์ฐ ์๋ฒ๋ ์ด ์ฝ๋๋ฅผ ์ ๊ณตํ๋ค.
์ธ์ ๊ณผ ์ฟ ํค Sessions and Cookies
- Cookie ์ฟ ํค :
- ์ ๋ณด๋ฅผ ์ฃผ๊ณ ๋ฐ๋ ๋ฐฉ๋ฒ!
- ์ธ์ ID๋ฅผ ์ ๋ฌํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ ๋งค๊ฒ์ฒด!
- ์๋ฒ๊ฐ ๋ธ๋ผ์ฐ์ ์ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๋ ์ ๋ณด. ์ธ์ id๋ฅผ ๋ฃ์ ๊ณณ. Only ๋ธ๋ผ์ฐ์ !!!
- ์ฟ ํค๋ ์ธ์ฆ ๋ฟ๋ง ์๋๋ผ ์ฌ๋ฌ๊ฐ์ง ์ ๋ณด๋ฅผ ์ ์ฅํ ์ ์๋ค.
- ์ฟ ํค๋ ๋๋ฉ์ธ์ ๋ฐ๋ผ ์ ํ์ด ๋๊ณ , ์ ํจ๊ธฐ๊ฐ์ด ์๋ค.
- Session ID ์ธ์
ID:
- ์ฟ ํค์ ์ ์ฅ๋๋ค.
- ์๋ฒ(์ธ์ DB)์๋ ์ ์ฅ๋๋ค.
- ํ์ฌ ๋ก๊ทธ์ธํ ์ ์ ๋ค์ ๋ชจ๋ ์ธ์ ID๋ฅผ ์ธ์ DB์ ์ ์ฅํด์ผ ํ๋ค.
- ์ฆ, ์์ฒญ์ด ๋ค์ด์ฌ ๋๋ง๋ค, ์๋ฒ๋ ์ฟ ํค๋ฅผ ๋ฐ์์, ์ธ์ ID๋ฅผ ๋ณด๊ณ ์ธ์ ID์ ์ผ์นํ๋ ์ ์ ๋ฅผ ์ฐพ์์ผ ํ๊ณ , ์ฟ ํค์์ ์ธ์ ID์ ์ ์ ๊ฐ ์ผ์นํ๊ฒ ๋๋ค.
- ์ธ์ ์์ , ์ธ์ ID๋ง ์ฃผ๋ฉด ๋๋ค. ์ธ์ ์ ๋ํ ๋ชจ๋ ์ ๋ณด๋ ์ธ์ DB์ ์ ์ฅ๋์ด์๋ค.
- ํ์ด์ง๋ฅผ ์์ฒญํ๋ฉด, ์๋ฒ๋ ์ธ์ ID๋ฅผ DB์์ ์ฐพ์ผ๋ฉด ๋๋ค!!!
- Token ํ ํฐ :
- ์๋ฒ๊ฐ ๊ธฐ์ตํ๋ ์ด์ํ๊ฒ ์๊ธด String!
- ID ์นด๋ ์ฒ๋ผ ์๋ฒ์๊ฒ ๋ณด์ฌ์ค์ผ ํ๋ค.
- JWT :
- ์ ๋ณด๋ฅผ ๊ฐ๊ณ ์๋ ํ ํฐ ํ์. ex. QR ์ฒดํฌ์ธ.
- ์ํธํ ๋์ง ์์์ ๋๊ตฌ๋ ์ด์ด์ ํด๋น ์ปจํ ์ธ ๋ฅผ ๋ณผ ์ ์๋ค.
- DB ์์ด ๊ฒ์ฆํ ์ ์๋ค.
- ์๋ฒ๋ ์ ์ ์ ID๋ฅผ ๊ฐ์ ธ๋ค๊ฐ, 'sign ์๊ณ ๋ฆฌ์ฆ'์ ์ด์ฉํด์ 'sign'์ ํ๋ค.
- ํด๋น sign๋ ์ ๋ณด๋ฅผ stringํํ๋ก ๋ณด๋ธ๋ค. (์ธ์ ID๋ณด๋ค ๊ธธ๋ค.)
- ์๋ฒ์ ์์ฒญ์ ๋ณด๋ด๋ ค๋ฉด, ํด๋น 'sign info' or 'Token'์ ์๋ฒ์ ๋ณด๋ด์ผ ํ๋ค.
- ์๋ฒ๋ Token์ ๋ฐ์ผ๋ฉด, ํด๋น sign์ด ์ ํจํ์ง ์ฒดํฌํ๊ฒ ๋๋ฉด, User๋ก ์ธ์ฆํ๊ฒ ๋ ๊ฒ์ด๋ค.
- ์๋ฒ๋ ์ ์ ๋ฅผ ์ธ์ฆํ๋๋ฐ ํ์ํ ์ ๋ณด๋ฅผ Token์ ์ ์ฅํ๋ค. ํด๋น Token์ User์๊ฒ ์ค๋ค.
- ํ์ด์ง๋ฅผ ์์ฒญํ๋ฉด, ์๋ฒ๋ ํด๋น Token์ด ์ ํจํ์ง ๊ฒ์ฆํ๋ฉด ๋๋ค!!!
- ์ฟ ํค๋ฅผ ์ฌ์ฉํด์ ์ด๋ค ๋ธ๋ผ์ฐ์ ๋ฅผ ์ํ ์ธ์ ID์ธ์ง ์ ์ ์๋ค.
- ๋ธ๋ผ์ฐ์ ๋ง๋ค req.session์ด ๋ฌ๋ผ์ ๋ช๋ช ์ ๋ณด๋ฅผ req.session object์ ๋ง๋ถ์ธ ๊ฒ์ด๋ค.
req.session.loggedIn = true; req.session.user = user;
์ค์
์๋ฒ๊ฐ ๋ธ๋ผ์ฐ์ ํํ ์ธ์ id๋ฅผ ์ฃผ๊ณ , ๋ธ๋ผ์ฐ์ ๊ฐ ์์ฒญ์ ๋ณด๋ผ ๋๋ง๋ค ์ฟ ํค์์ ์ธ์ id๋ฅผ ๊ฐ์ ธ์ ๋ณด๋ด์ค๋ค. ์๋ฒ๊ฐ ๊ทธ ์ธ์ id๋ฅผ ์ฝ๊ณ ๊ทธ ์ ์ ๊ฐ ๋๊ตฐ์ง ์ ์ ์๋ ๊ฒ์ด๋ค.
- ๋ธ๋ผ์ฐ์ ์์ ์น์ฌ์ดํธ๋ฅผ ๋ฐฉ๋ฌธํ ๋๋ง๋ค express-session middleware์ด ์์ผ๋ฉด,
- express๊ฐ ์์์ ๊ทธ ๋ธ๋ผ์ฐ์ ๋ฅผ ์ํ ์ธ์ id๋ฅผ ๋ง๋ค๊ณ ๋ธ๋ผ์ฐ์ ํํ ๋ณด๋ด์ค๋ค.
- ๋ธ๋ผ์ฐ์ ๊ฐ ์ฟ ํค์ ๊ทธ ์ธ์ id๋ฅผ ์ ์ฅํ๊ณ express์์๋ ๊ทธ ์ธ์ ์ ์ธ์ DB์ ์ ์ฅ๋๋ค.
- ์ธ์ DB์ ์๋ id === ์ฟ ํค์ ์๋ id
- ๋ธ๋ผ์ฐ์ ํํ ๋ณด๋ด์ ์ฟ ํค์ ์ ์ฅํ ์ธ์ id๋ฅผ ๋ธ๋ผ์ฐ์ ๊ฐ localhost:4000์ ๋ชจ๋ URL์ ์์ฒญ์ ๋ณด๋ผ ๋๋ง๋ค ์ธ์ id๋ฅผ ์์ฒญ๊ณผ ํจ๊ป ๋ณด๋ธ๋ค.
- ์๋ฒ์์ ์ด๋ค ์ ์ ๊ฐ, ์ด๋ค ๋ธ๋ผ์ฐ์ ์์ ์์ฒญ์ ๋ณด๋๋์ง ์ ์ ์๋ ๊ฒ์ด๋ค.
- ์๋ฒ๊ฐ ์ธ์ ์ ์์ฑํ๋ ๊ธฐ์ ์ middleware๋ก express-session์ ์ถ๊ฐ์ค์นํ ๋ ์์ฑ๋จ.
- req.sessionStore() ์ฌ์ฉํ์ ๋ ํ๋ฒ์ undefined๊ฐ ๋์จ ์ด์ --> ์ธ์ ์ ์๋ฒ์์ ๋ง๋ค์ด์ค์ผ ํ๋๋ฐ ํด๋ผ์ด์ธํธ๊ฐ ์ฒซ ์์ฒญ ๋ ์ธ์ ์ ๊ฐ์ง๊ณ ์์๋ฆฌ๊ฐ ์๋ค.
- ์ฒซ ์์ฒญ ๊ทธ ์ดํ๋ถํฐ ์ฒซ๋ฒ์งธ ์์ฒญ ๋ ์ธ์ ์ ๋ง๋ค์ด์ ๋๊ฒผ์ผ๋ ํด๋ผ์ด์ธํธ๊ฐ ํด๋น ๊ฐ์ ์ฟ ํค์ ์ ์ฅํ๊ณ ๋งค ์์ฒญ๋๋ง๋ค ์๋ฒ์๊ฒ ์ ๋ฌํ๋ค.
- ์ธ์ ์ ์๋ฒ๊ฐ ๋ง๋ค์ด์ ์ ๊ณตํด์ฃผ๋ ์ญํ ์ด๋ผ ์๋ฒ๊ฐ ์ฌ๋ถํ ๋๋ฉด ์ด๊ธฐํ๋๋ค. --> ๊ทธ๋์ DB์ ์ ์ฅํด์ ๊ด๋ฆฌ๋ฅผ ํ๋ ๊ฒ์ด๋ค.
- ์ธ์ ์ ๊ฐ์ ์๋ฒ๊ฐ ๋ง๋ค์ด์ฃผ๋ ๊ณ ์ ๊ฐ์ด๋ค๋ณด๋ ํด๋น ๊ฐ์ ๊ธฐ์ค์ผ๋ก ํด๋ผ์ด์ธํธ์์ ์์ฒญํ ๊ฑด์ ๋ํด ์ ์ ๋ฅผ ํน์ ์ง์ ์ ์๋ค.
์ฆ, ๋ธ๋ผ์ฐ์ ์์ ์๋ฒ์ ๋ก๊ทธ์ธ ์์ฒญ์ ํด์ ๋ก๊ทธ์ธ์ด ๋๋ฉด ์๋ฒ๋ ์ธ์ id๋ฅผ ์๋ตํด์ฃผ๊ณ ๋ธ๋ผ์ฐ์ ๋ ์ฟ ํคStorage์ ๊ทธ ์ธ์ id๋ฅผ ๋ณด๊ดํ๊ณ ์๋ค๊ฐ ๊ทธ ์ดํ ๋ค์ ์๋ฒ์ ๋ฐฉ๋ฌธํ ์์๋ ๊ทธ ์ธ์ id๋ง ๋ณด์ฌ์ฃผ๋ฉด ์๋์ผ๋ก ๋ก๊ทธ์ธ๋๊ฒ ํด์ค์ ๊ณ์ ๋ก๊ทธ์ธํ ์๊ณ ๋ฅผ ๋์ด์ค๋ค๋ ๋ป.
๋ก๊ทธ์ธํ ์ฌ์ฉ์๋ฟ๋ง ์๋๋ผ, ๊ฐ์ง ์ฌ์ฉ์(๋ด)์๊ฒ๋ ์ฟ ํค๋ฅผ ์ค ์ ์๋ ์ค์ .
- resave: ture
- saveUninitialized: true
๋ก๊ทธ์ธํ ์ฌ์ฉ์์๊ฒ๋ง ์ฟ ํค๋ฅผ ์ค ์ ์๋ ์ค์ .
- resave: false
- saveUninitialized: false
์ฟ ํค์ ํ๋กํผํฐ & ํ๊ฒฝ๋ณ์ ์ค์
- secret : cookie์ signํ ๋ ์ฌ์ฉํ๋ string.
- signํ๋ ์ด์ : ์๋ฒ๊ฐ cookie๋ฅผ ์คฌ๋ค๋ ๊ฑธ ๋ณด์ฌ์ฃผ๊ธฐ ์ํจ. ์ธ์ฆํ์.
- Domain : cookie๋ฅผ ๋ง๋ ์๋ฒ๊ฐ ๋๊ตฌ์ธ๊ฐ?? ๋ธ๋ผ์ฐ์ ๋ domain์ ๋ฐ๋ผ ์๋ฒ๋ฅผ ์ ์กํ๋ค.
- Path : URL
- Expires : ๋ง๋ฃ๋ ์ง๋ฅผ ์ง์ ํ์ง ์์ผ๋ฉด 'session' cookie๋ก ์ค์ ๋จ.
- ์ฌ์ฉ์๊ฐ ํ๋ก๊ทธ๋จ์ ๋ซ์ผ๋ฉด session cookie๋ ์ฌ๋ผ์ง๊ฑฐ๋, ์ปดํฐ ์ฌ์์ํ๋ฉด session์ด ์ฌ๋ผ์ง๊ฒ ๋จ.
- Max-age : session์ด ์ธ์ ๋ง๋ฃ๋๋์ง ์๋ ค์ฃผ๋ ๊ฒ.
cookie: { maxAge: 20000, },
- .env ํ์ผ์๋ ์ฝ๋์ ๋ค์ด๊ฐ๋ฉด ์๋๋ ๊ฐ๋ค์ ์ถ๊ฐํ ๊ฒ. (๋จ, ๋ชจ๋ ๊ฑด ๋๋ฌธ์๋ก ์ ์ด์ผ ํ ๊ฒ!) ex. ๋ชจ๋ API key or ๋ชจ๋ ๋น๋ฐ๋ก ํด์ผํ๋ URL.
- env ํ์ผ ๋ง๋ค๊ธฐ
- env ํ์ผ์ .gitignore์ ์ถ๊ฐํ๊ธฐ
- ๋น๋ฐ๋ก ํด์ผํ๋ string์ process.env.(ํ๊ฒฝ๋ณ์)๋ก ๋ฐ๊พธ๊ธฐ
์์ ๋ก๊ทธ์ธ ๋ง๋๋ ๋ฒ (Github)
- https://github.com/settings/applications/new ์ฌ๊ธฐ๋ก ๊ฐ์ ์ค์ ์ ํด์ค๋ค.
- Github์ User๋ฅผ ๋ณด๋ธ๋ค. --> https://github.com/login/oauth/authorize?client_id=์ ๋ ฅ๊ฐ
- URL์ ์๋ ๊ฒ๋ค์ ๋ฐ๊ฟ์ผ๋ก์จ ๋ค์ํ ๋ฐฉ๋ฒ์ผ๋ก User๋ฅผ ์น์ธํ ์ ์๋ค. --> https://github.com/login/oauth/authorize?client_id=์ ๋ ฅ๊ฐ&allow_signup=false&scope
- scope : ์ ์ ์๊ฒ์ ์ผ๋ง๋ ๋ง์ด ์ ๋ณด๋ฅผ ์ฝ์ด๋ด๊ณ ์ด๋ค ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ฌ ๊ฒ์ ๋ํ ๊ฒ.
- User๊ฐ Github์์ "์"๋ผ๊ณ ํ๋ฉด Github๋ code๊ฐ์ ์ค ๊ฒ์.
- ๊ทธ code๊ฐ์ ๊ฐ์ง๊ณ access_token์ผ๋ก ๋ฐ๊พผ๋ค.
- ๊ทธ access_token์ผ๋ก Github API๋ฅผ ์ฌ์ฉํด User ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ฌ ๊ฒ์.
- ์ด GET URL์ ํตํด์ ์ธ์ฆ์ ์ํ access_token์ ๋ณด๋ด์ค์ผ ํ๋ค.
Webpack
- ์์ ๋ง๋ JS์ฝ๋๋ค์ Babel Node.js์์ ๋ณํ์์ผ์ฃผ๋ ๊ฒ๋ค์ด์ Backend Part์ด์ง๋ง,
- Webpack ์์๋ ์ด์ ๋ถํฐ ๋ธ๋ผ์ฐ์ ์์ ์์ฑํ ์ ์๊ฒ ๋ณํ์์ผ์ฃผ๋ ๊ฒ์ด์ Frontend Part์ด๋ค.
devDependencies ๋ก ์ค์น
npm i webpack webpack-cli -D
Webpack --- script ์ค์
"assets": "webpack --config webpack.config.js"
ํ์ ์ค์
- entry: ์์ค์ฝ๋์ด์, ์ฐ๋ฆฌ๊ฐ ์ฒ๋ฆฌํ๊ณ ์ ํ๋ ํ์ผ๋ค(์์ js)
- entry: ์ด ํ๋กํผํฐ์ ์ฐ๋ฆฌ๊ฐ ์ฒ๋ฆฌํ๊ณ ์ ํ๋ ํ์ผ์ ๊ฒฝ๋ก ์ ๋ ฅ
- output: ์์ ์ด ๋๋ ๊ฒฐ๊ณผ๋ฌผ
- filename: ์ด ํ๋กํผํฐ์ ์ฐ๋ฆฌ ๊ฒฐ๊ณผ๋ฌผ์ด ๋ ํ์ผ ์ด๋ฆ ์ ๋ ฅ
- path: ์ด ํ๋กํผํฐ์ ์ฐ๋ฆฌ ๊ฒฐ๊ณผ๋ฌผ ํ์ผ์ ์ด๋์ ์ ์ฅํ ์ง ์ง์ (์ด ๊ฒฝ๋ก๋ ์ ๋๊ฒฝ๋ก์ฌ์ผ ํด!)
- dirname: directory name ํ์ผ๊น์ง์ ๊ฒฝ๋ก ์ ์ฒด
- resolve: ๊ฒฝ๋ก์ถ๊ฐ
- mode: ๊ธฐ๋ณธ์ค์ ์ด production mode๋ก ์ค์ ๋๊ธฐ ๋๋ฌธ์ '๊ฐ๋ฐ๋ชจ๋ ์ค'์ผ๋ก ์ค์ ํ๊ธฐ ์ํด์, development ์ถ๊ฐํ ๊ฒ!
- watch: true ํ๊ฒ ๋๋ฉด, Client ํ์ผ ํ์ธ์ ์ํด, ๋์งธ๋ Backend ํ์ผ ํ์ธ์ ํ๊ธฐ ์ํด์, ์ด ๋ ๋ชจ๋ ๋์์ ์คํ๋์ด์ผ๋ง ํ๋ค.
- clean: true ํ๊ฒ ๋๋ฉด, output folder๋ฅผ build๋ฅผ ์์ํ๊ธฐ ์ ์ clean ํด์ฃผ๋ ๊ฒ!
์๋ ์ฝ๋๋ค ์ค์~ ์ค์ ํด์ผ ํ๋ ๊ตฌ์กฐ ํ์ ํ๊ธฐ!
const path = require("path");
module.exports = {
entry: "./src/client/js/main.js",
mode: "development",
watch: true,
output: {
filename: "main.js",
path: path.resolve(__dirname, "assets", "js"),
clean: true,
},
module: {
rules: [
{
test: /\.js$/,
use: { },
},
},
],
},
};
- client/js/main.js : (webpackํ๊ธฐ ์ ) ์ต์ ์ ์ธ๋ จ๋ ์ฝ๋๋ฅผ ์ง๋ ๊ณต๊ฐ.
- assets/js/main.js : (webpack ํ ํ) ๋ณํํด์ฃผ๋ ์ฝ๋๋ค.
- base.pug๋ assets ํด๋์์๋ถํฐ ํ์ผ๋ค์ ๋ถ๋ฌ์ฌ ๊ฒ์. ์ฃผ์๊ฒฝ๋ก๋ /static/ URL ์ด ๋ ๊ฒ์.
SCSS Loader
npm i sass-loader sass webpack --save-dev npm i --save-dev css-loader npm i --save-dev style-loader
{
test: /\.scss$/,
use: ["style-loader", "css-loader", "sass-loader"],
},
- Webpack์ด ์ ํ์ ธ์๋ ์ญ์์ผ๋ก ์คํ๋จ.
sass-loader > css-loader > style-loader ์์ผ๋ก
- sass-loader : scss๋ฅผ ์ผ๋ฐ์ ์ธ css๋ก ๋ฐ๊ฟ์ค.
- style-loader : css code๋ฅผ ๋ธ๋ผ์ฐ์ ์ ์ ์ฉํ๋ ์ญํ .
MiniCssExtractPlugin
style-loader๋ฅผ ์ด์ฉํ๋ ๋์ ์, ์ด Plugin์ ์ฌ์ฉํ์ฌ, css ํ์ผ์ ๋ถ๋ฆฌํ๊ณ ์ถ๊ธฐ ๋๋ฌธ์
npm i --save-dev mini-css-extract-plugin
Styles
- font-awesome ์ค์ : https://cdnjs.com/libraries/font-awesome
- Reset ์ค์ : https://meyerweb.com/eric/tools/css/reset/
Video Player making~~~
Time Formatting
ํ์ ํฌ๋งทํ ๋ ์ฐ๋ JS ์์์๋ก ์ฐ์ด๋ ํจ์.
new Date(5*1000)
Thu Jan 01 1970 09:00:05 GMT+0900 (ํ๊ตญ ํ์ค์)
new Date(5*1000).toISOString()
'1970-01-01T00:00:05.000Z'
new Date(5*1000).toISOString().substr(11,8)
'00:00:05'
Etc ์ด๋ฒคํธ ํจ์
- input event ๋ ํด๋ฆญํ๊ณ ์ด๋ํ์ ๋ ์ผ์ด๋๋ ์ด๋ฒคํธ ํจ์์ด๋ค.
Views API
Status() / Sendstatus()
-
Status() : render()ํ๊ธฐ ์ ์ ์ํ ์ฝ๋๋ฅผ ์ ํ ์ ์๋ ๊ฒ.
return res.status(400).render();
-
Sendstatus() : ์ํ ์ฝ๋๋ฅผ ๋ณด๋ด๊ณ ์ฐ๊ฒฐ์ ๋๋ด๋ ๊ฒ!
return res.sendStatus(404);
Video Recorder ๋น๋์ค ๋ นํ
objectURL(url์ ์ฌ์ฉํด์ ํ์ผ์ ๊ฐ๋ฆฌํค๋๋ก ๋ธ๋ผ์ฐ์ ๊ฐ ๋ง๋ ๋ง๋ฒ์ URL)
- createObjectUrl : ๋ธ๋ผ์ฐ์ ๊ฐ ํ์ผ์ ๋ณด์ฌ์ฃผ๋ ๋ฐฉ๋ฒ์ผ ๋ฟ. (๊ทธ ํ์ผ์ ๋ฏธ๋ฆฌ๋ณด๊ณ ์ถ์ ๋)
- createObjectUrl()์ ๋งค๋ฒ ํธ์ถํ ๋๋ง๋ค ์๋ก์ด ๊ฐ์ฒด URL์ ์์ฑํจ.
- ๋ธ๋ผ์ฐ์ ์ ๋ฉ๋ชจ๋ฆฌ ์์ ํ์ผ์ ์ ์ฅํด๋๊ณ ๋ธ๋ผ์ฐ์ ๊ฐ ๊ทธ ํ์ผ์ ์ ๊ทผํ ์ ์๋ URL์ ์ค ๊ฒ.
Webassembly Video Transcode ๋น๋์ค ๋ณํ
- FFmpeg.wasm : ๋น๋์ค๋ฅผ ๋ณํํ๊ธฐ ์ํด ์ฌ์ฉ์์ ์ปดํจํฐ๋ฅผ ์ฌ์ฉํจ.
์ฌ์ฉ์์๊ฒ ๋ฉ์์ง๋ฅผ ๋จ๊ธธ ์ ์๊ฒ ํ๋ Flash message
- ์๋ฒ์ express-flash๋ผ๋ middleware ์ค์น.
- ๋ฉ์์ง๋ฅผ ๋จ๊ธธ ์ ์๋๋ก ์ฌ์ฉ์๋ฅผ ๋ณดํต redirectํ๋ ๊ณณ(ํ
ํ๋ฆฟ์ renderingํ๋ ๊ณณ์ด๋ ์ด๋๋ )์ req.flash()๋ฅผ ์ฌ์ฉํจ.
req.flash("๋ฉ์ธ์งํ์ ", "๋ด์ฉ")
- flash middleware์ messages๋ผ๊ณ ํ๋ locals๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ํด์ค๋ค!!!
Comment Section
Api Route
-
fetch๋ก ๋ฐฑ์๋์ ์์ฒญ์ ๋ณด๋ผ ๋์
method: "POST", headers: {}, body: {}, URL๊ณผ ๋๋ถ์ด ์ด ์ธ ๊ฐ์ง๋ฅผ ๋ง๋ถ์ฌ์ผ ํ๋ค.
-
headers์๋ ์ด ์์ฒญ์ ์ธ๋ถ ์ฌํญ์ ๋ช ์ํ๋ฉฐ, body์๋ ์ค์ง์ ์ธ ์ปจํ ์ธ ๊ฐ ํฌํจ๋๋ค.
-
๋ฐ๋ก ๋ช ์ํ์ง ์์ ์์ ๋ชจ๋ body์ ์ปจํ ์ธ ๋ Text File๋ก์ ์ ์ก๋๊ณ ๋ฐ์ ์ธ์๋๋ค.
-
ํนํ body: { ... }, ์ด๋ฐ ์์ผ๋ก ์๋ฐ์คํฌ๋ฆฝํธ ์ค๋ธ์ ํธ๋ฅผ ๋๊ฒจ์ค ์ ์ธ๋ถ์์ ์ด ์ค๋ธ์ ํธ๋ [object Object]๋ผ๋ ์๋ฏธ ์๋ ๋ฌธ์์ด๋ก ๋ณํ๋๋ค.
-
์ค๋ธ์ ํธ์ ๊ทธ ์์ ์ธ๋ถ ๋ณ์ ๋ชฉ๋ก๋ค์ ๋๊ฒจ์ฃผ๊ณ ์ถ์ ์, JSON์ด๋ผ๋ ๊ท์ฝ์ ์๊ฑฐํ ์ค๋ธ์ ํธ ๋ด์ ๋ชจ๋ ๊ธฐ๋ก์ ํ ์คํธํํ์ฌ ๋๊ฒจ์ฃผ์ด์ผ ํ๋๋ฐ, ์ด๋ JSON.stringify({ ... }) ๋ผ๋ ํธ๋ฆฌํ ์์ฒด ํ์ค ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
-
๋ง๋ถ์ฌ headers ์์ "Content-Type": "application/json"์ด๋ผ๋ ๋ช ์๋ฅผ ํด ์ฃผ์ด ์ ์ก๋ ํ ์คํธ๊ฐ JSONํ์ผ์์ ๋ฐฑ์๋์ ์ธ์์์ผ ์ค๋ค.
-
๋ฐฑ์๋์ (์ด๋ฅผํ ๋ฉด express๋ฅผ ์ฌ์ฉ ์ค์ด๋ผ๋ฉด) app.use(express.json()); ๋ฏธ๋ค์จ์ด๋ฅผ ์ถ๊ฐํด์ฃผ์ด ์์ฒด ๋ด์์ JSON.parse("..."); JSONํ์ผ์ ๋ค์ ์๋ฐ์คํฌ๋ฆฝํธ ์ค๋ธ์ ํธ๋ก ๋ณํํด์ฃผ๋ ํ์ค ํจ์๋ก ์์ฒญ body ๋ด์ ์ปจํ ์ธ ๋ฅผ ๋์ฝ๋ฉํ๋ ์์ ์ ํ๋ค.