๐Ÿ›ฉ์”จํ€„๋ผ์ด์ฆˆ ์ชผ์ธํ…Œ์ด๋ธ” ์ฟผ๋ฆฌ๋‚ ๋ฆฌ๊ธฐ๐Ÿ›ฉ

9rganizedChaosยท2021๋…„ 3์›” 3์ผ
0
post-thumbnail

์ง€๋‚œ ํฌ์ŠคํŒ…์— ์“ด ๊ฒƒ๊ณผ ๊ฐ™์ด!
Association์„ ์ด์šฉํ•œ Join Table ๊ตฌํ˜„์„ ์™„๋ฃŒํ•˜์˜€๋‹ค!
Join Table์„ ๊ตฌํ˜„ํ•˜๊ณ  ์จ๋จน์ง€ ์•Š๋Š” ๊ฑด ์ข€ ์•„์‰ฝ๊ธฐ๋„ ํ•˜๊ณ ...
๋‹ค์–‘ํ•œ Sequelize ๋ฉ”์†Œ๋“œ(?)๋“ค์„ ๋” ์‚ฌ์šฉํ•ด๋ณด๊ณ  ์‹ถ์–ด์„œ!!!

๋ณธ๊ฒฉ์  ์‹ค์Šต์— ๋‚˜์„ฐ๋‹ค!

Postman์„ ํ†ตํ•ด ์„œ๋ฒ„ ํ™•์ธ!

์‚ฌ์‹ค ์ฒ˜์Œ์—๋Š” ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ํ†ต๊ณผํ•˜๋Š”๋ฐ์—๋งŒ ๊ธ‰๊ธ‰ํ•ด์„œ
์ง€๊ธˆ ์ž‘์„ฑํ•˜๊ณ  ์žˆ๋Š” ์ด ์ฝ”๋“œ๊ฐ€ ๋ญ˜ ์œ„ํ•œ ๊ฑด์ง€๋„ ์ œ๋Œ€๋กœ ์ƒ๊ฐ์„ ํ•ด๋ณด์ง€ ์•Š์•˜๋‹ค.
ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์—†์–ด์„œ ๋ˆˆ์œผ๋กœ ํ™•์ธํ•˜์ง€ ๋ชป ํ•˜๋‹ˆ ๋”๋”์šฑ ๋ง‰์—ฐํ•˜๊ฒŒ ์ƒ๊ฐํ–ˆ๊ณ ...

์ƒ๊ฐ์„ ํ•ด๋ณด๋‹ˆ, ์ด๋ฒˆ ์Šคํ”„๋ฆฐํŠธ๋ฅผ ํ†ตํ•ด ๋‹ค๋ฃจ๊ณ  ์žˆ๋Š” ๊ฑด ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค์™€ ์†Œํ†ตํ•˜๋Š” ์„œ๋ฒ„์˜€๋‹ค!
๊ทธ๋ž˜์„œ ์ฝ”๋“œ๋ฅผ ๋’ค์ ธ ํฌํŠธ ๋ฒˆํ˜ธ๋ฅผ ์ฐพ์•˜๋‹ค!
(์‚ฌ์‹ค ๊ทธ๋ƒฅ ์œ ์–ดํด๋ž˜์Šค์—๋„ ์ ํ˜€ ์žˆ์—ˆ์Œ...)

๊ทธ๋ž˜์„œ ๋ณธ๊ฒฉ์ ์œผ๋กœ ํฌ์ŠคํŠธ๋งจ์„ ํ†ตํ•ด์„œ ๋ฐ์ดํ„ฐ๋“ค์„ ๊ฒ€ํ† ํ•ด๋ณด์•˜๋‹ค.

์ด๋ ‡๊ฒŒ๋‚˜ ์ž˜ ์กฐํšŒ๊ฐ€ ๋œ๋‹ค!

์กฐ์ธํ…Œ์ด๋ธ” ์ด์šฉํ•˜๊ธฐ!

์‹ค์ œ Sequelize์˜ ์กฐ์ธํ…Œ์ด๋ธ”์„ ์ด์šฉํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋“ค์„ ์‚ฌ์šฉํ•ด๋ณด๊ณ  ์‹ถ์—ˆ๋‹ค...
๊ทธ๋ฆฌํ•˜์—ฌ ์Šค์Šค๋กœ ๋ฏธ์…˜์„ ๋งŒ๋“ค์–ด๋ณด์•˜๋‹ค!

MISSION: url์„ ์ž…๋ ฅํ•˜๋ฉด ํ•ด๋‹น url์˜ user์˜ ์ด๋ฆ„์„ ๋ฐ˜ํ™˜ํ•ด์ฃผ์ž!

๐Ÿ™‹๐Ÿปโ€โ™‚๏ธ๋ผ์šฐํŒ…!

์ด๋ ‡๊ฒŒ ๋ผ์šฐํŒ…์„ ์ถ”๊ฐ€ํ•ด์ฃผ์—ˆ๋‹ค!

๐Ÿ™‹๐Ÿปโ€โ™‚๏ธํ•จ์ˆ˜์ž‘์„ฑ!

๊ณต์‹๋ฌธ์„œ๋ฅผ ์กฐ๊ธˆ ๋’ค์ ธ๋ณด์•˜๋”๋‹ˆ! findAll๊ณผ where, ๊ทธ๋ฆฌ๊ณ  include๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜๋‹ค!

  getUserName: async (req, res) => {
    let result = await models.url.findAll({
      where: { id: req.params.id },
      include: [
        {
          model: models.user,
          // ์–ด๋–ค ํ…Œ์ด๋ธ”๊ณผ ์กฐ์ธํ•  ๊ฒƒ์ธ์ง€!
          // ํŠนํžˆ ํ—ท๊ฐˆ๋ ธ๋˜ ๋ถ€๋ถ„... user, users, "user", "users" ๋ชจ๋‘ ์•„๋‹˜...
          // ์ž‘์„ฑํ•˜๊ณ  ์žˆ๋Š” ์ฝ”๋“œ ๊ธฐ์ค€์œผ๋กœ ์ ์–ด์ค˜์•ผ ํ•จ...
          required: true,
          // ํŠธ๋ฃจ -> ์ด๋„ˆ์ชผ์ธ
          // ํด์Šค -> ๋ ˆํ”„ํŠธ ์•„์šฐํ„ฐ ์ชผ์ธ!
          attributes: ["name"],
          // ์ด ๋ถ€๋ถ„์ด MySQL๋กœ ๋”ฐ์ง€๋ฉด SELECT์— ํ•ด๋‹นํ•˜๋Š” ๋ถ€๋ถ„!
          // ์ด๋ถ€๋ถ„์ด ์•„์ง ์กฐ๊ธˆ ํ—ท๊ฐˆ๋ฆฌ๋Š”๋ฐ...
        },
      ],
    });
    console.log(result);
    res.status(200).send(result[0].user.name);
  },

์ด์™€ ๊ฐ™์ด ์ž‘์„ฑํ•ด์ฃผ์—ˆ๋‹ค!!!!
์‚ฌ์‹ค MySQL์—์„œ ์กฐ์ธํ…Œ์ด๋ธ” ์“ฐ๋Š” ๊ฒƒ๋„ ๋ณต์žกํ•œ๋ฐ, ์ €๊ฑธ ์–ด๋””์„œ ๋ญ˜ ์จ์ค˜์•ผ ํ•˜๋‚˜ ์ข€ ํ—ท๊ฐˆ๋ ธ๋‹ค.
๊ทธ๋ž˜์„œ ์šฐ์„  SQL query๋ฌธ์„ ์ž‘์„ฑํ•˜์˜€๋‹ค!!

SELECT user.name, url.id
FROM user
JOIN url
ON user.id = url.userId
WHERE url.id = params.id;

๐Ÿ™‹๐Ÿปโ€โ™‚๏ธ ๊ฒฐ๊ณผํ™•์ธ!

์šฐ์„  ๊ฒฐ๊ณผ๋ฅผ ์‚ดํŽด๋ณด๊ธฐ ์œ„ํ•ด ์œ ์ €ํ…Œ์ด๋ธ”๊ณผ
์œ ์•Œ์—˜ํ…Œ์ด๋ธ”์— ์ •๋ณด๋ฅผ ์กฐ๊ธˆ ๋” ์ž…๋ ฅํ•ด์ฃผ์—ˆ๋‹ค!

๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•˜๊ธฐ์— ์•ž์„œ,
์‚ฌ์‹ค ๋‹ค ์ž‘์„ฑํ•˜๊ณ ๋„ ์กฐ๊ธˆ ํ—ท๊ฐˆ๋ ธ๋˜? ์‚ฌ์‹ค ์•„์ง๊นŒ์ง€๋„ ํ•ด๊ฒฐ๋ชปํ•œ ๋ถ€๋ถ„์ด ๋ฐ”๋กœ attributes์— ๋Œ€ํ•œ ๋ถ€๋ถ„์ด๋‹ค.
๋‚ด๊ฐ€ ์˜ˆ์ƒํ•˜๊ธฐ์—๋Š” ๋ฐ‘์—์„œ result๋งŒ send๋กœ ๋ณด๋‚ด์ฃผ์–ด๋„ attributes: ["name"] ์ด์™€ ๊ฐ™์ด ์ž‘์„ฑํ–ˆ์œผ๋‹ˆ ์ด๋ฆ„๋งŒ ์ถœ๋ ฅ๋ ๊ฑฐ๋ผ ์ƒ๊ฐํ–ˆ์œผ๋‚˜, ๋‚ด ์˜ˆ์ƒ์ด ํ‹€๋ ธ๋‹ค.

์ด์™€ ๊ฐ™์ด name๋ถ€๋ถ„์ด url์— ๋‹ฌ๋ผ๋ถ™์–ด์„œ ์ถœ๋ ฅ๋œ๋‹ค!!

์ด๊ฒŒ ์ฐพ์•„๋ณด๋‹ˆ attributes๋Š” child ๋ชจ๋ธ์˜ ์ปฌ๋Ÿผ์„ ์…€๋ ‰ํ•˜๋Š” ๊ฑฐ๋ผ๊ณ  ํ•œ๋‹ค...
๊ทธ๋ž˜์„œ attributes: ["name", "email"],๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•˜์˜€๋”๋‹ˆ...

์ด์™€ ๊ฐ™์ด ๊ฒฐ๊ณผ๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค!

์•„์‰ฌ์šด๋Œ€๋กœ ์„ผ๋“œํ•ด์ฃผ๋Š” ๊ฐ’์„ res.status(200).send(result[0].user.name); ์ด์™€ ๊ฐ™์ด ์กฐ๊ธˆ ์†๋ด์ฃผ๋ฉด์„œ ์Šค์Šค๋กœ ๋งŒ๋“  ๋ฏธ์…˜์„ ํด๋ฆฌ์–ดํ–ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ์• ์ดˆ์— result์— ์ด๋ฆ„๋งŒ ๋‹ด๊ธฐ๊ฒŒ ํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ๊นŒ๋ฅผ ๊ณ ๋ฏผํ–ˆ์ง€๋งŒ ์ด ๋ถ€๋ถ„์€ ์•„์ง ํ•ด๊ฒฐํ•˜์ง€ ๋ชปํ–ˆ๋‹ค... ๋‹ค์Œ์— ๋งˆ์ € ๊ณ ๋ฏผํ•ด๋ณด๋Š” ๊ฒƒ์œผ๋กœ ํ•˜๋ฉฐ ํฌ์ŠคํŒ…์„ ๋งˆ์นœ๋‹ค...

profile
๋ถ€์ •ํ™•ํ•œ ์ •๋ณด๋‚˜ ์ž˜๋ชป๋œ ์ •๋ณด๋Š” ๋Œ“๊ธ€๋กœ ์•Œ๋ ค์ฃผ์‹œ๋ฉด ๋น ๋ฅด๊ฒŒ ์ˆ˜์ •ํ† ๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค, ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

0๊ฐœ์˜ ๋Œ“๊ธ€