-
[TIL] 스파르타) 팀 프로젝트 - 풋살 온라인 시작 (D-7), Prisma generatorTIL-sparta 2024. 5. 31. 21:08
> 과제 요구 사항에 따라 wireframe, ERD, API 명세서 등을 설계한 뒤 스크립트 작업에 집중했다. 저번 개인 과제에서 달성하지 못 했던 DB 분리에 대한 내용을 정리 해보았다.
학습 키워드: Node.js, express, Prisma, PrismaClient, generator
Prisma schemas for multiple DB (generators)
1) What is it?:
MySQL ORM인 Prisma 및 PrismaClient를 이용할 때, 여러 개의 DB에 분포된 Table들을 access 할 수 있도록 설정하기 위해서는 generator 기능을 이용해야 한다. Generator는 prisma generate 커맨드를 호출할 때 어떤 asset들이 generate 될 지를 결정해주는 기능이다.
2) How does it work?:
// player.schema.prisma generator client { provider = "prisma-client-js" output = "./player" binaryTargets = ["native", "debian-openssl-3.0.x"] } datasource db { provider = "mysql" url = env("PLAYER_DB_URL") } model Player { playerId Int @id @default(autoincrement()) @map("player_id") ... @@map("Player") }
// user.schema.prisma generator client { provider = "prisma-client-js" output = "./user" binaryTargets = ["native", "debian-openssl-3.0.x"] } datasource db { provider = "mysql" url = env("DB_URL") } model User { userId Int @id @default(autoincrement()) @map("user_id") ... @@map("User") } model Team { teamId Int @id @default(autoincrement()) @map("team_id") ... @@map("Team") } model Inventory { inventoryId Int @id @default(autoincrement()) @map("inventory_id") ... @@map("Inventory") }
먼저 schema.prisma 파일들을 생성해준다. Prisma Client JS (provider = prisma-client-js)는 platform-dependent 한 여러 engine 종류 및 버전을 사용하는데, 이 binaryTargets를 통해 어떤 engine을 사용할 지를 결정해줄 수 있다. 위 예시와 같이 설정하면 AWS RDS의 MySQL 서버를 대상으로 정상적으로 동작한다.
참고: 다른 DB에 속한 테이블 끼리는 relation 설정이 불가능하다.
Generator에 output 값을 설정해주면, npx prisma generate --schema ./player.schema.prisma 호출 시 해당 위치에 필요한 PrismaClient 파일들이 생성된다. 위 경우에서는 스키마가 위치한 디렉토리에 player 라는 이름을 가진 하위 디렉토리 안에 파일들이 생성된다. 동일한 작업을 user.schema.prisma 를 대상으로도 진행해주면 된다. npx prisma db push --schema [대상 스키마] 명령어로 두 schema를 DB에 push 해주는 것 또한 잊지 말자.
// ./src/lib/utils/prisma/index.js import { PrismaClient as UserPrismaClient } from "../../../../prisma/user/index.js"; import { PrismaClient as PlayerPrismaClient } from "../../../../prisma/player/index.js"; export const playerPrisma = new PlayerPrismaClient({ log: ["query", "info", "warn", "error"], errorFormat: "pretty", }); export const userPrisma = new UserPrismaClient({ log: ["query", "info", "warn", "error"], errorFormat: "pretty", });
앞선 작업들이 완료되면 prisma client 객체를 중복 생성하지 않기 위해 미리 객체들을 생성하여 export 해준다. 각각의 DB마다 다른 client 객체를 해당하는 디렉토리에서 index.js 파일 내 PrismaClient를 import하여 생성해주면 된다. 이렇게 export된 객체들은 router 등에서 import하여 사용하면 된다.
3) Why use it?:
저번 프로젝트에서는 이 기능을 사용할 줄 몰라서 하나의 schema에 모든 테이블을 넣어두고 npx prisma db push 명령어를 실행한 뒤 기본 PrismaClient 만을 사용했지만, 이 방식으로는 여러 개의 DB에 나뉜 테이블을 관리할 수 없다. 현업에서는 종종 여러 DB를 사용해야하는 상황이 발생하기 때문에 각 ORM마다 미리 사용법을 익혀두면 좋다.
--
REFERENCES:
> 과제 spec
> 팀 프로젝트 S.A. (Notion)
> 프로젝트 repo
> Prisma, "Generators"
728x90'TIL-sparta' 카테고리의 다른 글
[TIL] 프로그래머스) k진수에서 소수 개수 구하기 풀이 (Java) (0) 2024.06.02 [TIL] 프로그래머스) 2개 이하로 다른 비트 (Java) (0) 2024.06.01 [TIL] 아이템 시뮬레이터 2 개인 과제 피드백 확인 (XA Transaction) (0) 2024.05.30 [TIL] 강의 과제) Subnet, Public IP, Private IP, Static IP, Dynamic IP, Router, Routing (0) 2024.05.29 [TIL] 프로그래머스) 42583 - 다리를 지나는 트럭 풀이 (Java), 개인 과제 제출 (0) 2024.05.28