๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Dev.log/Node.js

(39)
[Node.js ๊ต๊ณผ์„œ] #39. ์›น API ์„œ๋ฒ„ ๋งŒ๋“ค๊ธฐ - JWT ํ† ํฐ์œผ๋กœ ์ธ์ฆํ•˜๊ธฐ JWT ํ† ํฐ์œผ๋กœ ์ธ์ฆํ•˜๊ธฐ ๋‹ค์‹œ API ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•˜๋Š” ์ž…์žฅ์ด ๋˜์–ด๋ณด์ž. NodeBird ์•ฑ์ด ์•„๋‹Œ ๋‹ค๋ฅธ ํด๋ผ์ด์–ธํŠธ๊ฐ€ NodeBird์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ๊ฐˆ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์•ผ ํ•˜๋Š” ๋งŒํผ ๋ณ„๋„์˜ ์ธ์ฆ ๊ณผ์ •์ด ํ•„์š”ํ•˜๋‹ค. ์ด ์ฑ…์€ JWT ํ† ํฐ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ธ์ฆํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•œ๋‹ค. JWT๋Š” JSON Web Token์˜ ์•ฝ์–ด๋กœ, JSON ํ˜•์‹์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ํ† ํฐ์ด๋‹ค. JWT๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ธ ๋ถ€๋ถ„์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค. JWT ํ† ํฐ ๊ตฌ์„ฑ์š”์†Œ ํ—ค๋”(HEADER) : ํ† ํฐ ์ข…๋ฅ˜์™€ ํ•ด์‹œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ •๋ณด๊ฐ€ ๋“ค์–ด์žˆ๋‹ค. ํŽ˜์ด๋กœ๋“œ(PAYLOAD) : ํ† ํฐ์˜ ๋‚ด์šฉ๋ฌผ์ด ์ธ์ฝ”๋”ฉ๋œ ๋ถ€๋ถ„์ด๋‹ค. ์‹œ๊ทธ๋‹ˆ์ฒ˜(SIGNATURE) : ์ผ๋ จ์˜ ๋ฌธ์ž์—ด๋กœ, ์‹œ๊ทธ๋‹ˆ์ฒ˜๋ฅผ ํ†ตํ•ด ํ† ํฐ์ด ๋ณ€์กฐ๋˜์—ˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ์‹œ๊ทธ๋‹ˆ์ฒ˜๋Š” JWT ๋น„๋ฐ€ํ‚ค๋กœ ๋งŒ๋“ค์–ด์ง„๋‹ค. ..
[Node.js ๊ต๊ณผ์„œ] #38. ์›น API ์„œ๋ฒ„ ๋งŒ๋“ค๊ธฐ - ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ ๊ฐ–์ถ”๊ธฐ API ์„œ๋ฒ„ ์ดํ•ดํ•˜๊ธฐ API (Application Programming Interface)๋ž€ ๋‹ค๋ฅธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ํ˜„์žฌ ํ”„๋กœ๊ทธ๋žจ์˜ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ—ˆ์šฉํ•˜๋Š” ์ ‘์ ์„ ์˜๋ฏธํ•œ๋‹ค. ์›น API๋Š” ๋‹ค๋ฅธ ์›น ์„œ๋น„์Šค์˜ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์ž์›์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋Š” ์ฐฝ๊ตฌ์ด๋‹ค. ํ”ํžˆ API๋ฅผ ์—ด์—ˆ๋‹ค ๋˜๋Š” ๋งŒ๋“ค์—ˆ๋‹ค๊ณ  ํ‘œํ˜„ํ•˜๋Š”๋ฐ, ์ด๋Š” ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋žจ์—์„œ ํ˜„์žฌ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ—ˆ์šฉํ•˜์˜€์Œ์„ ๋œปํ•œ๋‹ค. ๋‹ค๋ฅธ ์‚ฌ๋žŒ์—๊ฒŒ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๊ณ  ์‹ถ์€ ๋ถ€๋ถ„๋งŒ API๋ฅผ ์—ด์–ด ๋†“๊ณ , ์ œ๊ณตํ•˜๊ณ  ์‹ถ์ง€ ์•Š์€ ๋ถ€๋ถ„์€ API๋ฅผ ๋งŒ๋“ค์ง€ ์•Š๋Š” ๊ฒƒ์ด๋‹ค. ๋˜ํ•œ, API๋ฅผ ์—ด์–ด ๋†“์•˜๋‹ค ํ•˜๋”๋ผ๋„ ๋ชจ๋“  ์‚ฌ๋žŒ์ด ์ •๋ณด๋ฅผ ๊ฐ€์ ธ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ธ์ฆ๋œ ์‚ฌ๋žŒ๋งŒ ์ผ์ • ํšŸ์ˆ˜ ๋‚ด์—์„œ ๊ฐ€์ ธ๊ฐ€๊ฒŒ ์ œํ•œ์„ ๋‘˜ ์ˆ˜๋„ ์žˆ๋‹ค. ์œ„์™€ ๊ฐ™์€ ์„œ๋ฒ„์— API๋ฅผ ์˜ฌ๋ ค์„œ URL์„ ํ†ตํ•ด ์ ‘๊ทผ..
[Node.js ๊ต๊ณผ์„œ] #37. ์ต์Šคํ”„๋ ˆ์Šค๋กœ SNS ์„œ๋น„์Šค ๋งŒ๋“ค๊ธฐ - ํ”„๋กœ์ ํŠธ ๋งˆ๋ฌด๋ฆฌํ•˜๊ธฐ ํ”„๋กœ์ ํŠธ ๋งˆ๋ฌด๋ฆฌํ•˜๊ธฐ ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ๊นŒ์ง€ ๋งˆ๋ฌด๋ฆฌ๋˜์—ˆ์œผ๋‹ˆ ์ด์ œ ํ•ด์‹œํƒœ๊ทธ ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ๊ณผ ํŒ”๋กœ์ž‰๋งŒ ์ถ”๊ฐ€ํ•˜๋ฉด ๋œ๋‹ค. ๋งˆ์ง€๋ง‰์œผ๋กœ routes/post.js์™€ routes/user.js๋ฅผ app.js์— ์—ฐ๊ฒฐํ•œ๋‹ค. ์—…๋กœ๋“œํ•œ ์ด๋ฏธ์ง€๋ฅผ ์ œ๊ณตํ•  ๋ผ์šฐํ„ฐ(/img)๋„ express.static ๋ฏธ๋“ค์›จ์–ด๋กœ uploads ํด๋”์™€ ์—ฐ๊ฒฐํ•œ๋‹ค. ๊ฒฐ๊ณผ
[Node.js ๊ต๊ณผ์„œ] #36. ์ต์Šคํ”„๋ ˆ์Šค๋กœ SNS ์„œ๋น„์Šค ๋งŒ๋“ค๊ธฐ - Multer ๋ชจ๋“ˆ๋กœ ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ ๊ตฌํ˜„ํ•˜๊ธฐ Multer ๋ชจ๋“ˆ๋กœ ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ ๊ตฌํ˜„ํ•˜๊ธฐ SNS ์„œ๋น„์Šค์ธ ๋งŒํผ ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ๋„ ์ค‘์š”ํ•˜๋‹ค. ์ด๋ฏธ์ง€๋Š” ๋ณดํ†ต input[type=file] ํƒœ๊ทธ์™€ form ํƒœ๊ทธ๋ฅผ ํ†ตํ•ด์„œ ์—…๋กœ๋“œํ•œ๋‹ค. ์ด ๋•Œ form์˜ ์ธ์ฝ”๋”ฉ ํƒ€์ž…์€ multipart/form-data์ธ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค. ์ด๋Ÿฐ ํ˜•์‹์œผ๋กœ ์˜ฌ๋ผ์˜จ ๋ฐ์ดํ„ฐ๋Š” ์ง์ ‘ ์ฒ˜๋ฆฌํ•˜๊ธฐ ํž˜๋“œ๋ฏ€๋กœ multipart ์ฒ˜๋ฆฌ์šฉ ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. ๋Œ€ํ‘œ์ ์ธ ๊ฒƒ์ด Multer์ด๋‹ค. ํ˜„์žฌ NodeBird๋„ ๊ฒŒ์‹œ๊ธ€ ์ž‘์„ฑ ํผ์˜ enctype์ด multipart/form-data๋กœ ๋˜์–ด ์žˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์˜ฌ๋ผ์˜ค๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋ ค๋ฉด Multer๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ๋ชจ๋“ˆ์„ ๋จผ์ € ์„ค์น˜ํ•œ๋‹ค. npm i multer ์ด๋ฏธ์ง€๋ฅผ ์–ด๋–ป๊ฒŒ ์ €์žฅํ•  ๊ฒƒ์ธ์ง€๋Š” ์„œ๋น„์Šค์˜ ํŠน์„ฑ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง„๋‹ค. NodeBird๋Š” input..
[Node.js ๊ต๊ณผ์„œ] #35. ์ต์Šคํ”„๋ ˆ์Šค๋กœ SNS ์„œ๋น„์Šค ๋งŒ๋“ค๊ธฐ - Passport ๋ชจ๋“ˆ๋กœ ๋กœ๊ทธ์ธ ๊ตฌํ˜„ํ•˜๊ธฐ Passport ๋ชจ๋“ˆ๋กœ ๋กœ๊ทธ์ธ ๊ตฌํ˜„ํ•˜๊ธฐ SNS ์„œ๋น„์Šค์ด๋ฏ€๋กœ ๋กœ๊ทธ์ธ์ด ํ•„์š”ํ•˜๋‹ค. ํšŒ์›๊ฐ€์ž…๊ณผ ๋กœ๊ทธ์ธ์€ ์ง์ ‘ ๊ตฌํ˜„ํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ, ์„ธ์…˜๊ณผ ์ฟ ํ‚ค ์ฒ˜๋ฆฌ ๋“ฑ ๋ณต์žกํ•œ ์ž‘์—…์ด ๋งŽ์œผ๋ฏ€๋กœ ๊ฒ€์ฆ๋œ ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. ๋ฐ”๋กœ Passport๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์ด๋ฆ„์ฒ˜๋Ÿผ ์šฐ๋ฆฌ์˜ ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ์—ฌ๊ถŒ ์—ญํ• ์„ ํ•œ๋‹ค. ์š”์ฆ˜์—๋Š” ์„œ๋น„์Šค์— ๋กœ๊ทธ์ธ์„ ํ•  ๋•Œ ์•„์ด๋””์™€ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•ด์„œ ํ•˜์ง€ ์•Š๊ณ  ๊ตฌ๊ธ€, ํŽ˜์ด์Šค๋ถ, ์นด์นด์˜คํ†ก ๊ฐ™์€ ๊ธฐ์กด์˜ SNS ์„œ๋น„์Šค ๊ณ„์ •์œผ๋กœ ๋กœ๊ทธ์ธํ•˜๊ธฐ๋„ ํ•œ๋‹ค. ์ด ๋˜ํ•œ Passport๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค. 1. Passport ๊ด€๋ จ ํŒจํ‚ค์ง€ ์„ธํŒ…ํ•˜๊ธฐ 1-1. Passport ๊ด€๋ จ ํŒจํ‚ค์ง€๋“ค์„ ์„ค์น˜ํ•œ๋‹ค. npm i passport passport-local passport-kakao bcrypt ..
[Node.js ๊ต๊ณผ์„œ] #34. ์ต์Šคํ”„๋ ˆ์Šค๋กœ SNS ์„œ๋น„์Šค ๋งŒ๋“ค๊ธฐ - ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ธํŒ…ํ•˜๊ธฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ธํŒ…ํ•˜๊ธฐ MySQL๊ณผ ์‹œํ€„๋ผ์ด์ฆˆ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์„ค์ •ํ•œ๋‹ค. 1. model ์ƒ์„ฑํ•˜๊ธฐ 2. ์ƒ์„ฑํ•œ ๋ชจ๋ธ๋“ค์„ ์‹œํ€„๋ผ์ด์ฆˆ์— ๋“ฑ๋กํ•˜๊ธฐ as: ์‹œํ€„๋ผ์ด์ฆˆ๊ฐ€ JOIN ์ž‘์—… ์‹œ ์‚ฌ์šฉํ•˜๋Š” ์ด๋ฆ„์ด๋‹ค. as์— ๋“ฑ๋กํ•œ ์ด๋ฆ„์„ ๋ฐ”ํƒ•์œผ๋กœ ์‹œํ€„๋ผ์ด์ฆˆ๋Š” getFollowers, getFollowings, addFollower, addFollowing ๋“ฑ์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์ž๋™์œผ๋กœ ์ถ”๊ฐ€ํ•œ๋‹ค. NodeBird์˜ ๋ชจ๋ธ์€ User, Post, Hashtag, PostHashtag, Follow ์ด๋ ‡๊ฒŒ ์ด 5๊ฐœ ์ด๋‹ค. 3. ์ƒ์„ฑํ•œ ๋ชจ๋ธ์„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฐ ์„œ๋ฒ„์™€ ์—ฐ๊ฒฐํ•˜๊ธฐ ์‹œํ€„๋ผ์ด์ฆˆ๋Š” config.json์„ ์ฝ์–ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ƒ์„ฑํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ์ด ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ config.json์„ ๋จผ์ € ์ˆ˜์ •ํ•œ๋‹ค. ์ฝ˜์†”์—์„œ sequelize db:crea..
[Node.js ๊ต๊ณผ์„œ] #33. ์ต์Šคํ”„๋ ˆ์Šค๋กœ SNS ์„œ๋น„์Šค ๋งŒ๋“ค๊ธฐ - ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ ๊ฐ–์ถ”๊ธฐ ์ต์Šคํ”„๋ ˆ์Šค๋กœ SNS ์„œ๋น„์Šค ๋งŒ๋“ค๊ธฐ ๋กœ๊ทธ์ธ, ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ, ๊ฒŒ์‹œ๊ธ€ ์ž‘์„ฑ, ํ•ด์‹œํƒœ๊ทธ ๊ฒ€์ƒ‰, ํŒ”๋กœ์ž‰ ๋“ฑ์˜ ๊ธฐ๋Šฅ์ด ์žˆ๋Š” SNS ์„œ๋น„์Šค์ธ NodeBird ์•ฑ์„ ๋งŒ๋“ค์–ด๋ณด์ž. 1. nodebird ํด๋” ์ƒ์„ฑ express-generator์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์ง์ ‘ ํ”„๋กœ์ ํŠธ ์ƒ์„ฑํ•˜๊ธฐ. 2. package.json ์ƒ์„ฑ ํ•ญ์ƒ package.json์„ ์ œ์ผ ๋จผ์ € ์ƒ์„ฑํ•ด์•ผ ํ•œ๋‹ค. package.json์„ ์ƒ์„ฑํ•ด์ฃผ๋Š” npm init ๋ช…๋ น์–ด๋ฅผ ์ฝ˜์†”์—์„œ ํ˜ธ์ถœํ•ด๋„ ๋˜๊ณ  ์ง์ ‘ ๋งŒ๋“ค์–ด๋„ ๋œ๋‹ค. version์ด๋‚˜ description, author, license๋Š” ์›ํ•˜๋Š” ๋Œ€๋กœ ์ž์œ ๋กญ๊ฒŒ ์ˆ˜์ •ํ•ด๋„ ๋œ๋‹ค. scripts ๋ถ€๋ถ„์— start ์†์„ฑ์€ ์žŠ์ง€ ๋ง๊ณ  ๋„ฃ์–ด์ค˜์•ผ ํ•œ๋‹ค. 3. ์‹œํ€„๋ผ์ด์ฆˆ ์„ค์น˜ npm i -g sequelize-cli npm ..
[Node.js ๊ต๊ณผ์„œ] #32. MongoDB - ๋ชฝ๊ตฌ์Šค ์‚ฌ์šฉํ•˜๊ธฐ ๋ชฝ๊ตฌ์Šค ์‚ฌ์šฉํ•˜๊ธฐ MySQL์— ์‹œํ€„๋ผ์ด์ฆˆ๊ฐ€ ์žˆ๋‹ค๋ฉด ๋ชฝ๊ณ ๋””๋น„์—๋Š” ๋ชฝ๊ตฌ์Šค(Mongoose)๊ฐ€ ์žˆ๋‹ค. ๋ชฝ๊ตฌ์Šค๋Š” ์‹œํ€„๋ผ์ด์ฆˆ์™€ ๋‹ฌ๋ฆฌ ODM(Object Document Mapping)์ด๋ผ๊ณ  ๋ถˆ๋ฆฐ๋‹ค. ๋ชฝ๊ณ ๋””๋น„๋Š” ๋ฆด๋ ˆ์ด์…˜์ด ์•„๋‹ˆ๋ผ ๋‹คํ๋จผํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ORM์ด ์•„๋‹ˆ๋ผ ODM์ด๋‹ค. ๋ชฝ๊ตฌ์Šค๋ฅผ ์“ฐ๋Š” ์ด์œ  ๋ชฝ๊ณ ๋””๋น„๋Š” ํ…Œ์ด๋ธ”์ด ์—†์–ด์„œ ์ž์œ ๋กญ๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ์„ ์ˆ˜ ์žˆ์ง€๋งŒ, ๋•Œ๋กœ๋Š” ์ž์œ ๋กœ์›€์ด ๋ถˆํŽธํ•จ์„ ์ดˆ๋ž˜ํ•œ๋‹ค. ์‹ค์ˆ˜๋กœ ์ž˜๋ชป๋œ ์ž๋ฃŒํ˜•์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ์„ ์ˆ˜๋„ ์žˆ๊ณ , ๋‹ค๋ฅธ ๋‹คํ๋จผํŠธ์—๋Š” ์—†๋Š” ํ•„๋“œ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ์„ ์ˆ˜๋„ ์žˆ๋‹ค. ๋ชฝ๊ตฌ์Šค๋Š” ๋ชฝ๊ณ ๋””๋น„์— ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ๊ธฐ ์ „ ๋…ธ๋“œ ์„œ๋ฒ„ ๋‹จ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ํ•œ ๋ฒˆ ํ•„ํ„ฐ๋งํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค. populate() ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด JOIN ๊ธฐ๋Šฅ์„ ์–ด๋А ์ •๋„ ๋ณด์™„ํ•ด์ค€๋‹ค. ES2015 ํ”„๋กœ๋ฏธ์Šค ๋ฌธ๋ฒ•๊ณผ ๊ฐ•๋ ฅํ•˜๊ณ  ๊ฐ€๋…์„ฑ์ด ๋†’..