프리즈마는 차원이 다른 개발자 경험을 제공하는 타입스크립트 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.json
과node_modules
를 가진 buildable Nx 라이브러리로 만들어줘야합니다.
Originally published at https://0916dhkim.github.io.