TIL2021 0730-0731

์ด๊ฑด์šฐยท2021๋…„ 7์›” 31์ผ
0

TIL 2021 - 07 - 30 ~ 07 - 31 ๐Ÿ“– !

์ด๋ฒˆ ํ•œ์ฃผ๊ฐ„์€ Cmarket ๊ณผ shortly ์Šคํ”„๋ฆฐํŠธ๋ฅผ ํ†ตํ•ด์„œ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค์™€ sequelize์— ๋Œ€ํ•œ ๋ฌธ๋ฒ•๊ณผ ๊ธฐ์ดˆ๋ฅผ ์ตํ˜€ ๋ณด์•˜์Šต๋‹ˆ๋‹ค

MySQL
SQL ์ฃผ์š” ๋ฌธ๋ฒ•์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค. ใ…‡
sql์˜ ์ฃผ์š” ๋ฌธ๋ฒ•์„ ํ•™์Šตํ•˜๊ธฐ ์œ„ํ•ด ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ์—์„œ sql ์—๋Œ€ํ•œ ์˜ˆ์ œ๋„ ํ’€์–ด๋ณด๊ณ  ๋ฌธ๋ฒ•์„ ์ •๋ฆฌํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค . ์ œ๊ฐ€ ์ƒ๊ฐํ•˜๊ธฐ์— ๊ฐ€์žฅ ์ค‘์š”ํ–ˆ๋˜๊ฑด

SELECT * FROM TABLE;
//ํ…Œ์ด๋ธ”์˜ ๋‚ด์šฉ์„ ์กฐํšŒ ํ•˜๋Š”๊ฒƒ ๊ณผ
DESC TABLE; 
//ํ…Œ์ด๋ธ”์˜ ๊ตฌ์กฐ ์‚ดํŽด๋ณด๊ธฐ

//๊ทธ๋ฆฌ๊ณ  ์Šคํ”„๋ฆฐํŠธ ์˜ˆ์ œ์ธ
  \\ category์˜ name์ด soccer์ธ content์˜ title, body, created_at, user์˜ name์„ ์ฐพ๊ธฐ์œ„ํ•œ SQL์„ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”.
  ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค ์ด ๋ฌธ์ œ๋ฅผ ํ’€์–ด ๋‚˜๊ฐˆ ๋•Œ ์–ด๋Š ํ…Œ์ด๋ธ”์—์„œ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ ์™€์•ผ ํ•˜๋Š”์ง€๊ฐ€ ๊ทธ๋™์•ˆ ํ—ท๊ฐˆ๋ ธ์ง€๋งŒ ~์˜ ~๊ฐ€(์ด) ~์ธ ๊ฒƒ ์„ ๋กœ ๊ฒฉ์กฐ์‚ฌ๋ฅผ ๋ถ„์„ํ•ด ๊ฐ€๋ฉด์„œ ํ˜„์žฌ 
  ๋ฌธ์ œ์—์„œ๋Š” category์˜~ ๋กœ ๋‚˜์™€ ์žˆ์œผ๋‹ˆ category ํ…Œ์ด๋ธ”์—์„œ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์™€ join์„ ํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค 
  join์˜ ๋ฌธ๋ฒ•์€ 
  SELECT ๊ฐ€์ง€๊ณ  ์˜ค๊ณ ์‹ถ์€ ์ •๋ณด FROM ๊ฐ€์ง€๊ณ  ์˜ฌ ํ…Œ์ด๋ธ” 
  <!-- (left, inner , right, outer)==> ์ด๋ถ€๋ถ„์€ ์กฐ๊ฑด์— ๋งž๊ฒŒ ์„ ํƒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค  -->
  JOIN ๊ฐ€์ง€๊ณ ์˜ฌ ๋‹ค๋ฅธ ์ •๋ณด์˜ ํ…Œ์ด๋ธ” ON ๊ฐ€์ง€๊ณ  ์˜ฌ ํ…Œ์ด๋ธ”.๊ฐ€์ง€๊ณ  ์˜ฌ ๋ฐ์ดํ„ฐ
  = FROM์œผ๋กœ ํ†ตํ•ด ๊ฐ€์ ธ์˜จ ํ…Œ์ด๋ธ”.๋ฐ์ดํ„ฐ
  <!-- (์กฐ๊ฑด์ž…๋‹ˆ๋‹ค ์›ํ•™์‹œ๋Š”๊ฒƒ์„ ์กฐ๊ฑด์— ๋งž๊ฒŒ ์ •ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค) -->
`select content.title, content.body, content.created_at, user.name from category
left join content_category on content_category.categoryId = category.id
left join content on content.id = content_category.contentId
left join user on user.id = content.userId
where category.name = 'soccer'
๋”ฐ๋ผ์„œ ์œ„์™€ ๊ฐ™์€ ์กฐ์ธ๋ฌธ์„ ๋งŒ๋“ค์–ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค 
์กฐํšŒ, ์‚ฝ์ž…, ๊ฐฑ์‹ , ์‚ญ์ œ ๊ตฌ๋ฌธ์„ ์ž์œ ์ž์žฌ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ใ…‡
์กฐํšŒ: SELECT *(*์€ ์ „์ฒด์ด์ง€๋งŒ ๋‚ด๊ฐ€ ์กฐํšŒํ•˜๊ณ  ์‹ถ์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ์œผ๋ฉด ๊ทธ๊ฒƒ๋งŒ ์กฐํšŒ๊ฐ€๋Šฅ) FROM TABLE;

์‚ฝ์ž…:

๊ฐฑ์‹ :

UPDATE TABLE 
SET ์กฐ๊ฑด
WHERE ์กฐ๊ฑด์„ ์‹คํ–‰ ํ•  ํ…Œ์ด๋ธ”๊ณผ ๊ทธ ํ…Œ์ด๋ธ”์˜ ์กฐ๊ฑด

์กฐํšŒ์‹œ ๋‹ค์–‘ํ•œ ์กฐ๊ฑด์„ ๊ฑธ์–ด ์›ํ•˜๋Š” ์ •๋ณด๋งŒ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋‹ค. โ–ณ
JOIN ๋ฌธ์„ ์ƒ์šฉํ•ด์„œ ๋‹ค์–‘ํ•œ ์กฐ๊ฑด์„ ๊ฑธ๊ณ  ์›ํ•˜๋Š” ์ •๋ณด๋ฅผ ์กฐํšŒ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์•„์ง ๋ฏธ์ˆ™ํ•˜์—ฌ ๋” ์—ฐ์Šต ํ•  ํ•„์š”๋Š” ์žˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค

  SELECT ๊ฐ€์ง€๊ณ  ์˜ค๊ณ ์‹ถ์€ ์ •๋ณด FROM ๊ฐ€์ง€๊ณ  ์˜ฌ ํ…Œ์ด๋ธ” 
  <!-- (left, inner , right, outer)==> ์ด๋ถ€๋ถ„์€ ์กฐ๊ฑด์— ๋งž๊ฒŒ ์„ ํƒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค  -->
  JOIN ๊ฐ€์ง€๊ณ ์˜ฌ ๋‹ค๋ฅธ ์ •๋ณด์˜ ํ…Œ์ด๋ธ” ON ๊ฐ€์ง€๊ณ  ์˜ฌ ํ…Œ์ด๋ธ”.๊ฐ€์ง€๊ณ  ์˜ฌ ๋ฐ์ดํ„ฐ
  = FROM์œผ๋กœ ํ†ตํ•ด ๊ฐ€์ ธ์˜จ ํ…Œ์ด๋ธ”.๋ฐ์ดํ„ฐ
  <!-- (์กฐ๊ฑด์ž…๋‹ˆ๋‹ค ์›ํ•™์‹œ๋Š”๊ฒƒ์„ ์กฐ๊ฑด์— ๋งž๊ฒŒ ์ •ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค) -->
`select content.title, content.body, content.created_at, user.name from category
left join content_category on content_category.categoryId = category.id
left join content on content.id = content_category.contentId
left join user on user.id = content.userId
where category.name = 'soccer'
๋”ฐ๋ผ์„œ ์œ„์™€ ๊ฐ™์€ ์กฐ์ธ๋ฌธ์„ ๋งŒ๋“ค์–ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค

ํ†ต๊ณ„๋ฅผ ์œ„ํ•œ ์ฟผ๋ฆฌ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. ใ…‡ ๊ธฐ๋ณธ์ ์œผ๋กœ SUM , AVG, COUNT ๊ฐ™์€ ํ•จ์ˆ˜๋กœ ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๊ฒƒ์˜ ์ด ํ•ฉ, ํ‰๊ท , ๊ฐœ์ˆ˜ ๋“ฑ์„ ํŒŒ์•… ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค
ex:
SELECT SUM(numbers) FROM number
number๋ผ๋Š” ํ…Œ์ด๋ธ”์—์„œ numbers๋ผ๋Š” ์ปฌ๋Ÿผ์˜ ํ•ฉ์„ ๊ตฌ ํ•  ์ˆ˜ ์žˆ๊ณ 
SELECT AVG(numbers) FROM number
number๋ผ๋Š” ํ…Œ์ด๋ธ”์—์„œ numbers๋ผ๋Š” ์ปฌ๋Ÿผ์˜ ํ‰๊ท ์„ ๊ตฌ ํ•  ์ˆ˜ ์žˆ๊ณ 
SELECT COUNT(numbers) FRoM number
number๋ผ๋Š” ํ…Œ์ด๋ธ”์—์„œ numbers๋ผ๋Š” ์ปฌ๋Ÿผ์˜ ๊ฐœ์ˆ˜๋ฅผ ๊ตฌ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์Šคํ‚ค๋งˆ ๋””์ž์ธ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค. ใ…‡ dbdiagram ์ด๋ผ๋Š” ์›น์‚ฌ์ดํŠธ๋ฅผ ํ†ตํ•ด ์Šคํ‚ค๋งˆ๋ฅผ ๋””์ž์ธ ํ•œ ์‹ค์Šต์„ ํ•ด๋ณด๊ณ  ์‹ค์ œ ์Šคํ”„๋ฆฐํŠธ ์ง„ํ–‰๋„์ค‘ ์ž˜ ํ’€๋ฆฌ์ง€ ์•Š์„๋•Œ์—๋Š” ์Šคํ‚ค๋งˆ ๋””์ž์ธ์„ ํ•ด๋ณด๋ฉฐ ํ’€์–ด ๋‚˜๊ฐ€ ๋ณด์•˜๋‹ค

์•ฑ์— ํ•„์š”ํ•œ ํ…Œ์ด๋ธ”๊ณผ ํ•„๋“œ, ๊ทธ๋ฆฌ๊ณ  ๊ด€๊ณ„๋ฅผ ๋ถ€์—ฌํ•  ์ˆ˜ ์žˆ๋‹ค. ใ…‡ ์Šคํ‚ค๋งˆ ๋””์ž์ธ์„ ํ•˜๋ฉด์„œ ํ•„์š”ํ•œ ํ…Œ์ด๋ธ”๊ณผ ํ•„๋“œ๋ฅผ ์ƒ๊ฐํ•ด๋ณด๊ณ  ๊ทธ ํ•„๋“œ๋“ค์—์„œ ๊ฐ๊ฐ์˜ ๋ฐ์ดํ„ฐ์˜ ์—ฐ๊ฒฐ์„ ํ•ด์ฃผ๋Š” ์ž‘์—…์„ ํ•ด๋ณด๋ฉด์„œ ์ด๊ฒƒ์„ ์ตํ˜€ ๋ณด์•˜๋‹ค

1:N, N:N ๊ด€๊ณ„๋ฅผ ์ดํ•ดํ•˜๊ณ , ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ํ…Œ์ด๋ธ”์„ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค. ใ…‡ 1:1์˜ ๊ด€๊ณ„ : 1:1 ๊ด€๊ณ„๋ž€ ์–ด๋Š ์—”ํ‹ฐํ‹ฐ ์ชฝ์—์„œ ์ƒ๋Œ€ ์—”ํ‹ฐํ‹ฐ์™€ ๋ฐ˜๋“œ์‹œ ๋‹จ ํ•˜๋‚˜์˜ ๊ด€๊ณ„๋ฅผ ๊ฐ€์ง€๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด, ์šฐ๋ฆฌ๋‚˜๋ผ์—์„œ ๊ฒฐํ˜ผ ์ œ๋„๋Š” ์ผ๋ถ€์ผ์ฒ˜์ œ๋กœ, ํ•œ ๋‚จ์ž๋Š” ํ•œ ์—ฌ์ž์™€, ํ•œ ์—ฌ์ž๋Š” ํ•œ ๋‚จ์ž์™€ ๋ฐ–์— ๊ฒฐํ˜ผ์„ ํ•  ์ˆ˜ ์—†๋‹ค. ๋‚จํŽธ ๋˜๋Š” ๋ถ€์ธ์„ 2๋ช… ์ด์ƒ ๋‘˜ ์ˆ˜ ์—†๋Š”๋ฐ, ์ด๋Ÿฌํ•œ ๊ด€๊ณ„๊ฐ€ 1:1 ๊ด€๊ณ„๋‹ค.

1:N์˜ ๊ด€๊ณ„ : 1:N ๊ด€๊ณ„๋Š” ํ•œ ์ชฝ ์—”ํ‹ฐํ‹ฐ๊ฐ€ ๊ด€๊ณ„๋ฅผ ๋งบ์€ ์—”ํ‹ฐํ‹ฐ ์ชฝ์˜ ์—ฌ๋Ÿฌ ๊ฐ์ฒด๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. ํ˜„์‹ค์„ธ๊ณ„์—๋Š” 1:N๊ด€๊ณ„๊ฐ€ ๋งŽ์ด ์žˆ๋Š”๋ฐ, ์‹ค์ œ DB๋ฅผ ์„ค๊ณ„ํ•  ๋•Œ ์ž์ฃผ ์“ฐ์ด๋Š” ๋ฐฉ์‹์ด๋‹ค. 1:N ๊ด€๊ณ„๋Š” N:M ๊ด€๊ณ„์ฒ˜๋Ÿผ ์ƒˆ๋กœ์šด ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ค์ง€ ์•Š๋Š”๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋ถ€๋ชจ์™€ ์ž์‹ ๊ด€๊ณ„๋ฅผ ์ƒ๊ฐํ•ด๋ณด๋ฉด, ๋ถ€๋ชจ๋Š” ์ž์‹์„ 1๋ช…, 2๋ช…, 3๋ช…, ๊ทธ ์ด์ƒ๋„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฅผ ๋ถ€๋ชจ๊ฐ€ ์ž์‹์„ ์†Œ์œ ํ•œ๋‹ค๊ณ (has a ๊ด€๊ณ„) ํ‘œํ˜„ํ•œ๋‹ค. ๋ฐ˜๋Œ€๋กœ ์ž์‹ ์ž…์žฅ์—์„œ๋Š” ๋ถ€๋ชจ(์•„๋ฒ„์ง€, ์–ด๋จธ๋‹ˆ์˜ ์Œ)๋ฅผ ํ•˜๋‚˜๋งŒ ๊ฐ€์งˆ ์ˆ˜ ๋ฐ–์— ์—†๋‹ค. ์ด๋Ÿฌํ•œ ๊ด€๊ณ„๋ฅผ 1:N ๊ด€๊ณ„๋ผ๊ณ  ํ•˜๋ฉฐ, ๊ณ„์ธต์ ์ธ ๊ตฌ์กฐ๋กœ ์ดํ•ดํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

N:M์˜ ๊ด€๊ณ„ : N:M ๊ด€๊ณ„๋Š” ๊ด€๊ณ„๋ฅผ ๊ฐ€์ง„ ์–‘์ชฝ ์—”ํ‹ฐํ‹ฐ ๋ชจ๋‘์—์„œ 1:N ๊ด€๊ณ„๋ฅผ ๊ฐ€์ง€๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค. ์ฆ‰, ์„œ๋กœ๊ฐ€ ์„œ๋กœ๋ฅผ 1:N ๊ด€๊ณ„๋กœ ๋ณด๊ณ  ์žˆ๋Š” ๊ฒƒ์ด๋‹ค. ์˜ˆ๋ฅผ๋“ค์–ด, ํ•™์›๊ณผ ํ•™์ƒ์˜ ๊ด€๊ณ„๋ฅผ ์ƒ๊ฐํ•ด๋ณด๋ฉด, ํ•œ ํ•™์›์—๋Š” ์—ฌ๋Ÿฌ๋ช…์˜ ํ•™์ƒ์ด ์ˆ˜๊ฐ•ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ 1:N ๊ด€๊ณ„๋ฅผ ๊ฐ€์ง„๋‹ค. ๋ฐ˜๋Œ€๋กœ ํ•™์ƒ๋„ ์—ฌ๋Ÿฌ๊ฐœ์˜ ํ•™์›์„ ์ˆ˜๊ฐ•ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ์ด ์‚ฌ์ด์—์„œ๋„ 1:M ๊ด€๊ณ„๋ฅผ ๊ฐ€์ง„๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ํ•™์›๊ณผ ํ•™์ƒ์€ N:M ๊ด€๊ณ„๋ฅผ ๊ฐ€์ง„๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค N:M ๊ด€๊ณ„๋Š” ์„œ๋กœ๊ฐ€ ์„œ๋กœ๋ฅผ 1:N ๊ด€๊ณ„, 1:M ๊ด€๊ณ„๋กœ ๊ฐ–๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์„œ๋กœ์˜ PK๋ฅผ ์ž์‹ ์˜ ์™ธ๋ž˜ํ‚ค ์ปฌ๋Ÿผ์œผ๋กœ ๊ฐ–๊ณ  ์žˆ์œผ๋ฉด ๋œ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ N:M ๊ด€๊ณ„๋Š” ๋‘ ํ…Œ์ด๋ธ”์˜ ๋Œ€ํ‘œํ‚ค๋ฅผ ์ปฌ๋Ÿผ์œผ๋กœ ๊ฐ–๋Š” ๋˜ ๋‹ค๋ฅธ ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•ด์„œ ๊ด€๋ฆฌํ•œ๋‹ค

Foreign Key, Primary Key์— ๋Œ€ํ•ด ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค. ใ…‡ key์˜ ์ข…๋ฅ˜
ํ›„๋ณดํ‚ค (Candidate Key) : ํ…Œ์ด๋ธ”์„ ๊ตฌ์„ํ•˜๋Š” ์—ด ์ค‘์—์„œ ์œ ์ผํ•˜๊ฒŒ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ๋Š” ์—ด
๊ธฐ๋ณธํ‚ค (Primary Key) : ํ…Œ์ด๋ธ”์—์„œ ์œ ์ผํ•˜๊ฒŒ ์‹๋ณ„ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ํ‚ค
๋Œ€์ฒดํ‚ค (Alternate Key) : ํ›„๋ณดํ‚ค ์ค‘ ๊ธฐ๋ณธํ‚ค๋ฅผ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ ํ›„๋ณดํ‚ค
์™ธ๋ž˜ํ‚ค (Foreign Key) : ์™ธ๋ž˜ํ‚ค๋ž€ ํ…Œ์ด๋ธ” ๋‚ด์˜ ์—ด ์ค‘ ๋‹ค๋ฅธ ํ…Œ์ด๋ธ”์˜ ๊ธฐ๋ณธํ‚ค๋ฅผ ์ฐธ์กฐํ•˜๋Š” ์—ด์„ ์™ธ๋ž˜ํ‚ค๋ผ ํ•œ๋‹ค.
SQL์„ Node.js ์•ฑ์—์„œ ์ฟผ๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค. ใ…‡ ์Šคํ”„๋ฆฐํŠธ๋ฅผ ์ง„ํ–‰ ํ•˜๋ฉด์„œ Node.js์•ฑ ์—์„œ ์ฟผ๋ฆฌํ•˜๋Š” ๋ฒ•์„ ๋ฐฐ์› ๋‹ค ์š”์ฒญ์— ๋”ฐ๋ฅธ ์ฟผ๋ฆฌ๋ฅผ ๋‚ ๋ ค์ฃผ๊ณ  ๋˜ํ•œ ์š”์ฒญ์— ๋Œ€ํ•œ route๋„ ์žˆ์–ด์•ผ ํ•œ๋‹ค

---------------------------------------------------------
const mysql = require('mysql');
const dotenv = require('dotenv');
const config = require('../config/config');
dotenv.config();

const con = mysql.createConnection(
 config[process.env.NODE_ENV || 'development']
);

con.connect((err) => {
 if (err) throw err;
});

module.exports = con;


const db = require('../db'); //์šฐ์„  db๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ์œ„ํ•ด ๋ถˆ๋Ÿฌ์™€ ์ฃผ์—ˆ๋‹ค
//์š”์ฒญ๊ณผ ์ฟผ๋ฆฌ๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณด๋‚ด๋ณด์•˜๋‹ค

orders: {
   get: (userId, callback) => {
     let userOrders = 
     // ๋ˆ„๊ฐ€ ์–ผ๋งˆ์งœ๋ฆฌ์˜ ๋ฌด์—‡์„ ์ฃผ๋ฌธํ–ˆ๋Š”์ง€ ์•Œ๊ธฐ์œ„ํ•ด ์•Œ์•„์•ผํ•  ์ •๋ณด๋ฅผ ๋“ค๊ณ ์˜ค๊ณ 
     // ํ•ด๋‹น์ •๋ณด๋ฅผ ์–ป์œผ๋ ค๋ฉด joinํ…Œ์ด๋ธ”๋กœ ๊ฐ’์„ FK๋ฅผ ํ†ตํ•ด ๋“ค๊ณ ์™€์•ผํ•จ 
     `SELECT orders.id, orders.total_price, order_items.order_quantity, 
     items.name, items.image, items.price from orders
     INNER JOIN order_items on orders.id = order_items.order_id
     INNER JOIN items on items.id = order_items.item_id
     WHERE user_id=?`
     //mysql๋ฌธ์„ ์ž‘์„ฑํ•ด ์ฃผ๊ณ  ์•„๋ž˜์˜ ์ฟผ๋ฆฌ๋ฌธ๊ณผ ๊ฐ™์ด ๋‚ ๋ ค์ฃผ์—ˆ๋‹ค
     db.query(userOrders, [userId], (err, result) => {
       if (err) throw err 
       else {
       console.log(result)
       callback(err,result);
       }

     })
   },
   -------------------------------------------------
   //route.js ์š”์ฒญ์˜ route ์—ญํ™œ์„ ํ•˜๋Š”๊ณณ์ด๋‹ค 
   // userId๋กœ ์ „์ฒด ์ฃผ๋ฌธ ๋‚ด์—ญ์„ ์กฐํšŒํ•˜๋Š” ๋ผ์šฐํŒ…
   const router = require('express').Router();
  const controller = require('./controllers');
   router.get('/:userId/orders', controller.orders.get);

ํด๋ผ์ด์–ธํŠธ์˜ HTTP ์š”์ฒญ์— ๋”ฐ๋ผ CRUD API๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. (CRUD: Create, Read, Update, Delete) ใ…‡
์œ„์˜ ์ž‘์„ฑํ•œ ๋‚ด์šฉ๊ณผ ๊ฐ™์ด ์š”์ฒญ์ด ๋“ค์–ด์™”์„๋•Œ ๊ทธ์— ๋”ฐ๋ฅธ ์š”์ฒญ๊ฐ’์„ ์„ค์ •ํ•ด์ฃผ๊ณ  ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑ ํ•  ๊ฒƒ์ธ์ง€ ๋ถˆ๋Ÿฌ์˜ฌ ๊ฒƒ์ธ์ง€ ์—…๋ฐ์ดํŠธ๋ฅผ ํ• ๊ฒƒ์ธ์ง€ ์‚ญ์ œํ•  ๊ฒƒ์ธ์ง€๋Š” mysql๋ฌธ๋ฒ•์—์„œ ์ˆ˜์ •ํ•˜๊ณ  query๋ฌธ์„ ์‚ด์ง ์ˆ˜์ •ํ•ด์ฃผ๋ฉด ๋  ๊ฒƒ ๊ฐ™๋‹ค

shortly
MVC ๋””์ž์ธ ํŒจํ„ด๊ณผ ๊ฐ™์ด, ์ฝ”๋“œ๋ฅผ ๊ฐ๊ฐ ๋‹ค๋ฅธ ๋ถ€๋ถ„์œผ๋กœ ๋‚˜๋ˆ„์–ด ์ž‘์„ฑํ•ด์•ผ ํ•˜๋Š” ์ด์œ ๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค. ใ…‡
MVC๋””์ž์ธ ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š” Model View Controllers ๊ฐ€ ๊ฐ๊ฐ์ด ์ž๊ธฐ์˜ ์ผ์„ ํ•˜๋ฉฐ ์„œ๋กœ ๋ถ„๋ฆฌ๋˜์–ด ๊ฐ์ž์˜ ์—ญํ• ์—๋งŒ ์ง‘์ค‘ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๊ฐœ๋ฐœ ํ•  ์ˆ˜ ์žˆ๋‹ค ์ด๋Ÿด๊ฒฝ์šฐ์—๋Š” ์œ ์ง€๋ณด์ˆ˜, application์˜ ํ™•์žฅ์„ฑ, ์œ ์—ฐ์„ฑ ์ฆ๊ฐ€ , ์ค‘๋ณต์ฝ”๋”ฉ์˜ ๋ฐœ์ƒ์—ฌ๋ถ€ ๋“ฑ ๋ฐœ์ƒ ๊ฐ€๋Šฅํ•œ ๋‹ค์–‘ํ•œ ๋ฌธ์ œ์ ์„ ํ•ด๊ฒฐ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Model, View, Controller๊ฐ€ ๊ฐ๊ฐ ์–ด๋–ค ์—ญํ• ์„ ํ•˜๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค. ใ…‡
Model: ์ผ๋ฐ˜์ ์œผ๋กœ DB๋ฐ์ดํ„ฐ ํ…Œ์ด๋ธ”์— ํ•ด๋‹นํ•˜๊ณ  ์ˆœ์ˆ˜ํ•œ ๋ฐ์ดํ„ฐ๋กœ์„œ์˜ db์—ญํ• ์„ ํ•˜๊ฑฐ๋‚˜ DB์— ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•ด์„œ ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›๋Š” ์—ญํ• ์„ ํ•œ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ํŽธ์ง‘ํ•˜๊ธธ ์›ํ•˜๋Š” ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์•ผ ํ•˜๊ณ  View๋‚˜ Controller์— ๋Œ€ํ•œ ์ •๋ณด๋Š” ์•Œ ์ˆ˜ ์—†๋‹ค

Conteroller: ์‚ฌ์šฉ์ž๊ฐ€ ์ ‘๊ทผ ํ•œ URL์— ๋”ฐ๋ผ์„œ ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์‚ฌใ…ํ•ญ์„ ํŒŒ์•…ํ•œ ํ›„์— ๊ทธ ์š”์ฒญ์— ๋งž๋Š” ๋ฐ์ดํ„ฐ๋ฅผ Model์— ์˜๋ขฐํ•˜๊ณ , Model์—์„œ ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋ฅผ View์— ๋ฐ˜์˜ํ•ด์„œ ์‚ฌ์šฉ์ž์—๊ฒŒ ์•Œ๋ ค์ฃผ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค

View: Controller๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์„œ ํด๋ผ์ด์–ธํŠธ ์ธก ๊ธฐ์ˆ ์ธ html/css/javascript๋ฅผ ์ด์šฉํ•ด ํ‘œํ˜„ํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค. ๋ฐ์ดํ„ฐ๋ฅผ ๋”ฐ๋กœ ๋ณด๊ด€ํ•˜์ง€ ์•Š๊ณ  ์ฒ˜๋ฆฌํ•œ๋‹ค.

ORM์˜ ์žฅ์ ์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค. ใ…‡
์žฅ์ :

๊ฐ์ฒด์ง€ํ–ฅ์ ์ธ ์ฝ”๋“œ๋กœ ์ธํ•ด ๋”์ง๊ด€์ ์ด๊ณ  ๋กœ์ง์— ์ง‘์ค‘ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ค€๋‹ค .(
SQL๋ฌธ์ด ์•„๋‹Œ ํด๋ ˆ์Šค์˜ ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์กฐ์ž‘ ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ฐ์ฒด ๋ชจ๋ธ๋งŒ ์ด์šฉํ•ด์„œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•˜๋Š” ๋ฐ ์ง‘์ค‘ ํ•  ์ˆ˜ ์žˆ๋‹ค.

์„ ์–ธ๋ฌธ, ํ• ๋‹น, ์ข…๋ฃŒ ๊ฐ™์€ ๋ถ€์ˆ˜์ ์ธ ์ฝ”๋“œ๊ฐ€ ์—†๊ฑฐ๋‚˜ ์ค„์–ด๋“ ๋‹ค

๊ฐ์ฒด๋งˆ๋‹ค ์ฝ”๋“œ๋ฅผ ๋ณ„๋„๋กœ ์ž‘์„ฑํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์ด ๋†’์•„์ง„๋‹ค.

SQL์˜ ์ ˆ์ฐจ์ ์ด๊ณ  ์ˆœ์ฐจ์ ์ธ ์ ‘๊ทผ์ด ์•„๋‹Œ ๊ฐ์ฒด์ง€ํ–ฅ์ ์ธ ์ ‘๊ทผ์œผ๋กœ ์ธํ•ด ์ƒ์‚ฐ์„ฑ์„ ๋†’์—ฌ์ค€๋‹ค

)

์žฌ์‚ฌ์šฉ ๋ฐ ์œ ์ง€๋ณด์ˆ˜์˜ ํŽธ๋ฆฌ์„ฑ์ด ์ฆ๊ฐ€ํ•œ๋‹ค( ORM์€ ๋…๋ฆฝ์ ์œผ๋กœ ์ž‘์„ฑ๋˜์–ด ์žˆ๊ณ , ํ•ด๋‹น ๊ฐ์ฒด๋“ค์„ ์žฌํ™œ์šฉ ํ•  ์ˆ˜ ์žˆ๋‹ค.
๋งคํ•‘ ์ •๋ณด๊ฐ€ ๋ช…ํ™•ํ•˜์—ฌ, ERD๋ฅผ ๋ณด๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ์˜์กด๋„๋ฅผ ๋‚ฎ์ถœ ์ˆ˜ ์žˆ๋‹ค

)

DBMS์— ๋Œ€ํ•œ ์ข…์†์„ฑ์ด ์ค„์–ด๋“ ๋‹ค.(
๋Œ€๋ถ€๋ถ„ ORM ์†”๋ฃจ์…˜์€ DB์— ์ข…์†์ ์ด์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๊ตฌํ˜„ ๋ฐฉ๋ฒ• ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋งŽ์€ ์†”๋ฃจ์…˜์—์„œ ์ž๋ฃŒํ˜• ํƒ€์ž…๊นŒ์ง€ ์œ ํšจํ•˜๋‹ค DB์— ์ค‘์†์ ์ด์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์€ ํ”„๋กœ๊ทธ๋žจ ๊ตฌ์กฐ๊ฐ€ ๋Ž…์ดํ„ฐ์— ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ด๋‹ค

ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” Object์— ์ง‘์ค‘ํ•จ์œผ๋กœ ๊ทน๋‹จ์ ์œผ๋กœ DBMS๋ฅผ ๊ต์ฒดํ•˜๋Š” ๊ฑฐ๋Œ€ํ•œ ์ž‘์—…์—๋„ ๋น„๊ต์  ์ ์€ ๋ฆฌ์Šคํฌ์™€ ์‹œ๊ฐ„์ด ์†Œ์š”๋œ๋‹ค.

)

Sequelize ORM๊ณผ ๊ด€๋ จ CLI ํˆด๋“ค์„ ๊ณต์‹ ๋ฌธ์„œ๋ฅผ ๋ณด๊ณ  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ใ…‡
์Šคํ”„๋ฆฐํŠธ์˜ ๊ฑฐ์˜ ๋ชจ๋“  ๊ฒƒ์„ ๊ณต์‹๋ฌธ์„œ๋ฅผ ํ†ตํ•ด ์ ‘๊ทผ ํ–ˆ์œผ๋ฏ€๋กœ ์–ด๋Š์ •๋„ ์ฝ์„ ์ˆ˜ ์žˆ์ง€๋งŒ ์•„์ง๊นŒ์ง€ ์‚ฌ์šฉ๋ฒ•์„ ์ฐพ๊ธฐ์— ์–ด๋ ค์›€์ด ์žˆ๋Š” ๋ถ€๋ถ„๋„ ์žˆ๋‹ค

Sequelize๋ฅผ ์ด์šฉํ•ด ๋ชจ๋ธ์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. ใ…‡
ํ„ฐ๋ฏธ๋„ ์ƒ์—์„œ ๋‚ด๊ฐ€ ์›ํ•˜๊ณ ์ž ํ•˜๋Š” ๋ชจ๋ธ์„ ์ž‘์„ฑ ํ•  ๋•Œ์—๋Š”

npx sequelize-cli model:generate --name ์ด๋ฆ„ --attributes ๋ฐ์ดํ„ฐ์˜ ์ปฌ๋Ÿผ๊ณผ ํƒ€์ž…์˜ ์†์„ฑ firstName:string,lastName:string,email:string
//์ฃผ์„์—†์ด ๋ณด๋Š” ์ฝ”๋“œ
npx sequelize-cli model:generate --name User --attributes firstName:string,lastName:string,email:string
Sequelize๋ฅผ ์ด์šฉํ•ด ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ํ•  ์ˆ˜ ์žˆ๋‹ค. ใ…‡
ํ„ฐ๋ฏธ๋„ ์ƒ์—์„œ ๋ช…๋ น์–ด๋กœ

npx sequelize-cli db:migrate
๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ํ•  ์ˆ˜ ์žˆ๋‹ค ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ํ•˜๊ฒŒ ๋˜๋ฉด ์ƒ์„ฑ ํ•ด๋†“์•˜๋˜ ๋ชจ๋ธ๋“ค์ด github์— commit ํ•˜๋“ฏ์ด ๋“ฑ๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค

๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์˜ ๊ฐœ๋…๊ณผ ํ•„์š”์„ฑ์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค. ใ…‡
๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์˜ ๊ฐœ๋…(
๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์ด๋ž€ ?

CRUD(Create, Read, Update, Delete)๋ฅผ ์ž˜ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ”์˜ ์Šคํ‚ค๋งˆ๊ฐ€ ์ž˜ ์ •์˜ ๋˜์–ด์žˆ์–ด์•ผ ํ•˜๊ณ  ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์€ ํ•œ ์šด์˜ํ™˜๊ฒฝ์œผ๋กœ๋ถ€ํ„ฐ ๋‹ค๋ฅธ ์šด์˜ํ™˜๊ฒฝ์œผ๋กœ ์˜ฎ๊ธฐ๋Š” ์ž‘์—…์„ ๋œปํ•จ. ํ•˜๋“œ์›จ์–ด, ์†Œํ”„ํŠธ์›จ์–ด, ๋„คํŠธ์›Œํฌ ๋“ฑ ๋„“์€ ๋ฒ”์œ„์—์„œ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์˜ ๊ฐœ๋…์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Œ !

๊ทธ๋ ‡๋‹ค๋ฉด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ์˜ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์ด๋ž€ ?

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์Šคํ‚ค๋งˆ์˜ ๋ฒ„์ „์„ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ํ•˜๋‚˜์˜ ๋ฐฉ๋ฒ•, ๊ฐœ๋ฐœ์‹œ์Šคํ…œ์—๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์Šคํ‚ค๋งˆ๊ฐ€ ๋ณ€๊ฒฝ ๋˜์—ˆ์ง€๋งŒ ์šด์˜์‹œ์Šคํ…œ์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์Šคํ‚ค๋งˆ๊ฐ€ ๋ณ€๊ฒฝ ๋˜์ง€ ์•Š์•˜์„ ๊ฒฝ์šฐ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ์ˆ˜ํ–‰. ์ž‘๊ฒŒ๋Š” ํ”„๋กœ์ ํŠธ ์ƒ ํ…Œ์ด๋ธ” ์ƒ์„ฑ ๋ฐ ๋ณ€๊ฒฝ ์ž‘์—…๋ถ€ํ„ฐ ํ•˜๋‚˜์˜ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋˜๋Š” ์‹œ์Šคํ…œ์„ ์˜ฎ๊ธฐ๋Š” ๊ฒƒ ๊นŒ์ง€ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์— ํ•ด๋‹น. ์š”๊ตฌ์‚ฌํ•ญ์— ๋”ฐ๋ผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ์Šคํ‚ค๋งˆ๊ฐ€ ๋ฐ”๋€Œ์—ˆ์ง€๋งŒ ๊ฐœ๋ฐœ๊ณผ์ •์—๋Š” ์ ์šฉ๋์ง€๋งŒ ์šด์˜ํ™˜๊ฒฝ์—๋Š” ์ ์šฉ๋˜์ง€ ์•Š์•„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ „ํ™˜์‹œ ์• ๋ฅผ ๋จน๋Š” ๊ฒฝ์šฐ์— ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค .

)

Sequelize ORM์œผ๋กœ 1:1. 1:N, N:N ๊ด€๊ณ„๋ฅผ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. ใ…‡
์Šคํ”„๋ฆฐํŠธ ์ง„ํ–‰์ค‘ Advenced๋กœ 1:N ์˜ ๊ด€๊ณ„๋ฅผ ํ•ด๋ณด์•˜๋‹ค ๊ณต์‹์‚ฌ์ดํŠธ์—์„œ 1:1 ๊ณผ 1:N , N:N์˜ ๊ด€๊ณ„๋ฅผ ์–ด๋–ป๊ฒŒ ํ‘œํ˜„ ํ•˜๋Š”์ง€ ์ž˜ ๋‚˜์™€ ์žˆ๋‹ค .

Associate

const A = sequelize.define('A', /* ... */);
const B = sequelize.define('B', /* ... */);

A.hasOne(B); // A HasOne B
A.belongsTo(B); // A BelongsTo B

์˜ˆ) Foo.hasOne(Bar);
   Bar.belongsTo(Foo);

A.hasMany(B); // A HasMany B
์˜ˆ) Team.hasMany(Player);
    Player.belongsTo(Team);

A.belongsToMany(B, { through: 'C' }); // A BelongsToMany B through the junction table C

์œ„์™€ ๊ฐ™์ด hasOne๊ณผ belongsTo ๋Š” 1:1์˜ ๊ด€๊ณ„์—์„œ ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ๊ณ  1:N์˜ ๊ด€๊ณ„ ์—์„œ๋Š” hasMany๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค .

(Advanced) MVC ๋””์ž์ธ ํŒจํ„ด์˜ ํ•œ๊ณ„๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค. ใ…‡ ๊ธฐ๋ณธ๊ธฐ๋Šฅ ์„ค๊ณ„๋ฅผ ์œ„ํ•ด ํด๋ž˜์Šค๋“ค์„ ๋งŽ์ด ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ž์นซ ์ž˜๋ชปํ•˜๋ฉด ๋” ๋ณต์žกํ•ด์งˆ ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ด์œ ๋กœ ์ดˆ๋ฐ˜์— ์„ค๊ณ„์‹œ๊ฐ„์ด ์˜ฌ๋ž˜ ๊ฑธ๋ฆฌ๊ณ  ์ˆ™๋ จ๋œ ๊ฐœ๋ฐœ์ž๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ๊ทธ๋ฆฌ๊ณ  Model๊ณผ View์˜ ์˜์กด์„ฑ์ด ์™„๋ฒฝํžˆ ๋ถ„๋ฆฌ ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ํŒจํ„ด์ด ๋ชจํ˜ธํ•ด์งˆ ์ˆ˜ ์žˆ๊ณ  ๋ณ€ํ˜•์ด ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.
์ด ๋‹จ์ ์„ ํ•ด๊ฒฐ ํ•˜๊ธฐ ์œ„ํ•œ ํ•ด๊ฒฐ๋ฐฉ์•ˆ

MVCํŒจํ„ด์˜ Model๊ณผ View์˜ ์˜์กด์„ฑ์ด ๋†’๋‹ค๋Š” ๋‹จ์ ์„ ๋ณด์•ˆํ• ๋งŒํ•œ ๋Œ€์•ˆ์œผ๋กœ MVVMํŒจํ„ด์ด ์žˆ๋‹ค. MVVMํŒจํ„ด์€ Model + View + View Model๋ฅผ ํ•ฉ์นœ ์šฉ์–ด์ด๋‹ค.
Model : MVCํŒจํ„ด์˜ Model์˜ ๊ธฐ๋Šฅ๊ณผ ๊ฑฐ์˜ ๋™์ผํ•˜๋‹ค. ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ถ€๋ถ„์ด๋‹ค.

View : MVCํŒจํ„ด์˜ View์˜ ๊ธฐ๋Šฅ๊ณผ ๊ฑฐ์˜ ๋™์ผํ•˜๋‹ค. ์‚ฌ์šฉ์ž์— ๋ณด์—ฌ์ง€๋Š” UI๋ถ€๋ถ„์ด๋‹ค.

View Model : View๋ฅผ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ๋งŒ๋“  View๋ฅผ ์œ„ํ•œ Model์ด๋‹ค. View๋ฅผ ๋‚˜ํƒ€๋‚ด ์ฃผ๊ธฐ ์œ„ํ•œ Model์ด์ž View๋ฅผ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•œ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๋Š” ๋ถ€๋ถ„์ด๋‹ค.

๋™์ž‘ MVVM ํŒจํ„ด์˜ ๋™์ž‘ ์ˆœ์„œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.
์‚ฌ์šฉ์ž์˜ Action๋“ค์€ View๋ฅผ ํ†ตํ•ด ๋“ค์–ด์˜ค๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
View์— Action์ด ๋“ค์–ด์˜ค๋ฉด, Command ํŒจํ„ด์œผ๋กœ View Model์— Action์„ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
View Model์€ Model์—๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.
Model์€ View Model์—๊ฒŒ ์š”์ฒญ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋ฅผ ์‘๋‹ตํ•ฉ๋‹ˆ๋‹ค.
View Model์€ ์‘๋‹ต ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€๊ณตํ•˜์—ฌ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
View๋Š” View Model๊ณผ Data Bindingํ•˜์—ฌ ํ™”๋ฉด์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
ํŠน์ง• MVVM ํŒจํ„ด์€ Command ํŒจํ„ด๊ณผ Data Binding ๋‘ ๊ฐ€์ง€ ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
Command ํŒจํ„ด๊ณผ Data Binding์„ ์ด์šฉํ•˜์—ฌ View์™€ View Model ์‚ฌ์ด์˜ ์˜์กด์„ฑ์„ ์—†์•ด์Šต๋‹ˆ๋‹ค.

View Model๊ณผ View๋Š” 1:n ๊ด€๊ณ„์ž…๋‹ˆ๋‹ค.

์žฅ์  MVVM ํŒจํ„ด์€ View์™€ Model ์‚ฌ์ด์˜ ์˜์กด์„ฑ์ด ์—†์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ Command ํŒจํ„ด๊ณผ Data Binding์„ ์‚ฌ์šฉํ•˜์—ฌ View์™€ View Model ์‚ฌ์ด์˜ ์˜์กด์„ฑ ๋˜ํ•œ ์—†์•ค ๋””์ž์ธํŒจํ„ด์ž…๋‹ˆ๋‹ค. ๊ฐ๊ฐ์˜ ๋ถ€๋ถ„์€ ๋…๋ฆฝ์ ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“ˆํ™” ํ•˜์—ฌ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋‹จ์ ์œผ๋กœ ์„ค๊ณ„ ์ž์ฒด๊ฐ€ ์‰ฝ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
์ถœ์ฒ˜: https://hjjooace.tistory.com/entry/MVCํŒจํ„ด-MVVM-ํŒจํ„ด-Singleton-ํŒจํ„ด [Hungry Developer]

profile
์ฃผ๋‹ˆ์–ด ๊ฐœ๋ฐœ์ž ์ด๊ฑด์šฐ ์ž…๋‹ˆ๋‹ค .

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