14์ฃผ์ฐจ ORM Sequelize

lim1313ยท2021๋…„ 10์›” 19์ผ
0

๋ถ€ํŠธ์บ ํ”„ TIL

๋ชฉ๋ก ๋ณด๊ธฐ
41/49

๐ŸŒˆ ORM

ORM์€ Object Relational Mapping ์ฆ‰, ๊ฐ์ฒด-๊ด€๊ณ„ ๋งคํ•‘์˜ ์ค„์ž„๋ง์ด๋‹ค. ๊ฐ์ฒด-๊ด€๊ณ„ ๋งคํ•‘์„ ํ’€์–ด์„œ ์„ค๋ช…ํ•˜์ž๋ฉด ์šฐ๋ฆฌ๊ฐ€ OOP(Object Oriented Programming)์—์„œ ์“ฐ์ด๋Š” ๊ฐ์ฒด๋ผ๋Š” ๊ฐœ๋…์„ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค์™€ RDB(Relational DataBase)์—์„œ ์“ฐ์ด๋Š” ๋ฐ์ดํ„ฐ์ธ ํ…Œ์ด๋ธ” ์ž๋™์œผ๋กœ ๋งคํ•‘(์—ฐ๊ฒฐ)ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

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


๊ณผ์ œ urls ๋ผ๋Š” ํ…Œ์ด๋ธ” ์Šคํ‚ค๋งˆ


๐ŸŒˆ Sequelize ๊ฐœ๋…

๐ŸŒˆ Sequelize ๋ฐ CLI ๋„๊ตฌ ์ด์šฉ

Migration

Sequelize๋Š” TypeORM๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ CLI๋ฅผ ์ง€์›ํ•˜๊ณ  ์žˆ๋‹ค. ๊ทธ๋ž˜์„œ ํ„ฐ๋ฏธ๋„์—์„œ ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ํ…Œ์ด๋ธ”์— ํ•ด๋‹นํ•˜๋Š” ๋ชจ๋ธ์˜ ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“œ๋Š”๊ฒŒ ๊ฐ€๋Šฅํ•˜๊ณ , ๊ตฌ์ฒด์ ์ธ ๋ชจ๋ธ์˜ ์„ค์ •์ด ๋๋‚˜๋ฉด MySQL์— Migrationํ•˜๋Š” ์ž‘์—…๋„ ๋ช…๋ น์–ด๋กœ ๊ฐ€๋Šฅํ•˜๋‹ค.

โšก ์ดˆ๊ธฐ ์„ธํŒ…

Sequelize Migration docs

1. sequelize ์„ค์น˜

npm install --save sequelize

2. sequelize-cli ์„ค์น˜

npm install --save-dev sequelize-cli

โšก ORM ์„ค์ •

3. ORM ์‚ฌ์šฉ์„ ์œ„ํ•ด bootstraping(ํ”„๋กœ์ ํŠธ ์ดˆ๊ธฐ ๋‹จ๊ณ„๋ฅผ ์ž๋™์œผ๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ์ผ)์„ ํ•ด์คŒ.

npx sequelize-cli init
=>> ์„ฑ๊ณต์ ์œผ๋กœ bootstraping์ด ๋๋‚˜๋ฉด ๋‹ค์Œ ํŒŒ์ผ๋“ค์ด ์ž๋™ ์ƒ์„ฑ๋œ๋‹ค.
config/config.json
models/
migrations/
seeders/

4. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ƒ์„ฑ

npx sequelize-cli db:create

5. cli์™€ db ์—ฐ๊ฒฐ

{
  "development": {
    "username": "root",
    "password": null,
    "database": "database_development",
    "host": "127.0.0.1",
    "dialect": "mysql"
  },
  "test": {
    "username": "root",
    "password": null,
    "database": "database_test",
    "host": "127.0.0.1",
    "dialect": "mysql"
  },
  "production": {
    "username": "root",
    "password": null,
    "database": "database_production",
    "host": "127.0.0.1",
    "dialect": "mysql"
  }
}

config/config.json ํŒŒ์ผ์—๋Š” 3๊ฐœ์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์กด์žฌํ•œ๋‹ค.

const env = process.env.NODE_ENV || 'development';

๋ณ€์ˆ˜ env๋Š” ๋‹ค๋ฅธ ๊ฐ’์ด ์ฃผ์–ด์ง€์ง€ ์•Š์œผ๋ฉด ๊ธฐ๋ณธ ๊ฐ’์œผ๋กœ 'development'๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, development ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์—ฐ๊ฒฐํ•˜๊ฒŒ ๋œ๋‹ค.
(test ์‹คํ–‰์‹œ์—๋Š” test db์™€ ์—ฐ๊ฒฐ)

โšก ๋ชจ๋ธ ์ƒ์„ฑ

๋ฐ์ดํ„ฐ ํƒ€์ž…

6. ๋ชจ๋ธ ์ƒ์„ฑ

< ์š”๊ตฌ์‚ฌํ•ญ >
1. url ๋ชจ๋ธ์˜ url, title, visits ํ•„๋“œ๋ฅผ ์•Œ๋งž์€ ํƒ€์ž…์— ๋งž๊ฒŒ ์ƒ์„ฑํ•ด์•ผ ํ•œ๋‹ค.
2. visits์˜ ๊ธฐ๋ณธ๊ฐ’์€ 0 ์ด๋‹ค.
3. urls ํ…Œ์ด๋ธ”์ด ์กด์žฌํ•ด์•ผ ํ•œ๋‹ค.

npx sequelize-cli model:generate --name url --attributes url:string,title:string,visits:integer

migrations, models ํด๋”์— ๊ฐ๊ฐ XXXXXXX-create-url.js, url.js ํŒŒ์ผ์ด ์ƒ์„ฑ๋œ๋‹ค.
์ด๋•Œ url ๋ชจ๋ธ์„ ์ƒ์„ฑํ–ˆ์ง€๋งŒ, ์ƒ์„ฑ๋˜๋Š” ํ…Œ์ด๋ธ”์€ urls ์ด๋ฆ„์œผ๋กœ ์ƒ์„ฑ๋œ๋‹ค.

์š”๊ตฌ์‚ฌํ•ญ์—์„œ visits์˜ ๊ธฐ๋ณธ๊ฐ’ ์„ค์ •์ด ํ•„์š”ํ•˜๋‹ค.
์ด ๊ฒฝ์šฐ migrations ํด๋”๊ฐ€ ์•„๋‹Œ, models ํด๋”์˜ url.js ์—์„œ ์ง์ ‘ ์ถ”๊ฐ€ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

url.init(
    {
      url: DataTypes.STRING,
      title: DataTypes.STRING,
      visits: { type: DataTypes.INTEGER, defaultValue: 0 },
    },
    {
      sequelize,
      modelName: 'url',
    }
  );

์ฆ‰, ํ•„๋“œ๊ฐ€ ๊ฐ€์ง€๋Š” ํŠน๋ณ„ํ•œ ์š”๊ตฌ์‚ฌํ•ญ(๊ธฐ๋ณธ๊ฐ’ ๋“ฑ)์€ ๋ชจ๋ธ ํŒŒ์ผ์„ ์ง์ ‘ ์ˆ˜์ •ํ•ด์„œ ์ •์˜ํ•ด์•ผ ํ•œ๋‹ค.

โšก ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์‹คํ–‰

๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์— ์žˆ๋Š” ํฌ๋ ˆ์ดํŠธ ํ…Œ์ด๋ธ”์„ ์‹คํ–‰ํ•œ๋‹ค. ์ด๊ฑธ ํ•˜๊ธฐ ์ „ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—๋Š” ์•„๋ฌด๊ฒƒ๋„ ์—†๋‹ค. ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ์‹คํ–‰์‹œ์ผœ์•ผ ์‹ค์ œ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ํ…Œ์ด๋ธ” ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ค์–ด๊ฐ€๋Š” ๊ฒƒ์ด๋‹ค. ์ด๋ฏธ ๋ชจ๋ธ ํŒŒ์ผ์ด ๋งŒ๋“ค์–ด์ ธ์žˆ๋‹ค๋ฉด running migration์„ ํ•ด์„œ ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค์™€ ์—ฐ๊ฒฐํ•ด์ค€๋‹ค

migrate ์‹คํ–‰ UpTable
npx sequelize-cli db:migrate

migrate ์ทจ์†Œ DropTable
npx sequelize-cli db:migrate:undo

โšก ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ vs ๋ชจ๋ธ


๐ŸŒˆ MVC ์ดํ•ด์™€ Controller ์ž‘์„ฑ

โšก


Association

join ํ•ด๋ณด๊ธฐ

Transaction

ACID

profile
start coding

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