ORM/Prisma

Prisma 를 사용하는 이유

강승원 2024. 1. 17. 18:18

필자가 2023년 7월부터 함께 하게 된 회사에서는 주요 ORM으로 Prisma를 사용했다. 당시에 난생 처음 본 Prisma라는 ORM이 생소하게 느껴졌지만 요즘은 정말 편하게 사용하고 있다. 반년 가까이 nest.js와 함께 사용해보면서 편리했던 점을 끄적이도록 하겠다. 


Prisma 란?

Node.js , TypeScript의 차세대 오픈소스 ORM이라고 소개하고 있다. Sequelize와 TypeORM과 함께 Node진영의 ORM이고, 타 ORM이 겪는 많은 문제들을 겪지 않는다는다고 Docs에 명시가 되어 있다. 

  • Prisma Client: Node.js 와 Typescript를 위한 쿼리 빌더(자동생성, 타입 안정성)
  • Prisma Migrate: 마이그레이션 시스템
  • Prisma Studio: 데이터베이스의 데이터를 보고 수정할 수 있는 GUI툴

위 세 가지 기능을 제공한다고 한다. 이 기능들을 중점적으로 필자가 겪었던 경험을 적어보겠다.

 

Prisma Client 

1.  Scheme파일의 편리성

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

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

model Post {
  id        Int     @id @default(autoincrement())
  title     String
  content   String?
  published Boolean @default(false)
  author    User?   @relation(fields: [authorId], references: [id])
  authorId  Int?
}

model User {
  id    Int     @id @default(autoincrement())
  email String  @unique
  name  String?
  posts Post[]
}

이 예제는 공식 문서의 예제다. 직관적으로 봤을 때 굉장히 편하지 않는가?

datasource
- 어떤 Provider(database종류, ex)postgresql, mysql .. )인지를 명시하고 url ("postgresql://{user}:{password}@{db_url}:{port}/{db_name}")을 명시 이 과정만으로 db에 연결 가능
generator 

어떤 쿼리 빌더를 사용할 것인가를 명시하는 부분인데 저 부분은 거의 바꿔본적이 없다.prisma를 사용하면 prisma client를 사용해야지

model

이 모델을 명시하는 부분부터 프로젝트에서 사용할 테이블을 정의하는 부분이다. 객체 만들 듯이 정의 할 수 있고 

name String?에서 ? 는 옵셔널을 뜻하며 빈 값 허용하는 것을 간단한 문법을 통해 지정할 수 있다.  테이블의 PK인 id값을 지정하는 것도 숫자가 증가하는 autoincrement()로 할 것인지 uuid()로 할 것인지 편하게 구현 가능하다. 대신 uuid로 할 때는 string으로 타입을 지정해야 한다. 

formatter

node, js, ts 를 하는 개발자 특이 포매팅을 굉장히 중요하게 여긴다는 것인데, prisma도 그런 수요에 걸맞게 format 커맨드를 제공해준다.

npx prisma format

그리고 포린키가 연결되어 있으면 자동으로 posts Post[]와 같은 역참조 리스트도 생성해준다.

 

2. 직관적이고 다양한 쿼리  제공

이전에는 백엔드를 장고만 사용했기 때문에 django ORM의 쿼리에 익숙해진 상태였다. 하지만 django ORM의 쿼리 문법은 node문법과는 잘 맞지 않는 느낌인데, prisma에서의 쿼리는 node의 차세대 ORM답게 자바스크립트 문법 친화적이다.  그리고 굉장히 다양한 메소드를 제공해주는데, createMany, deleteMany 라든가 그 안에서 where, select 등등, nest.js에서 사용할때 타입 지정시 dto를 만들지 않아도 인풋타입이나 데이터타입 등등을 편하게 제공해준다.

 

Prisma Migrate

1. 마이그레이션 파일 접근

어떤 ORM이든 가끔씩을 마이그레이션 파일에 접근해서 수정해야할 경우가 생긴다. prisma는 마이그레이션 시 sql파일이 생기는데, 진짜 sql문으로만 되어 있기 때문에(가끔 다른 orm은 이상한 문법이 섞여있다.) 수정하기 쉽다. 

 

2. 개발용 배포용 마이그레이션 분리

prisma는 개발자의 생산성에 대해서 고민을 많이 했구나라고 생각한 부분이 이부분이다 사실 필자가 많은 ORM을 다 알고 있는 것은 아니지만 migrate 명령어 자체가 배포용과 개발용이 나눠져 있다는 것이 참 편하다고 생각했다.

// migrate dev는 generate를 해줌
npx prisma migrate dev

//migrate dev는 generate를 해줘야함
npx prisma migrate deploy
npx prisma generate

여기서 generate 명령어는 prisma client을 다시 생성해주는 명령어이다.

 

하지만 주의할 점이 migrage dev는 특정 경우(null값이 아닌 필드 추가 및 삭제, 필드 명 변경 등등..) 디비의 데이터를 다 날려버리겠다는 경고문을 준다. 이럴 경우 1번 예시 처럼 sql를 직접 고쳐줘야 한다.

 

Prisma studio

사실 prisma를 사용하는 이유가 이 스튜디오 때문은 아닐까 생각한다. 장고의 큰 장점 중에 하나가 어드민 패널을 제공하는 듯이 이 스튜디오는 디비에 있는 데이터의 모든걸 볼 수 있고 수정도 할 수 있다. 진짜 이것 덕분에 따로 dbeaver같은걸 세팅할 필요도 없고

npx prisma studio

 

이거 하나로 데이터 crud가 잘 되는지 매핑이 잘되었는지 확인할 수 있다.

 

 

prisma 공식문서에서  

Prisma의 주요 목표는 데이터베이스 작업 시 애플리케이션 개발자의 생산성을 높이는 것입니다.

라고 적혀있고 왜 프리즈마를 사용해야하는지 이런 저런 이유들이 나열되어 있는데 사실 위 기능들만 해도 애플리케이션 개발자의 생산성을 많이 높혀주는 것 같다. 특히 마이그레이션이랑 스튜디오 짱!