모노리포에서 Prisma 사용하기

Danny Kim
3 min readJan 18, 2022

--

프리즈마는 차원이 다른 개발자 경험을 제공하는 타입스크립트 ORM입니다. 대부분의 경우 프리즈마는 설정이 필요 없지만, 모노리포에 프리즈마를 추가하는 작업은 직관적이지 않을 수 있습니다. 이 포스트에서는 프리즈마를 모노리포 환경에서 사용하는 법을 다룹니다.

간단한 프리즈마 소개

프리즈마에는 크게 두가지 중요한 개념이 있습니다. 스키마 그리고 클라이언트 인데요:

  • 프리즈마 스키마는 데이터 모델과 데이터베이스 설정을 정의하는 텍스트 파일이며, 이렇게 생겼습니다:
  • 이 스키마를 이용해서 프리즈마는 @prisma/client 라는 패키지를 생성하는데, 이 패키지가 ORM의 타입지원과 기능을 제공합니다:

그렇다면 여러 패키지에서 하나의 @prisma/client를 돌려 쓰려면 어떻게 해야 하나요?

모노리포 워크스페이스 구조가 이런 식으로 생겼다고 해봅시다:

- Project Root
- apps
- dashboard
- libs
- core

생성된 프리즈마 클라이언트를 공유하려면 일단 프리즈마 스키마를 별도의 패키지에 이렇게 집어넣습니다:

- Project Root
- apps
- dashboard
- libs
- core
- shared-prisma
- prisma
- schema.prisma
- src
- index.ts

이제 prisma generate 커맨드를 사용해서 @prisma/client를 생성하고, 그 생성된 클라이언트를 libs/shared-prisma/src/index.ts 모듈에서 re-export 해주면 됩니다:

이렇게 설정해두면 다른 패키지에서 공유된 프리즈마 클라이언트를 import 할 수 있습니다.

Nx 사용시 주의사항

buildable 혹은 publishable 라이브러리를 사용하지 않는다면, 모든 의존성이 워크스페이스에 설치됩니다. 상황에 따라 이게 편할 수도 있지만 정말 불편할 수도 있습니다.

  • 좋은 경우: @prisma/client가 워크스페이스에 설치되기 때문에 별도로 shared-prisma에서 re-export를 할 필요가 없습니다. 모든 패키지에서 이미 @prisma/client에 접근 가능합니다.
  • 안좋은 경우: 모노리포 안에 서로 다른 프리즈마 스키마를 (따라서 다른 프리즈마 클라이언트를) 사용하는 앱이 여러개 있는 경우, Nx의 이러한 구조가 골치아픕니다. 각각의 프리즈마 스키마에서 @prisma/client를 생성할 때마다 전부 워크스페이스의 @prisma/client를 덮어쓰기 때문입니다. 이 문제를 해결하기 위해서는shared-prisma를 독립적인 package.jsonnode_modules를 가진 buildable Nx 라이브러리로 만들어줘야합니다.

Originally published at https://0916dhkim.github.io.

--

--