안녕하세요. 개발자 윤익후 입니다! 🚀
오늘은 Prisma Schema의 대부분에 해당하는 Prisma Model에 대해 알아보도록 하겠습니다 !
model을 구성하고 있는 요소와, 1:1, n:n, n:m 관계에 대하여 천천히 알아봅니다.
❗ 아래의 이전 강좌를 먼저 보고오시는 것을 추천드립니다.
1. Prisma, 넌 누구니 ?
2. Prisma Schema, 넌 누구니?
Model을 구성하는 방법은 2가지가 있습니다.
Prisma Introspect
를 이용하여 기존 Database에서 Model을 가져오기
Prisma migration
을 이용하여 Prisma Schema로 직접 작성하기
(❗ Prisma migration은 실험기능입니다. 2.13.0 이전버전과 이후 버전은 호환되지 않습니다.)
Database의 테이블에 매핑되는 개념입니다.
Field (DB의 column과 동일)가 있고, Field는 Filed Type (DB의 data_type과 동일),
제약조건 (unique, realation(1:n, n:m 관계)) 등이 있습니다.
일반적으로 Database의 테이블 이름은 snake_case로 짓지만, prisma의 규칙은 PascalCase입니다.
이런 경우, @@map을 통해 model이름을 원하는 이름으로 매핑할 수 있습니다.
model user_profiles{ //Fields @@map(name:"UserProfile") }
Database의 column에 매핑되는 개념입니다.
총 6개의 scalar Type과, 사용자가 설정하는 관계필드(외래키)로 구성되어 있습니다.
단수 타입과 List Type (relation 한정)을 가지고 있습니다.
null을 허용하고 싶은경우 Type?을 사용합니다.(❗List Type은 null이 될 수 없습니다.)
Field 속성에서는 Field가 Database상에서의 key, index등을 지정할 수 있습니다.
Field 함수에서는 자동증가, cuid, uuid 등의 기본 제공 함수를 사용할 수 있습니다.
Database상 PRIMARY KEY에 매칭되는 속성입니다.
모든 Prisma Model은 @id 속성을 가진 필드가 존재해야합니다.
@id 속성을 가진 필드는 null이 허용될 수 없습니다.
@@id를 사용하면 다중 필드를 id로 설정할 수 있습니다.
Database상 UNIQUE에 매칭되는 속성입니다.
모든 Scalar Type에 정의 할 수 있지만, 관계 필드에 정의할 수 없습니다.
unique 제약조건이 설정된 filed는 자동으로 INDEX가 추가됩니다.
@@unique를 사용하면 복합 unique를 설정할 수 있습니다.
(❗@@unique를 설정하는 필드는 모두 null이 허용되지 않아야 합니다.)
자동으로 update 된 시간을 저장합니다.
autoincrement()는 해당 필드를 자동으로 증가하는 값으로 설정합니다.
cuid()는 cuid 사양에 따라 고유한 식별자를 생성합니다.
uuid()는 uuid 사양에 따라 고유한 식별자를 생성합니다.
now()는 생성된 시간의 시간을 기록합니다.
String
Boolean
Int
Float
DateTime
JSON
의 6개 필드로 구성되어 있습니다.
각각의 필드는 기본적으로 prisma에서 지정한 DB에서의 자료형으로 구성되어 있습니다.
Native Type을 사용하고 싶은 경우, nativeTypes (❗현재 Preview 기능입니다)을 사용할 수 있습니다.
속성의 @relation을 이용하여 관계를 맺을 수 있습니다.
Database상 FOREIGN 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 환경에서 사용하는 법에 대하여 알아보겠습니다.
안녕하세요. 제가 모델 설계를 하다가 궁금한게 있어서 찾아보다가 글 작성한걸 봤습니다. 지금 profile Profile? 이렇게 해주셧고 model Profile 에서 userId Int 라고 해주셧는데 제가 이 부분을 userId Int하니깐 에러가 발생하더라구요? 그래서 @unique 해주니깐 에러가 안 떳어요. 이거 혹시 왜 그런지 알 수 있을까요?