์ด๋ฒ ํ์ฃผ๊ฐ์ 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]