데이터베이스

Prisma

realtrynna 2022. 10. 13. 15:38

 

Prisma

ORM(Object Relational Mapping)이다. 자바스크립트에 Sequelize가 있다면 타입스크립트에 Prisma와 TypeORM이 존재한다. 타입스크립트와 친화적이며 여러 DBMS를 지원한다. 다른 ORM 과는 근본적으로 다르다고 공식 문서에 나와있다. 기존 ORM은 객체 지향 방식으로 테이블을 매핑한다고 하지만 Prisma는 선언적인 모델을 정의해 복잡한 모델 인스턴스를 효율적으로 관리할 수 있다. 

 

 

사용 이유

Sequelize를 사용해 봐서 그런지 러닝 커브가 높지 않았다. 로우 쿼리 사용으로 인해 발생하는 단점을 커버해 줄뿐더러 모델 간 관계 설정 시 Sequelize보다 훨씬 직관적이었으며 마이그레션이 매우 편하고 코드의 양 또한 더 적은 거 같다. 이로 인해 왜 생산성이 향상될 수밖에 없는지 알 수 있었다.

 

1. Raw Query의 문제

원시 쿼리는 가독성도 좋지 않고 많은 오버헤드가 발생되어 생산성이 저하된다. 또한 쿼리 결과에 대한 타입 안정성도 얻을 수 없다.

 

2. 기존 ORM의 문제

원시 쿼리가 가지는 대부분의 문제들을 개선하였지만 쉽게 모델을 추상화하여 관계형 데이터가 객체에 쉽게 매핑될 수 있다는 올바르지 않은 가정에 기반을 두고 있어 복잡성과 함정이 발생할 수 있다.

 

구성

Prisma를 database와 연동시키기 위해 2가지 명령어가 존재한다.

1. Introspection

현재 데이터베이스의 스키마를 반영해 Prisma Shema의 model로 채우는 방식이다.

  • 데이터베이스 테이블을 Prisma model로 매핑
  • 데이터베이스의 필드를 Prisma model의 필드로 매핑
  • 데이터베이스의 인덱스를 Prisma Schema의 index로 매핑
  • 데이터베이스 제약 조건을 Prisma Schema로 매핑

 

2. Migration

Introspection 과는 반대로 Prisma Schema를 반영해 데이터베이스의 스키마를 채우는 방식이다.

 

 

Schema

Schema는 Prisma와 데이터베이스 매핑 시 필요한 정보들을 담고 있는 설정 파일이다. 데이터베이스의 접속 정보(host, password 등)가 포함되며 연결된 데이터베이스의 테이블 컬럼 등이 명세되며 PSL(Prisma Schema Language) 언어로 작성된다.

datasource db {
    provider = "mysql"
    url      = env("DATABASE_URL")
}

generator client {
    provider = "prisma-client-js"
}

model User {
    id          Int    @id @default(autoincrement())
    email       String @unique(map: "email_UNIQUE") @db.VarChar(255)
    password    String @db.VarChar(255)
}

 

1-1. datasource

매핑할 데이터베이스의 접속 정보를 작성한다. provider에 DBMS의 종류를 넣고 url에 호스트 정보를 넣는다. Prisma를 init 하게 되면 .env 파일이 생성되는데 DATABASE_URL 작성 예시는 다음과 같다.

// .env
DATABASE_URL="mysql://root:password@localhost:3306/database?schema=public"

 

1-2. generator

client를 생성하는 블록이다. 개발자가 사용할 model을 객체로 만들어주며 이 객체를 활용해 CRUD 작업을 수행한다. provider는 client를 생성할 모듈을 정의하며 "prisma-client-js"는 prisma에서 제공하는 기본 내장 모듈이다. init 시 자동으로 작성해 주므로 별도로 작성할 필요는 없다.

 

1-3. model 

데이터베이스의 테이블을 모델링 한 블록이다. model의 이름은 테이블의 이름과 동일하게 작명하며 각 필드의 이름은 테이블의 컬럼 이름과 동일하다. 컬럼별로 데이터 타입 옵션(Attributes)들을 명시한다.

 

데이터 타입 

Prisma Type Description
String Variable length text
Boolean True of false value
Int integer value
Float Floating point number
DateTime Timestamp
Json A JSON object

 

옵션(Attributes)

Name Database Representation Description
@id PRIMARY KEY 기본키
@@id PRIMARY KEY 복합키
@default DEFAULT 기본값
@unique UNIQUE 유니크키
@@unique UNIQUE 멀티키
@@index INDEX 인덱스키
@relation FOREIGN KEY /REFERENCES 외래키
@map n/a 실제 컬럼과다른 이름으로 매핑
@@map n/a 실제 테이블과다른 이름으로 매핑

 

enum

PSL(Prisma Schema Language)은 열거형을 지원한다.

enum Gender {
    male
    female
}

model User {
    id          Int    @id @default(autoincrement())
    gender      Gender
}

 

Prisma Migrate

설치

npm i prisma dotenv -D
npm i @prisma/clinet
npx prisma init

 

prisma init 후 루트 경로 내에 다음과 같은 파일이 생성된다.

prisma > schema.prisma 
.env

 

schema.prisma 파일 작성

generator client {
    provider = "prisma-client-js"
}

datasource db {
    provider = "mysql"
    url      = env("DATABASE_URL")
}

model User {
    id          Int    @id @default(autoincrement())
    email       String @unique(map: "email_UNIQUE") @db.VarChar(255)
    password    String @db.VarChar(255)
}

 

.env 파일 작성

DATABASE_URL="mysql://root:password@localhost:3306/yourdatabase?schema=public"

 

다음과 같은 migrate 명령어를 통해 schema.prisma 파일에 정의한 모델을 바탕으로 실제 데이터베이스의 테이블이 생성된다.

npx prisma migrate dev --name create_user
- prisma/                             
 └─migrations/
   └─ 20221026141909_create_user/
     └─ migration.sql

 

Prisma Client

실제 데이터베이스 테이블 내에 접근하기 위해 @prisma/client를 사용한다. migrate 후 다음 명령어를 입력한다. 이 명령어를 통해 node_modules 폴더 내부에 @prisma/clinet 파일이 생성된다.

 

npx prisma generate

 

> Prisma Schema에 변경 사항이 있어 코드를 업데이트해야 한다면 명령어를 다시 실행해야 한다.

 

PrismaClient를 임포트 하여 새로운 인스턴스를 선언 후 데이터베이스 테이블(model)에 접근할 수 있다. 모델에 사용할 수 있는 메서드는 매우 많으니 공식 문서를 참고하면 된다.

 

명령어

Command Description
npx prisma migrate dev 적용되지 않은 최근 마이그레이션 파일 적용(없으면 새로 생성)
npx prisma migrate dev --name 파일이름 --create-only 마이그레이션 파일 생성
npx prisma migrate reset 데이터베이스 재설정(초기화)
npx prisma db pull 데이터베이스 수정 사항 반영 후 저장
npx prisma db push 데이터 유지하면서 Schema 파일 수정 반영

 

참고 자료

https://www.prisma.io/docs/concepts/components/prisma-schema

https://medium.com/@olafdev/prisma-schema-%ED%8E%B8-2401c9609ae2

https://codingmoonkwa.tistory.com/291

'데이터베이스' 카테고리의 다른 글

MySQL 옵티마이저  (0) 2022.11.01
Prisma Relation  (0) 2022.10.17
DBMS  (0) 2022.10.03
MySQL 자료형 옵션  (0) 2022.05.08
DBMS RDBMS Transaction  (0) 2022.05.08