Prisma 란?
차세대 오픈소스 ORM 으로 기본 기능은 다른 ORM 과 동일하게 DB 벤더에 따른 쿼리를 만들어주는 쿼리 빌더이다. Prisma 는 특이하게 다음 3가지 부분으로 나뉜다.
단순 쿼리 번역기의 역할일 뿐. DB 자체의 역할이 아니니 오해하지 말자. 웹에서는 보통
PlanetScale
과 연결해서 사용한다.
- Prisma Client: Node.js 와 Typescript 를 위한 auto-generated & type-safe 쿼리 빌더이다.
- Prisma Migrate: 마이그레이션 시스템이다.
- Prisma Studio: DB GUI 도구이다.
Node.js 혹은 타입스크립트에서 사용될 수 있으며, REST API, GraphQL API, gRPC API 혹은 디비가 필요한 아무 API 나 될 수 있다.
Prisma 는 어떻게 동작하는가?
The Prisma Schema
프리즈마 시작을 위해 스키마 파일 (Prisma Schema) 이 필요하다. 스키마 파일 내부에서 직관적 데이터 모델링 언어로 애플리케이션 모델을 정의할 수 있다. 모델링 외에 데이터 소스에 대한 정보도 포함되어 있다.
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[]
}
Prisma-level
위의 스키마 내용에서는 relation fields 인 Prisma-level 이라는 것이 존재한다. 이는 Prisma Client API 내부의 관계 에 관련된 작업을 편하게 만들어준다.
위의 Prisma Schema 에서는 User
내부에 있는 posts
는 오직 "Prisma-level" 에서만 존재하여 기본 데이터베이스에서 외래 키로 나타나지 않는다.
스키마에서는 3가지를 정의한다.
- Datasource: 연결할 디비를 말한다.
- Generator: Prisma Client 를 생성하고 싶다는 것을 가리킨다.
- Data model: 애플리케이션 모델을 정의한다.
The Prisma Data Model
Prisma data model 이란 models 를 모아놓은 것을 말한다. 모델은 아래와 같은 2가지 주요 기능을 갖는다.
- DB 의 테이블을 나타낸다.
- Prisma Client API 에서의 쿼리에 대한 생성을 제공한다.
설치해야 하는 Extension
Prisma
in VSCode
세팅법
기본적으로는 npx prisma init
명령어를 입력하고 나오는 가이드대로 사용하면 된다.
$ npx prisma init
✔ Your Prisma schema was created at prisma/schema.prisma
You can now open it in your favorite editor.
warn You already have a .gitignore file. Don't forget to add `.env` in it to not commit any private information.
Next steps:
1. Set the DATABASE_URL in the .env file to point to your existing database. If your database has no tables yet, read https://pris.ly/d/getting-started
2. Set the provider of the datasource block in schema.prisma to match your database: postgresql, mysql, sqlite, sqlserver, mongodb or cockroachdb.
3. Run prisma db pull to turn your database schema into a Prisma schema.
4. Run prisma generate to generate the Prisma Client. You can then start querying your database.
More information in our documentation:
https://pris.ly/d/getting-started
위 내용은 한번정도 정독해주는 것이 좋다. 특히 .env 파일이 깃허브에 업로드되지 않도록 주의하자!
위의 명령어를 입력하면,
.env
파일이 자동으로 생성된다.prisma
디렉토리가 자동으로 생성되고/prisma/schema.prisma
파일이 자동으로 생성된다.
의존성 설치
pnpm install prisma
Datasource 세팅
schema.prisma
파일에 있는provider
와url
을 적절히 세팅해주자.- url 은
schema.prisma
를 직접 수정하는 것이 아니라.env
에 있는DATABASE_URL
을 적절히 수정해주면 된다.
- url 은
생성된 schema.prisma
의 디폴트 내용은 아래와 같다.
// This is your Prisma schema file,
// learn more about it in the docs: https://pris.ly/d/prisma-schema
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
생성된 .env
의 디폴트 내용은 아래와 같다.
# Environment variables declared in this file are automatically made available to Prisma.
# See the documentation for more detail: https://pris.ly/d/prisma-schema#accessing-environment-variables-from-the-schema
# Prisma supports the native connection string format for PostgreSQL, MySQL, SQLite, SQL Server, MongoDB and CockroachDB.
# See the documentation for all the connection string options: https://pris.ly/d/connection-strings
DATABASE_URL="postgresql://johndoe:randompassword@localhost:5432/mydb?schema=public"
외래키 제약조건 넣기 (PlanetScale 을 사용하는 경우)
// This is your Prisma schema file,
// learn more about it in the docs: https://pris.ly/d/prisma-schema
generator client {
provider = "prisma-client-js"
previewFeatures = ["referentialIntegrity"]
}
datasource db {
provider = "mysql"
url = env("DATABASE_URL")
referentialIntegrity = "prisma"
}
Planet Scale 을 사용하는 경우, 위와 같이 schema.prisma
파일에 자체적으로 제공하는 외래키 제약조건을 넣어주는 것이 좋다.
PlanetScale DB 는 Relational DB 지만, Clustering 을 지원하여 Horizontal Scaling 때문에 자체에서 외래키 제약조건을 넣을 수 없기 때문에 ORM 에서 지원하는 기능을 사용하는 것이다.
Prisma Client 란?
Prisma Client 는 자동 생성되는 타입 안전한 쿼리 빌더이다. 사용자의 데이터 스키마에 맞춰져 있다. (tailored to your data)
DB 에 직접 접근할 수 있기에 보안이 매우 중요하고, 그렇기에 브라우저 단에서는 실행할 수 없다.
자세한 정의는 공식문서 에 나와있다.
사용법
pnpm install @prisma/client
# npx prisma generate
@prisma/client
의존성을 설치하면 자동으로 npx prisma generate
명령어가 실행된다. 그러면 prisma 는 프로젝트의 prisma
디렉토리 내부에 있는 schema.prisma
파일을 인식하고 schema.prisma
에 따른 타입 파일을 생성해준다.
model User {
id Int @id @default(autoincrement())
phone Int? @unique
email String? @unique
name String
avatar String?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
위는 schema.prisma
의 내용이다. 명령어 실행 이후에 node_modules/
내부에 있는 prisma-client
디렉토리의 index.d.ts
파일을 뒤져보면 아래와 같은 내용이 들어있다.
/**
* Model User
*
*/
export type User = {
id: number
phone: number | null
email: string | null
name: string
avatar: string | null
createdAt: Date
updatedAt: Date
}
이렇게 타입스크립트로 타입이 정의되어 추후에 도메인에 관련된 코딩을 할 때 멋진 자동완성을 제공할 것이다.
스키마 DB 에 넣기
npx prisma db push
prisma.schema
정의를 위처럼 끝냈다면, 위 명령어를 입력하여 prisma.schema
에 정의해놓은 스키마가 Prisma 를 통해 DB 에 입력할 수 있다. 이 명령어는 스키마가 변경될 때마다 매번 다시 입력해주어야 한다.
Prisma GUI 도구 Prisma Studio 세팅하기
npx prisma studio
위 명령어를 실행하면 인터넷 브라우저가 뜨면서 Prisma Studio
가 실행된다.
Prisma Studio 공식 웹사이트 에 다양한 정보가 있다.
클라이언트 파일 구성하기
import { PrismaClient } from "@prisma/client";
declare global {
var prisma: PrismaClient | undefined;
}
const prisma =
global.prisma ||
new PrismaClient({
log: ["query"],
});
if (process.env.NODE_ENV === "development") global.prisma = prisma;
export default prisma;
위와 같은 클라이언트 파일을 /libs/server
와 같은 디렉토리에 넣어놓은 뒤 import
하여 쓰면 편리하다.
테스트해보기
import { NextApiRequest, NextApiResponse } from "next";
import client from "@libs/server/prismaClient";
export default async function handler(
req: NextApiRequest,
res: NextApiResponse
) {
const newUser = await client.user.create({
data: {
name: "JAKE SEO!",
email: "ABC1@naver.com",
},
});
res.status(200).json({ newUser });
}
Next.js 와 같은 경우 위처럼 간단한 API 를 만들어 테스트할 수 있다.
// 20220713050103
// http://localhost:3000/api/prisma-test
{
"newUser": {
"id": 19,
"phone": null,
"email": "ABC1@naver.com",
"name": "JAKE SEO!",
"avatar": null,
"createdAt": "2022-07-12T20:01:03.198Z",
"updatedAt": "2022-07-12T20:01:03.200Z"
}
}
위와 같은 json 을 반환하면 성공이다.
'ORM > Prisma' 카테고리의 다른 글
Prisma Schema 란? (0) | 2022.06.30 |
---|