๐Ÿ“‹ Prisma ๋ชจ๋ธ ์ •์˜: ์ฃผ์š” ํ‚ค์›Œ๋“œ ๋ฐ ๊ฐœ๋… ์„ค๋ช…

Jisunminยท2025๋…„ 6์›” 22์ผ
post-thumbnail

Prisma ๋ชจ๋ธ์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ”์„ ์˜๋ฏธํ•˜๋ฉฐ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํ•ต์‹ฌ ์—”ํ‹ฐํ‹ฐ๋ฅผ ํ‘œํ˜„ํ•ฉ๋‹ˆ๋‹ค.
๊ฐ ๋ชจ๋ธ์€ ์‹ค์ œ DB์˜ ํ…Œ์ด๋ธ”๋กœ ๋งคํ•‘๋˜๋ฉฐ, ๋ชจ๋ธ ์•ˆ์˜ ํ•„๋“œ๋Š” ํ…Œ์ด๋ธ”์˜ ์ปฌ๋Ÿผ์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค.
์˜ค๋Š˜์€ ์ด Prisma ๋ชจ๋ธ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ ๊ธฐ๋ณธ์ ์ธ ๊ตฌ์กฐ์™€ ๊ด€๊ณ„ ์„ค์ • ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

Prisma ๋ชจ๋ธ ์ฃผ์š” ์†์„ฑ ์ •๋ฆฌ

model User {
  id      Int      @id @default(autoincrement())
  email   String   @unique
  name    String?
  role    Role     @default(USER)
  posts   Post[]
  profile Profile?
}
  1. @id: ๊ธฐ๋ณธ ํ‚ค (Primary Key)
    id Int @id๋Š” ์ด ํ•„๋“œ๊ฐ€ ํ…Œ์ด๋ธ”์˜ ๊ธฐ๋ณธ ํ‚ค์ž„์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
    ๊ธฐ๋ณธ ํ‚ค๋Š” ํ…Œ์ด๋ธ” ๋‚ด์—์„œ ๊ฐ ๋ ˆ์ฝ”๋“œ๋ฅผ ๊ณ ์œ ํ•˜๊ฒŒ ์‹๋ณ„ํ•˜๋Š” ํ•„๋“œ์ž…๋‹ˆ๋‹ค.

  2. @default(autoincrement()): ๊ธฐ๋ณธ๊ฐ’ ๋ฐ ์ž๋™ ์ฆ๊ฐ€

    • @default: ๋ฐ์ดํ„ฐ๊ฐ€ ์ž…๋ ฅ๋˜์ง€ ์•Š์•˜์„ ๋•Œ ์ž๋™์œผ๋กœ ์ฑ„์›Œ์ง€๋Š” ๊ฐ’์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
    • autoincrement(): ๊ธฐ๋ณธ ํ‚ค์ธ id์— ์ž๋™ ์ฆ๊ฐ€ ๊ธฐ๋Šฅ์„ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค.
      ์ƒˆ ๋ ˆ์ฝ”๋“œ๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ๋งˆ๋‹ค 1์”ฉ ์ˆซ์ž๊ฐ€ ์ž๋™ ์ฆ๊ฐ€ํ•˜์—ฌ ๋ถ€์—ฌ๋ฉ๋‹ˆ๋‹ค.
      ์ฃผ๋กœ ์ •์ˆ˜ํ˜• ๊ธฐ๋ณธ ํ‚ค์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  3. @unique: ์œ ๋‹ˆํฌ ์ œ์•ฝ ์กฐ๊ฑด
    email String @unique๋Š” ํ•ด๋‹น ํ•„๋“œ๊ฐ€ ํ…Œ์ด๋ธ” ๋‚ด์—์„œ ์ค‘๋ณต๋  ์ˆ˜ ์—†๋Š” ๊ณ ์œ ํ•œ ๊ฐ’์ž„์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
    ์ค‘๋ณต๋œ ์ด๋ฉ”์ผ ๊ฐ’ ์ž…๋ ฅ์„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ๋ง‰์•„์ค๋‹ˆ๋‹ค.

  4. ? (Optional ํ•„๋“œ, ๋„ ๊ฐ€๋Šฅ)
    name String?์ฒ˜๋Ÿผ ํ•„๋“œ๋ช… ๋’ค์— ?๊ฐ€ ๋ถ™์œผ๋ฉด, ํ•ด๋‹น ํ•„๋“œ๋Š” ๊ฐ’์ด ์—†์–ด๋„ ๋จ(Null ํ—ˆ์šฉ)์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
    ๊ฐ’์ด ์—†์„ ๊ฒฝ์šฐ Prisma Client์—์„œ๋Š” null ํ˜น์€ undefined๋กœ ์ทจ๊ธ‰ํ•ฉ๋‹ˆ๋‹ค.

  5. @default(...) โ€” ๊ธฐ๋ณธ๊ฐ’ ์ง€์ •
    role Role @default(USER)๋Š” role ํ•„๋“œ์˜ ๊ธฐ๋ณธ๊ฐ’์ด USER์ž„์„ ๋œปํ•ฉ๋‹ˆ๋‹ค.
    ๋ ˆ์ฝ”๋“œ ์ƒ์„ฑ ์‹œ role ๊ฐ’์„ ์ฃผ์ง€ ์•Š์œผ๋ฉด ์ž๋™์œผ๋กœ USER๊ฐ€ ์ž…๋ ฅ๋ฉ๋‹ˆ๋‹ค.

  6. ๋ฐฐ์—ด ํƒ€์ž… Post[] โ€” 1:N ๊ด€๊ณ„ ํ‘œํ˜„
    posts Post[]๋Š” ํ•œ User๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ Post๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
    ๋ฐฐ์—ด ํ‘œ๊ธฐ([])๋Š” ์ผ๋Œ€๋‹ค(1:N) ๊ด€๊ณ„์—์„œ โ€˜๋‹คโ€™ ์ชฝ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.


  1. ๊ด€๊ณ„ ํ•„๋“œ์™€ @relation ์–ด๋…ธํ…Œ์ด์…˜
model Profile {
  id     Int    @id @default(autoincrement())
  bio    String
  user   User   @relation(fields: [userId], references: [id])
  userId Int    @unique
}
  • user User @relation(...)๋Š” Profile์ด User์™€ ๊ด€๊ณ„๊ฐ€ ์žˆ์Œ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
  • fields: [userId]๋Š” Profile ๋ชจ๋ธ ๋‚ด ์™ธ๋ž˜ํ‚ค ์—ญํ• ์„ ํ•˜๋Š” ํ•„๋“œ์ž…๋‹ˆ๋‹ค.
  • references: [id]๋Š” User ๋ชจ๋ธ์˜ ๊ธฐ๋ณธ ํ‚ค(id)๋ฅผ ์ฐธ์กฐํ•œ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.
  • userId Int @unique โ†’ Profile ํ•œ ๊ฐœ๋‹น User๊ฐ€ 1:1 ๋Œ€์‘๋จ(์œ ๋‹ˆํฌ ์ œ์•ฝ ๋•Œ๋ฌธ์—).

์ฆ‰, Profile์€ userId๋ฅผ ํ†ตํ•ด User๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ณ , User์™€ Profile์€ 1:1 ๊ด€๊ณ„์ž…๋‹ˆ๋‹ค.

  1. ์ž๋™ ๊ด€๋ฆฌ ํ•„๋“œ: @updatedAt
model Post {
  updatedAt  DateTime   @updatedAt
}
  • @updatedAt์€ ๋ ˆ์ฝ”๋“œ๊ฐ€ ์ˆ˜์ •๋  ๋•Œ๋งˆ๋‹ค ์ž๋™์œผ๋กœ ํ˜„์žฌ ์‹œ๊ฐ„์œผ๋กœ ์—…๋ฐ์ดํŠธ๋ฉ๋‹ˆ๋‹ค.
  • ์ฃผ๋กœ โ€˜์ˆ˜์ •์ผ์žโ€™ ํ•„๋“œ์— ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  1. ๋‚ ์งœ ๊ธฐ๋ณธ๊ฐ’: @default(now())
model Post {
  createdAt  DateTime   @default(now())
}
  • ์ƒˆ ๋ ˆ์ฝ”๋“œ๊ฐ€ ๋งŒ๋“ค์–ด์งˆ ๋•Œ ํ˜„์žฌ ์‹œ๊ฐ„์„ ์ž๋™์œผ๋กœ ๋„ฃ์Šต๋‹ˆ๋‹ค.
  • ๋ณดํ†ต ์ƒ์„ฑ์ผ์ž ํ•„๋“œ์— ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค..
  1. ๋‹ค๋Œ€๋‹ค ๊ด€๊ณ„: ๋ฐฐ์—ด๋กœ ํ‘œํ˜„
model Post {
  categories Category[]
}

model Category {
  posts Post[]
}
  • Post์™€ Category๊ฐ€ ๋‹ค๋Œ€๋‹ค ๊ด€๊ณ„์ž„์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
  • Prisma๊ฐ€ ๋‚ด๋ถ€์ ์œผ๋กœ ์ค‘๊ฐ„ ํ…Œ์ด๋ธ”(join table)์„ ์ž๋™ ์ƒ์„ฑํ•ด์„œ ์—ฐ๊ฒฐํ•ด์ค๋‹ˆ๋‹ค.
  1. Enum ํƒ€์ž…
enum Role {
  USER
  ADMIN
}
  • enum์€ ๋ฏธ๋ฆฌ ์ •์˜๋œ ๊ฐ’๋“ค์˜ ์ง‘ํ•ฉ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
    ์ด ๊ฐ’๋“ค๋งŒ ํ•ด๋‹น ํ•„๋“œ์— ์ž…๋ ฅํ•  ์ˆ˜ ์žˆ๋„๋ก ์ œํ•œํ•˜์—ฌ, ๋ฐ์ดํ„ฐ์˜ ์ผ๊ด€์„ฑ๊ณผ ์•ˆ์ •์„ฑ์„ ๋†’์ž…๋‹ˆ๋‹ค.
  • role Role @default(USER)์ฒ˜๋Ÿผ ํ•„๋“œ ํƒ€์ž…์œผ๋กœ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โœ… ์š”์•ฝ ์ •๋ฆฌ

ํ‚ค์›Œ๋“œ ๋ฐ ๋ฌธ๋ฒ•์˜๋ฏธ
@id๊ธฐ๋ณธ ํ‚ค ์ง€์ •
@default(autoincrement())์ž๋™ ์ฆ๊ฐ€ํ•˜๋Š” ์ˆซ์ž (์ฃผ๋กœ ๊ธฐ๋ณธ ํ‚ค์— ์‚ฌ์šฉ)
@unique์ค‘๋ณต ๋ถˆ๊ฐ€๋Šฅํ•œ ์œ ๋‹ˆํฌ ์ œ์•ฝ ์กฐ๊ฑด
?ํ•„๋“œ๊ฐ€ optional (null ๊ฐ€๋Šฅ)
@default(value)ํ•„๋“œ ๊ธฐ๋ณธ๊ฐ’ ์ง€์ •
[]๋ฐฐ์—ด ํƒ€์ž…, 1\:N ๋˜๋Š” ๋‹ค๋Œ€๋‹ค ๊ด€๊ณ„ ํ‘œํ˜„
@relation(fields: [...], references: [...])๊ด€๊ณ„ ์—ฐ๊ฒฐ ํ•„๋“œ์™€ ์ฐธ์กฐ ํ•„๋“œ ์ง€์ • (์™ธ๋ž˜ํ‚ค ์—ญํ• )
@updatedAt์ˆ˜์ •๋  ๋•Œ ์ž๋™์œผ๋กœ ํ˜„์žฌ ์‹œ๊ฐ์œผ๋กœ ๋ณ€๊ฒฝ
@default(now())์ƒ์„ฑ ์‹œ ํ˜„์žฌ ์‹œ๊ฐ„ ์ž๋™ ํ• ๋‹น
enum์ œํ•œ๋œ ๊ฐ’ ์ง‘ํ•ฉ์œผ๋กœ ํ•„๋“œ ํƒ€์ž… ์ง€์ •

์ฐธ๊ณ  - Prisma ๊ณต์‹ ๋ฌธ์„œ: Prisma Data Model - Models

profile
๋‹จ์ˆœ ์‚ฌ์šฉ์ž๊ฐ€ ์•„๋‹Œ, ์ดํ•ดํ•˜๊ณ  ๋งŒ๋“œ๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ๋˜๊ธฐ ์œ„ํ•œ ๊ธฐ๋ก.

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