๐ซ ์ค์์ ๊ณผ ์จํ๋ผ์ด์ฆ ๐ซ
What is ORM?
: ORM์ ํ๋ก๊ทธ๋จ ์์ ๊ฐ์ฒด์ DB์ ํ ์ด๋ธ(Relation)์ด ์ผ๋์ผ ๋์ํ๋ ๊ด๊ณ๋ฅผ ๋งบ๋ ๊ฒ์ ์๋งํ๋ค! ORM์ ์ด์ฉํ๋ฉด query๊ฐ ์๋ ๋ฉ์๋๋ก ๋ฐ์ดํฐ๋ฅผ ์กฐ์ํ ์ ์๋ค๋ ๊ฒ์ด ์ฅ์ ์ด๋ค! (SQL๋ฌธ์ ์์ฑํ์ง ์๊ณ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ํตํ ์ ์๋ค.)
์)
If I use MySQL: SELECT * FROM user;
If I use ORM: user.findAll();
But!
: ์ฟผ๋ฆฌ๊ฐ ๋ณต์กํด์ง๋ฉด ORM์ผ๋ก ํํํ๋ ๋ฐ ํ๊ณ๊ฐ ์๊ธด๋ค.
: raw query์ ๋นํด ๋๋ฆฌ๋ค.
๋ค์ํ ORM ํ๋ ์์ํฌ๊ฐ ์กด์ฌํ๋ค.
์) Sequelize, Djanggo ORM, TypeORM, JPA/Hibernate ๋ฑ
Sequelize
: Node.js์ ๋ํ์ ์ธ ORMํ๋ ์์ํฌ, Promise๋ฌธ๋ฒ์ ์ฌ์ฉํ๋ค.
: Sequelize-cli๋ sequelize๋ฅผ ์ข ๋ ํจ์จ์ ์ ์ฌ์ฉํ๊ธฐ ์ํ ๋ชจ๋.
What can we do with Sequelize-cli
: Sequelize-cli๋ ๋ง์ด๊ทธ๋ ์ด์
์ ํ ์ ์๋๋ก ๋๋ ํด์ด๋ค.
: ๋ชจ๋ธ์ ์์ฑํด์ฃผ๊ฑฐ๋ ์คํค๋ง๋ฅผ ์ ์ฉํ ์ ์๋๋ก ๋๋๋ค!
then what is "Migration"
: ๋ง์ด๊ทธ๋ ์ด์ ์ ์์ธ ๋ฐ์ดํฐ๋ฅผ ํ๋๋ก ์ฎ๊ฒจ์ฃผ๊ฑฐ๋, ์ ์๋ฅผ ๊ฐ๊ณ ์๋ ์๋ก์ด ํ ์ด๋ธ์ ๋ง๋๋ ๊ฒ ์์ฒด์ ๊ทธ ๊ธฐ๋ก์ ๋งํ๋ค!
and... what is "Model"
: ํด๋์ค๋ฅผ ๋ฉ์๋์ ์์ฑ์ด ํฌํจ๋ ํ๋กํ ํ์
์ด๋ผ๊ณ ํ๋ค๋ฉด, ๋ชจ๋ธ์ ๋ฉ์๋์ ์์ฑ, ๊ทธ๋ฆฌ๊ณ ๊ฑฐ๊ธฐ์ ์ํฐํฐ(์คํค๋ง)๊ฐ ํฌํจ๋ ๊ฐ๋
์ด๋ผ ํ ์ ์๋ค.
: ์ํผ ์ค์ํ ๊ฒ์ ๋ชจ๋ธ์๋ ์ํฐํฐ ์ ๋ณด๊ฐ ๋ด๊ฒจ์๋ค๋ ์ !
what's different between "Model" and "Migration"
Migration์ ์คํค๋ง๋ฅผ ์ด๋ป๊ฒ ๋ง๋ค ๊ฒ์ธ์ง ์ค์ ํ๋ ํ์ผ์ด๋ค.
Model์ ํฌ๋ฆฌ์์ดํธ, ์
๋ฐ์ดํธ, ๋์คํธ๋ก์ด ๋ฑ์ ๋ฉ์๋, ์ฆ ๋ชจ๋ธ์ ์๋ ๊ธฐ๋ฅ๋ค์ ์ฌ์ฉํ ์ ์๊ฒ๋ ๋ง๋ค์ด์ฃผ๋ ๊ธฐ๋ฅ์ ์ํํ๋ค.
์คํ๋ฆฐํธ ์์์์ ๋ง์ด๊ทธ๋ ์ด์
ํ์ผ์ ๋ํดํธ๊ฐ์ ์ค์ ํ๋ฉด, ์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ฒด?์ ํ
์ด๋ธ์ ํ์ฑํ ๋ ๋ํดํธ๊ฐ์ด ์ ์ฉ๋๋ ๊ฒ์ด๊ณ ,
๋ชจ๋ธ ํ์ผ์ ๋ํดํธ๊ฐ์ ์ค์ ํ๋ฉด, ๋ฉ์๋๋ฅผ ํตํด ๊ฐ์ ์ฃผ๊ณ ๋ฐ์ ๋ ๋ํดํธ๊ฐ์ด ํ์ฑ๋๋ ๊ฒ์ด๋ค.
(๋ฌผ๋ก ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ๋ ๊ตฐ๋ฐ์ ๋์ผํ๊ฒ ์ค์ ํด์ฃผ์ด์ผ ํ ๋ฏ ์ถ๋ค.)
sequlize-cli ๋ช ๋ น์ด
ํ๋ก์ ํธ ์์ํ๊ธฐ!
npx sequelize-cli init
์ด ๋ช
๋ น์ด๋ฅผ ํตํด ํ๋ก์ ํธ๋ฅผ ์์ํ๋๋ฐ!
์
๋ ฅํ๋ฉด ์๊ธฐ๋ ์ฌ๋ฌ ํด๋๋ค์ด ์๋ค!
๊ฐ๊ฐ์ ํดํฐ๊ฐ ํ๋ ์ญํ ์ ์๋์ ๊ฐ๋ค.
- config: CLI๊ฐ ์ด๋ป๊ฒ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฐ๊ฒฐ๋๋์ง๋ฅผ ์ค๋ช ํ๋ configํ์ผ์ ํฌํจ
- models: ํ๋ก์ ํธ๋ฅผ ์ํ ๋ชจ๋ ๋ชจ๋ธํ์ผ์ ํฌํจ
- mogrations: ๋ชจ๋ ๋ง์ด๊ทธ๋ ์ด์ ํ์ผ ํฌํจ
- seeders: ๋ชจ๋ ์๋ํ์ผ ํฌํจ
(seed๋ ์๋ฒ๊ฐ ์์๋ ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ด ๊ฐ์ง๊ณ ์์ด์ผ ํ ์ ์ ์ธ ๋ฐ์ดํฐ๋ค์ DB์ ์ถ๊ฐํด์ฃผ๋ ๊ธฐ๋ฅ์ ์๋ฏธํ๋ค. ์ด๋ฒ ์คํ๋ฆฐํธ์์๋ ํ์ฉ๋์ง ์๋ ๋ฏ ์ถ๋ค.)
Express ์๋ต๋ฉ์๋
Sequelize ๋ฌธ๋ฒ
Simple INSERT queries: Model.create()
// Create a new user
const jane = await User.create({ firstName: "Jane", lastName: "Doe" });
console.log("Jane's auto-generated ID:", jane.id);
Simple SELECT queries: Model.findAll()
// Find all users
const users = await User.findAll();
console.log(users.every(user => user instanceof User)); // true
console.log("All users:", JSON.stringify(users, null, 2));
Applying WHERE clauses
Post.findAll({
where: {
authorId: 2
}
});
// SELECT * FROM post WHERE authorId = 2
Simple UPDATE queries
// Change everyone without a last name to "Doe"
await User.update({ lastName: "Doe" }, {
where: {
lastName: null
}
});
Simple DELETE queries: Model.destroy()
// Delete everyone named "Jane"
await User.destroy({
where: {
firstName: "Jane"
}
});
Creating in bulk: Model.bulkCreate()
const captains = await Captain.bulkCreate([
{ name: 'Jack Sparrow' },
{ name: 'Davy Jones' }
]);
console.log(captains.length); // 2
console.log(captains[0] instanceof Captain); // true
console.log(captains[0].name); // 'Jack Sparrow'
console.log(captains[0].id); // 1 // (or another auto-generated value)
Author And Source
์ด ๋ฌธ์ ์ ๊ดํ์ฌ(๐ซ ์ค์์ ๊ณผ ์จํ๋ผ์ด์ฆ ๐ซ), ์ฐ๋ฆฌ๋ ์ด๊ณณ์์ ๋ ๋ง์ ์๋ฃ๋ฅผ ๋ฐ๊ฒฌํ๊ณ ๋งํฌ๋ฅผ ํด๋ฆญํ์ฌ ๋ณด์๋ค https://velog.io/@9rganizedchaos/์ค์์ ๊ณผ-์จํ๋ผ์ด์ฆ์ ์ ๊ท์: ์์์ ์ ๋ณด๊ฐ ์์์ URL์ ํฌํจ๋์ด ์์ผ๋ฉฐ ์ ์๊ถ์ ์์์ ์์ ์ ๋๋ค.
์ฐ์ํ ๊ฐ๋ฐ์ ์ฝํ ์ธ ๋ฐ๊ฒฌ์ ์ ๋ (Collection and Share based on the CC Protocol.)
์ข์ ์นํ์ด์ง ์ฆ๊ฒจ์ฐพ๊ธฐ
๊ฐ๋ฐ์ ์ฐ์ ์ฌ์ดํธ ์์ง
๊ฐ๋ฐ์๊ฐ ์์์ผ ํ ํ์ ์ฌ์ดํธ 100์ ์ถ์ฒ ์ฐ๋ฆฌ๋ ๋น์ ์ ์ํด 100๊ฐ์ ์์ฃผ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์ ํ์ต ์ฌ์ดํธ๋ฅผ ์ ๋ฆฌํ์ต๋๋ค