Session 20. ORM & Prisma

๊น€๋ฏผ์žฌยท2021๋…„ 9์›” 16์ผ
0

TIL, WeCode, Courseย 

๋ชฉ๋ก ๋ณด๊ธฐ
38/48
post-thumbnail

*๐Ÿ”Study Keyword :

โœ…ORM์ด ๋ฌด์—‡์ด๋ฉฐ ORM ์ค‘ ํ•˜๋‚˜์ธ ๐Ÿ”‘Prisma๋ฅผ ์‚ฌ์šฉํ•ด์„œ MySQL๊ณผ express์„œ๋ฒ„๋ฅผ ์—ฐ๊ฒฐํ•ด๋ณด๋ฉฐ 1> ORM ํด๋ž˜์Šค์™€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ” ์‚ฌ์ด์˜ ๋งค์นญ ๊ด€๊ณ„๋ฅผ ์ดํ•ดํ•˜๊ณ 
2> Prisma migration์„ ํ™œ์šฉํ•ด ์ฝ”๋“œ๋กœ ์ž‘์„ฑํ•œ ๋ชจ๋ธ์„ ํ…Œ์ด๋ธ”๋กœ ๋ณ€ํ™˜ํ•ด๋ณด๋Š” ๊ณผ์ •์„ ์ดํ•ดํ•˜์ž.

  • ์„œ๋ฒ„๊ฐ€ ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค์—์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ”๋กœ ๋ณด๋‚ด์ฃผ์ง€ ๋ชปํ•˜๊ธฐ๊ธฐ์— ์ต์Šคํ”„๋ ˆ์Šค ์„œ๋ฒ„์—์„œ ๊ฐ€๊ณต์„ ๊ฑฐ์ณ์„œ ๋ณด๋‚ธ๋‹ค.
    => ๋”ฐ๋ผ์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์„œ๋ฒ„๋Š” ๋…๋ฆฝ์ ์ธ ๊ด€๊ณ„์ด๋‹ค.
    ์ด๋–„, ์ด ๋‘˜์„ ์—ฐ๊ฒฐํ•ด์ฃผ๋Š” ๋ฌผ๋ฆฌ์ ์ธ ๋งค๊ฐœ์ฒด๊ฐ€ ํ”„๋ฆฌ์ฆˆ๋งˆ์ด๋‹ค.

- ๏ผฏ๏ผฒ๏ผญ

-WHAT ISโ“

<script>
const dongsan = new Pet('๋™์‚ฐ์ด', '์œ ๊ฐœ๋ฐœ', 12)
console.log(dongsan.name) // '๋™์‚ฐ์ด'
console.log(dongsan.owner) // '์œ ๊ฐœ๋ฐœ'
console.log(dongsan.age) // 12
</script>
  • ORM(Object Relational Mapping)์ด๋ž€ ๋ฐ์ดํ„ฐ ํ•˜๋‚˜ํ•˜๋‚˜๋ฅผ ๊ฐ์ฒด์ฒ˜๋Ÿผ ์ด์šฉํ•˜๋Š” ๊ฐœ๋…์„ ๋งํ•œ๋‹ค.
  • ๋งˆ์น˜ User ํด๋ž˜์Šค์— name, age, user_id๋ผ๋Š” ์†์„ฑ์ด ์žˆ๊ณ  ์†์„ฑ์— ๋”ฐ๋ฅธ ๊ฐ’์ด ์žˆ๋‹ค๋ฉด
    1> ํ…Œ์ด๋ธ” ํ•˜๋‚˜๊ฐ€ ํด๋ž˜์Šค 2> ์ปฌ๋Ÿผ์€ ์†์„ฑ์ด๋ฉฐ 3> ํ…Œ์ด๋ธ”์˜ ๋ฐ์ดํ„ฐ์˜ ํ•œ์ค„์€ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค์ฒ˜๋Ÿผ ํ™œ์šฉ๋œ๋‹ค.
  • ์ด๋ ‡๊ฒŒ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ํ…Œ์ด๋ธ”๊ณผ ์ปฌ๋Ÿผ, ๊ทธ๋ฆฌ๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ํด๋ž˜์Šค์˜ ํŠน์„ฑ๊ณผ ์—ฐ๊ด€์ง€์–ด ์‚ฌ๊ณ ํ•˜๋Š” ํŒจ๋Ÿฌ๋‹ค์ž„์„ ORM์ด๋ผ๊ณ ํ•œ๋‹ค.

- 2. migration

  • migration์€ ์ฝ”๋“œ๋กœ ์ž‘์„ฑํ•œ ํด๋ž˜์Šค๋ฅผ ์‹ค์ œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ํ…Œ์ด๋ธ”๋กœ ์˜ฎ๊ธฐ๋Š” ๊ณผ์ •์œผ๋กœ ์ฆ‰, prisma์—์„œ ์ž‘์„ฑํ•œ model(ํด๋ž˜์Šค)์„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฌธ๋ฒ•์œผ๋กœ ๋ณ€ํ™˜ํ•ด์ฃผ๋Š” ๋ช…๋ น์–ด์ด๋‹ค.
  • ORM์€ migrate๋ฅผ ํ•˜๊ฒŒ๋˜๋ฉด migration ํŒŒ์ผ์ด ์ƒ๊ฒจ ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค์— ์ ์šฉ๋˜๊ณ  ORM์—์„œ ๋ฐ์ดํ„ฐ๋ฒ ์Šค์˜ ๊ตฌ์กฐ๋ฅผ migration file์—์„œ ๊ด€๋ฆฌํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๋ณ€๊ฒฝ๋œ ๊ณผ์ •์„ ์‚ดํŽด ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
  • migration์„ ํ–ˆ๋‹ค๋Š” ๊ฑด model์— ์žˆ๋Š” skima ํŒŒ์ผ์„ ๋ชจ๋‘ SQL๋กœ ๋ณ€ํ™˜ํ•œ ๋’ค SQL์„ ๋‹ค์‹œ Datebase๋กœ ์ ์šฉํ•˜๋Š” ๊ณผ์ •์„ ์˜๋ฏธํ•œ๋‹ค.๋ชจ๋ธ > ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ > ๋ฐ์ดํƒ€๋ฒ ์ด์Šค

2_1> migration๊ณผ์ •

  1. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋งŒ๋“ค๊ธฐ
  2. ๋ชจ๋ธ ๋‚ด๋ถ€์— ์ปฌ๋Ÿผ์— @map์„ ์”€์œผ๋กœ์„œ ("categories")์™€ ๊ฐ™์ด mysql์—์„œ ์„ค์ •ํ•œ ์ปฌ๋Ÿผ๊ณผ ๋™์ผํ•˜๊ฒŒ ๋งตํ•‘ ํ•ด์ค˜์•ผํ•œ๋‹ค.
  • prisma์˜ model์˜ ์ปจ๋ฒค์…˜์„ mysql์— ๋งž๊ฒŒ ๋ณ€ํ™˜ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ปฌ๋Ÿผ๋“ค์„ @@map ํ•ด์ค€๋‹ค.
  1. ๋ชจ๋ธ ์ƒ์„ฑ ํ›„ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ํ•ด์ฃผ๊ธฐ
    npx prisam migrate dev --name ๋‚ด์šฉ
  • ๋‚ด์šฉ์—๋Š” ๋ณ€๊ฒฝ๋œ ๋‚ด์šฉ์„ ๋ช…์‹œ์ ์œผ๋กœ ์ ์–ด์ค€๋‹ค.
    ์ปค๋ฐ‹ ๋ฉ”์„ธ์ง€ ๋‚จ๊ธฐ๋“ฏ, ์–ด๋–ค ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ๋‚จ๊ธฐ๋Š” ์ง€์— ๋Œ€ํ•ด์„œ ์ ์–ด์ค€๋‹ค.

2_2> Model > Migration > Database

  • ์‹ค์ œ๋กœ ์ด ๊ณผ์ •์€ ๋‘ ๊ฐ€์ง€ Model > Migration์™€ Migration > Database๋กœ ๋‚˜๋ˆ ์ง„๋‹ค.
    npx prisma migrate dev --create-only
  • Model > Migration ๊ณผ์ •๋งŒ ๋‹ด์€ ๋ช…๋ น์–ด๋กœ DB์— ์ ์šฉํ•˜๊ธฐ ์ „ Model์—์„œ ์ˆ˜์ •๋œ Migration ํŒŒ์ผ ๋งŒ์„ ์ ์šฉํ•˜๊ณ ์ž ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

3_1> Prisma

Prisma ์„ค์น˜ ๊ณผ์ •

1> Prisam๋Š” npm ์„ ์ด์šฉํ•ด ์„ค์น˜

  • ์›ํ•˜๋Š” ์œ„์น˜์— ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  mysql์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์•„๋ž˜ ๋‘ ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•œ๋‹ค.
npm install prisma --save-dev
npm install @prisma/client --save

2> ๋‘๊ฐ€์ง€ ํŒจํ‚ค์ง€, nodemon๊ณผ dotenv ์„ค์น˜ํ•˜๊ธฐ

  • nodemon : ์ฝ”๋“œ๊ฐ€ ๋ณ€๊ฒฝ ๋œ ์ดํ›„, ์„œ๋ฒ„๋ฅผ ์žฌ์‹คํ–‰ํ•˜์ง€ ์•Š์•„๋„ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์„œ๋ฒ„์— ์ ์šฉ๋˜๋„๋ก ํ•˜๋Š” ํŒจํ‚ค์ง€
  • dotenv : ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ํŒจํ‚ค์ง€
npm install dotenv nodemon -D

3> ํ”„๋ฆฌ์ฆˆ๋งˆ ์‹œ์ž‘ ๋ฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์—ฐ๊ฒฐํ•˜๊ธฐ

3_1>

npx prisma // ๋ช…๋ น์–ด ํ™•์ธ
npx prisma init // prisma ์ดˆ๊ธฐ ์„ธํŒ…

3_2>

  • prisma/schema.prisma
datasource db {
  provider = "mysql"
  url      = env("DATABASE_URL")
}

3_3> - ๋…ธ์ถœํ•˜์ง€ ์•Š๊ธฐ ์œ„ํ•ด์„œ .env์—์„œ ์ˆจ๊ฒจ์ค€๋‹ค.

  • .env
DATABASE_URL = "mysql://USERNAME:PASSWORD@localhost:3306/DATABASE_NAME"
  • ์ด์ฒ˜๋Ÿผ prisma๋ฅผ ํ†ตํ•ด์„œ express๊ฐ€ Database(mysql)์— ์ ‘๊ทผํ•˜๋ ค๋ฉด Database์™€ prisma๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ์„ค์ •์„ ํ•ด์ค˜์•ผ prisma๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

3_2> Prisma ๋ชจ๋ธ ์ƒ์„ฑ

<prisma>
model comments {
  id         Int       @id @default(autoincrement())
  user_id    Int
  created_at DateTime? @default(now())
  updated_at DateTime?
  deleted_at DateTime?
  articles   articles  @relation(fields: [article_id], references: [id])
  users      users     @relation(fields: [user_id], references: [id])
  @@index([user_id], name: "user_id")
}
</prisma>

prisma์—์„œ pk & fk ๊ด€๊ณ„ ์„ค์ •ํ•˜๊ธฐ

  • @relation(filed: [author] reference:)
    drink๊ฐ€ categorty๋ฅผ ๋ ˆํผ๋Ÿฐ์Šค๋กœ ์‚ผ๋“ฏ์ด
    id ์†์„ฑ์„ ๋ถ™์—ฌ๋†“๋ฉด ์ž๋™์œผ๋กœ ํ”„๋ผ์ด๋จธ๋ฆฌ ํ‚ค๊ฐ€๋œ๋‹ค.
  • ?๋ฅผ ํƒ€์ž… ์•ž์— ๋ถ™์ด๋ฉด ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ค์–ด์˜ฌ ๋•Œ ํ…Œ์ดํ„ฐ ํƒ€์ž…์— ์žˆ์–ด์„œ nullabel์„ ๋งŒ๋“ค์–ด์ค€๋‹ค.

*๐Ÿ’กconclusion

  • ํ”„๋ฆฌ์ฆˆ๋งˆ์—์„œ ๋ชจ๋ธ์„ ๋งŒ๋“ค ๋•Œ ํ…Œ์ด๋ธ”์ด ์ƒ์„ฑ๋œ๋‹ค๋Š” ๊ฒƒ์„ ๋จธ๋ฆฌ์†์œผ๋กœ ๊ทธ๋ฆฌ๊ณ  ์žˆ์–ด์•ผํ•œ๋‹ค.
  • ํ”„๋ฆฌ์ฆˆ๋งˆ์˜ ์ปจ๋ฒค์…˜์€ ๋ชจ๋ธ ์ด๋ฆ„์„ ํด๋ž˜์Šค์ฒ˜๋Ÿผ ๋Œ€๋ฌธ์ž๋กœ ์‹œ์ž‘ํ•˜๊ณ  mysql ์Šค๋„ค์ดํฌ ์ผ€์ด์Šค์˜ ๋ณต์ˆ˜ํ˜• ํ‘œํ˜„๊ณผ ์†Œ๋ฌธ์ž๋ฅผ ๋งž์ถ”๊ธฐ ์œ„ํ•ด์„œ map ํ•ด์ค€๋‹ค.

#๐Ÿ“‘Study Source

  • ์œ„์ฝ”๋“œ์˜ orm๊ณผ prisma์— ๋Œ€ํ•œ ์†Œํ—Œ๋‹˜ ํŒŒ์ดํŒ… ๋„˜์น˜๋Š” ๊ฐ•์˜ ์ค‘ :]
profile
์ž๊ธฐ ์‹ ๋ขฐ์˜ ํž˜์„ ๋ฏฟ๊ณ  ์‹ค์ฒœํ•˜๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ๋˜๊ณ ์žํ•ฉ๋‹ˆ๋‹ค.

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

comment-user-thumbnail
2021๋…„ 9์›” 16์ผ

์˜ค์šฐ ใ…‹ใ…‹ ๊ณต๋ถ€ํ•˜๋‹ค ์“ฐ์…จ๊ตฐ์š” ๋ฏผ์žฌ๋‹˜!
Prisam ์•„๋‹ˆ๊ตฌ Prisma ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹

1๊ฐœ์˜ ๋‹ต๊ธ€