์ƒ์„ธ ์ปจํ…์ธ 

๋ณธ๋ฌธ ์ œ๋ชฉ

[Node.js] 9์žฅ ์ต์Šคํ”„๋ ˆ์Šค๋กœ SNS ์„œ๋น„์Šค ๋งŒ๋“ค๊ธฐ

22-23/22-23 Node.js

by YUZ ์œ ์ฆˆ 2022. 11. 17. 10:01

๋ณธ๋ฌธ

728x90


๐Ÿ” package.json

ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค๊ธฐ ์ „ ํ•ญ์ƒ package.json์„ ์ œ์ผ ๋จผ์ € ์ƒ์„ฑํ•ด์•ผ ํ•œ๋‹ค.

npm init ํ˜น์€ ์ง์ ‘ ๋งŒ๋“ค์–ด๋„ ๋œ๋‹ค.

// package.json
{
  "name": "nodebird",
  "version": "0.0.1",
  "description": "์ต์Šคํ”„๋ ˆ์Šค๋กœ ๋งŒ๋“œ๋Š” SNS ์„œ๋น„์Šค",
  "main": "app.js",
  "scripts": {
    "start": "nodemon app"
  },
  "author": "seol",
  "license": "MIT"
}

 

 

๐Ÿ” ๊ด€๊ณ„

๐Ÿ“Œ 1:N

ํ˜„์žฌ ์ด ์žฅ์—์„œ ์‹ค์Šตํ•˜๋Š” ๊ฒƒ ์ค‘ User ๋ชจ๋ธ๊ณผ Post ๋ชจ๋ธ์€ 1:N ๊ด€๊ณ„๋ฉฐ hasMany๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋‹ค.

// models/user.js

...
static associate(db) {
	db.User.hasMany(db.Post);
    db.User.belongsToMany(db.User, {
    	foreignKey: 'followingId',
        as: 'Followers',
        through: 'Follow',
    });
    db.User.belongsToMany(db.User, {
    	foreignKey: 'followerId',
        as: 'Follwings',
        through: 'Follow',
    });
}
...

 

๐Ÿ“Œ N:M

- ๊ฐ™์€ ๋ชจ๋ธ๋ผ๋ฆฌ๋„ N:M ๊ด€๊ณ„๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํŒ”๋กœ์ž‰ ๊ธฐ๋Šฅ์ด ๋Œ€ํ‘œ์ ์ธ N:M ๊ด€๊ณ„๋‹ค.

- ์‚ฌ์šฉ์ž ํ•œ ๋ช…์ด ํŒ”๋กœ์›Œ๋ฅผ ์—ฌ๋Ÿฌ ๋ช… ๊ฐ€์งˆ ์ˆ˜ ์žˆ๊ณ , ํ•œ ์‚ฌ๋žŒ์ด ์—ฌ๋Ÿฌ ๋ช…์„ ํŒ”๋กœ์ž‰ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

- ๊ฐ™์€ ํ…Œ์ด๋ธ” ๊ฐ„ N:M ๊ด€๊ณ„์—์„œ๋Š” ๋ชจ๋ธ ์ด๋ฆ„๊ณผ ์ปฌ๋Ÿผ ์ด๋ฆ„์„ ๋”ฐ๋กœ ์ •ํ•ด์•ผ ํ•œ๋‹ค.

- ๊ฐ™์€ ํ…Œ์ด๋ธ” ๊ฐ„์˜ N:M ๊ด€๊ณ„์—์„œ๋Š” ๊ฐ™์€ ๋ชจ๋ธ์ด๋ผ ๊ตฌ๋ถ„๋˜์ง€ ์•Š์•„ as ์˜ต์…˜๋„ ๋„ฃ์–ด์•ผ ํ•œ๋‹ค.

  => ์ฃผ์˜! as๋Š” foreignKey์™€ ๋ฐ˜๋Œ€๋˜๋Š” ๋ชจ๋ธ์„ ๊ฐ€๋ฆฌํ‚จ๋‹ค.

 

 

๐Ÿ” passport.initialize ๋ฏธ๋“ค์›จ์–ด

- passport.initialize ๋ฏธ๋“ค์›จ์–ด๋Š” ์š”์ฒญ(req ๊ฐ์ฒด)์— passport ์„ค์ •์„ ์‹ฌ๊ณ , passport.session ๋ฏธ๋“ค์›จ์–ด๋Š” req.session ๊ฐ์ฒด์— passport ์ •๋ณด๋ฅผ ์ €์žฅํ•œ๋‹ค.

- req.session ๊ฐ์ฒด๋Š” express-session์—์„œ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด๋ฏ€๋กœ passport ๋ฏธ๋“ค์›จ์–ด๋Š” express-session ๋ฏธ๋“ค์›จ์–ด๋ณด๋‹ค ๋’ค์— ์—ฐ๊ฒฐํ•ด์•ผ ํ•จ.

// passport ๊ด€๋ จ ์ฝ”๋“œ
const passport = require('passport');
const local = require('./localStrategy');
const kakao = require('./kakaoStrategy');
const User = require('../models/user');

module.exports = () => {
  passport.serializeUser((user, done) => {
    done(null, user.id);
  });

  passport.deserializeUser((id, done) => {
    User.findOne({ where: { id } })
      .then(user => done(null, user))
      .catch(err => done(err));
  });

  local();
  kakao();
};

์ฝ”๋“œ์˜ passport.serializeUser์™€ passport.deserializeUser ๋ถ€๋ถ„์ด passport๋ฅผ ์ดํ•ดํ•˜๋Š” ํ•ต์‹ฌ์ด๋‹ค.

serializeUser๋Š” ์‚ฌ์šฉ์ž ์ •๋ณด ๊ฐ์ฒด๋ฅผ ์„ธ์…˜์— ์•„์ด๋””๋กœ ์ €์žฅํ•˜๋Š” ๊ฒƒ์ด๊ณ , deserializeUser๋Š” ๋งค ์š”์ฒญ ์‹œ ์‹คํ–‰๋˜๋ฉฐ ์„ธ์…˜์— ์ €์žฅํ•œ ์•„์ด๋””๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ์ž ์ •๋ณด ๊ฐ์ฒด๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๊ฒƒ์ด๋‹ค. ์ด ๊ณผ์ •์€ ์„ธ์…˜์— ๋ถˆํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด์•„๋‘์ง€ ์•Š๊ธฐ ์œ„ํ•œ ๊ณผ์ •์ด๋‹ค.

 

 

๐Ÿ” multer ๋ชจ๋“ˆ

POST: /post/img ๋ผ์šฐํ„ฐ์—์„œ๋Š” ์ด๋ฏธ์ง€ ํ•˜๋‚˜๋ฅผ ์—…๋กœ๋“œ๋ฐ›์€ ๋’ค ์ด๋ฏธ์ง€์˜ ์ €์žฅ ๊ฒฝ๋กœ๋ฅผ ํด๋ผ์ด์–ธํŠธ๋กœ ์‘๋‹ตํ•œ๋‹ค. static ๋ฏธ๋“ค์›จ์–ด๊ฐ€ /img ๊ฒฝ๋กœ์˜ ์ •์  ํŒŒ์ผ์„ ์ œ๊ณตํ•˜๋ฏ€๋กœ ํด๋ผ์ด์–ธํŠธ์—์„œ ์—…๋กœ๋“œํ•œ ์ด๋ฏธ์ง€์— ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋‹ค.

 

POST: /post ๋ผ์šฐํ„ฐ๋Š” ๊ฒŒ์‹œ๊ธ€ ์—…๋กœ๋“œ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ผ์šฐํ„ฐ๋‹ค.

 

 

๐Ÿ” ํ•ต์‹ฌ ์ •๋ฆฌ

๐Ÿ“Œ ์„œ๋ฒ„ ์š”์ฒญ์—๋Š” ๋ฐ˜๋“œ์‹œ ์‘๋‹ต!

์„œ๋ฒ„๋Š” ์š”์ฒญ์— ์‘๋‹ตํ•˜๋Š” ๊ฒƒ์ด ํ•ต์‹ฌ ์ž„๋ฌด์ด๋ฏ€๋กœ ์š”์ฒญ์„ ์ˆ˜๋ฝํ•˜๋“  ๊ฑฐ์ ˆํ•˜๋“  ์ƒ๊ด€์—†์ด ๋ฐ˜๋“œ์‹œ ์‘๋‹ตํ•ด์•ผ ํ•œ๋‹ค. ์ด๋•Œ ํ•œ ๋ฒˆ๋งŒ ์‘๋‹ตํ•ด์•ผ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค.

๐Ÿ“Œ nodemon

๊ฐœ๋ฐœ ์‹œ ์„œ๋ฒ„๋ฅผ ๋งค๋ฒˆ ์ˆ˜๋™์œผ๋กœ ์žฌ์‹œ์ž‘ํ•˜์ง€ ์•Š์œผ๋ ค๋ฉด nodemon์„ ์‚ฌ์šฉํ•˜์ž.

๐Ÿ“Œ ๋น„๋ฐ€ ํ‚ค ๊ด€๋ฆฌ

dotenv ํŒจํ‚ค์ง€์™€ .env ํŒŒ์ผ๋กœ ์œ ์ถœ๋˜๋ฉด ์•ˆ ๋˜๋Š” ๋น„๋ฐ€ ํ‚ค๋ฅผ ๊ด€๋ฆฌํ•˜์ž.

๐Ÿ“Œ ํŒŒ์ผ์€ ํด๋”๋ฅผ ๊ตฌ๋ถ„ํ•˜์—ฌ ์ €์žฅ

๋ผ์šฐํ„ฐ๋Š” routes ํด๋”์—, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” models ํด๋”์—, html ํŒŒ์ผ์€ views ํด๋”์— ๊ตฌ๋ถ„ํ•˜์—ฌ ์ €์žฅํ•˜๋ฉด ๊ทœ๋ชจ๊ฐ€ ํฐ ํ”„๋กœ์ ํŠธ์—์„œ๋„ ๊ด€๋ฆฌํ•˜๊ธฐ ์‰ฝ๋‹ค.

๐Ÿ“Œ ๋ฐ์ดํ„ฐ ๊ฐ„ ๊ด€๊ณ„

๋ฐ์ดํ„ฐ ๊ฐ„ ๊ด€๊ณ„์—๋Š” 1:1, 1:N, N:M ๊ด€๊ณ„๊ฐ€ ์žˆ๋‹ค.

๐Ÿ“Œ ๋ผ์šฐํ„ฐ ๋‚ด์— ๋ฏธ๋“ค์›จ์–ด ์‚ฌ์šฉ ๊ฐ€๋Šฅ


Node.js 

Editor : seol

728x90

๊ด€๋ จ๊ธ€ ๋”๋ณด๊ธฐ