Prisma Model, 넌 누구니 ?

윤익후·2020년 12월 11일
6

Prisma 부시기

목록 보기
3/3
post-thumbnail
post-custom-banner

안녕하세요. 개발자 윤익후 입니다! 🚀
오늘은 Prisma Schema의 대부분에 해당하는 Prisma Model에 대해 알아보도록 하겠습니다 !
model을 구성하고 있는 요소와, 1:1, n:n, n:m 관계에 대하여 천천히 알아봅니다.

❗ 아래의 이전 강좌를 먼저 보고오시는 것을 추천드립니다.
1. Prisma, 넌 누구니 ?
2. Prisma Schema, 넌 누구니?

📕Data model

🔎Data model이란?

Model을 구성하는 방법은 2가지가 있습니다.

Prisma Introspect를 이용하여 기존 Database에서 Model을 가져오기
Prisma migration을 이용하여 Prisma Schema로 직접 작성하기
(❗ Prisma migration은 실험기능입니다. 2.13.0 이전버전과 이후 버전은 호환되지 않습니다.)

📄model

Database의 테이블에 매핑되는 개념입니다.
Field (DB의 column과 동일)가 있고, FieldFiled Type (DB의 data_type과 동일),
제약조건 (unique, realation(1:n, n:m 관계)) 등이 있습니다.

📄model 이름 매핑

일반적으로 Database의 테이블 이름은 snake_case로 짓지만, prisma의 규칙은 PascalCase입니다.
이런 경우, @@map을 통해 model이름을 원하는 이름으로 매핑할 수 있습니다.

model user_profiles{
  //Fields
  @@map(name:"UserProfile")
}

🔎Field

Database의 column에 매핑되는 개념입니다.
총 6개의 scalar Type과, 사용자가 설정하는 관계필드(외래키)로 구성되어 있습니다.
단수 타입List Type (relation 한정)을 가지고 있습니다.
null을 허용하고 싶은경우 Type?을 사용합니다.(❗List Type은 null이 될 수 없습니다.)

📄Field 속성, 함수

Field 속성에서는 FieldDatabase상에서의 key, index등을 지정할 수 있습니다.
Field 함수에서는 자동증가, cuid, uuid 등의 기본 제공 함수를 사용할 수 있습니다.

🖋 @id, @@id

DatabasePRIMARY KEY에 매칭되는 속성입니다.
모든 Prisma Model은 @id 속성을 가진 필드가 존재해야합니다.
@id 속성을 가진 필드는 null이 허용될 수 없습니다.
@@id를 사용하면 다중 필드를 id로 설정할 수 있습니다.

🖋 @unique, @@unique

DatabaseUNIQUE에 매칭되는 속성입니다.
모든 Scalar Type에 정의 할 수 있지만, 관계 필드에 정의할 수 없습니다.
unique 제약조건이 설정된 filed는 자동으로 INDEX가 추가됩니다.
@@unique를 사용하면 복합 unique를 설정할 수 있습니다.
(❗@@unique를 설정하는 필드는 모두 null이 허용되지 않아야 합니다.)

🖋 @updatedAt

자동으로 update 된 시간을 저장합니다.

autoincrement() , cuid(), uuid(), now()

autoincrement()는 해당 필드를 자동으로 증가하는 값으로 설정합니다.
cuid()는 cuid 사양에 따라 고유한 식별자를 생성합니다.
uuid()는 uuid 사양에 따라 고유한 식별자를 생성합니다.
now()는 생성된 시간의 시간을 기록합니다.

📄Scalar Field

String Boolean Int Float DateTime JSON 의 6개 필드로 구성되어 있습니다.
각각의 필드는 기본적으로 prisma에서 지정한 DB에서의 자료형으로 구성되어 있습니다.

Native Type을 사용하고 싶은 경우, nativeTypes (❗현재 Preview 기능입니다)을 사용할 수 있습니다.

📄Relation Field

속성의 @relation을 이용하여 관계를 맺을 수 있습니다.

🖋 @relation

DatabaseFOREIGN KEY/REFERENCES에 매칭되는 속성입니다.
model상 외래키로 설정 할 필드와, 다른 모델의 PRIMARY KEY를 인수로 가집니다.

@relation(fields: [], references: [])

예제와 설명

model User {
  id      Int      @id @default(autoincrement()) ◀️ 값이 자동으로 증가하는 id 필드입니다.
  email   String   @unique ◀️ email은 고유한 값입니다.
  name    String? ◀️ name은 null이 허용됩니다.
  role    Role     @default(USER)  ◀️ 열거형입니다. 기본값은 USER입니다.
  posts   Post[] ◀️ 해당 유저가 작성한 Post 필드입니다. (user:post는 1:n관계입니다.)
  profile Profile? ◀️ profile은 관계필드입니다. null이 허용됩니다. (user:profiled은 1:1관계입니다.)
}
model Profile {
  id      Int     @id @default(autoincrement())
  bio     String
  user    User    @relation(fields: [userId], references: [id]) ◀️ profile에 연결된 user입니다.
  userId  Int 외래키 ◀️(userId)입니다.
}
model Post {
  id         Int         @id @default(autoincrement())
  createdAt  DateTime    @default(now()) ◀️ 현재 시간이 기본값으로 설정됩니다.
  title      String
  published  Boolean     @default(false)
  author     User        @relation(fields: [authorId], references: [id])
  authorId   Int
  categories Category[]  @relation(references: [id])
}
model Category {
  id    Int     @id @default(autoincrement())
  name  String
  posts Post[]  @relation(references: [id])
}
enum Role {
  USER
  ADMIN
}

📕마무리하며

오늘은 Prisma Model의 구성과, 예제 Database를 분석해 보며 Prisma Model에 대하여 알아보았습니다.
다음 포스트에서는 Prisma를 Node.js 환경에서 사용하는 법에 대하여 알아보겠습니다.

post-custom-banner

2개의 댓글

comment-user-thumbnail
2022년 10월 14일

안녕하세요. 제가 모델 설계를 하다가 궁금한게 있어서 찾아보다가 글 작성한걸 봤습니다. 지금 profile Profile? 이렇게 해주셧고 model Profile 에서 userId Int 라고 해주셧는데 제가 이 부분을 userId Int하니깐 에러가 발생하더라구요? 그래서 @unique 해주니깐 에러가 안 떳어요. 이거 혹시 왜 그런지 알 수 있을까요?

답글 달기
comment-user-thumbnail
2022년 11월 7일

erd tool이 뭔지 알 수 있을까요?

답글 달기