(컨셉) Prisma 란?

hwisaac·2023년 2월 16일
0

Prisma

목록 보기
1/2

https://www.prisma.io/docs/concepts/overview/what-is-prisma

Prisma

Prisma 란?

Prisma 는 오픈소스 next-generation ORM 입니다.

ORM (Object Relational Mapping) 이란?

객체와 관계형 데이터베이스의 데이터를 자동으로 매핑해주는 것을 말한다.
일종의 번역기라 보면 되는데, 자바스크립트(타입스크립트) 코드와 DB 사이를 연결해주는 것이다.

  1. Prisma Client : 자동 생성되는 type safe 쿼리 빌더 (for Node.js & TypeScript)
  2. Prisma Migrate : 마이그레이션 시스템
  3. Prisma Studio: 데이터베이스를 보며 편집할 수 있는 GUI
    • Prisma Studio 의 경우 Prisma ORM의 일부이지만 오픈소스는 아닙니다.
    • Data Browser 라는 이름으로 Prisma Data Platform 으로 상업적으로 제공됩니다.
  • Prisma Cleint 는 모든 Node.js 또는 Typescript 백엔드 어플리케이션에 사용할 수 있습니다.(서버리스 애플리케이션 및 마이크로서비스 포함)
  • REST API, GraphQL API, gRPC API 등으로 쓸 수 있습니다.

Prisma 작동방식

Prisma Schema

  • Prisma 를 사용하기 전에 schema.prisma 파일을 통해 데이터베이스가 어떻게 생겼는지 알려줘야 합니다.

    schema.prisma 는 데이터베이스에 대한 모든 설명을 담은 파일입니다.

  • 모든 프로젝트는 Prisma schema filePrisma toolkit 으로 시작합니다.
  • Prisma Schema 는 개발자에게 직관적인 데이터 모델링 언어로 application models 를 정의할 수 있게 해줍니다.
  • 이는 또한 dbgenerator 의 정의를 연결해줍니다.
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[]
}
  • User모델의 posts field 는 오직 "Prisma-Level" 에 정의됩니다. 즉, 기본 데이터베이스에서 foreign key로 나타나지 않습니다.

Prisma schema 는 강력한 데이터 모델링 기능을 가지고 있습니다.
예를들어, "Prisma-level" relation fields 를 정의할 수 있게 해줍니다.

  1. Data source: 데이터베이스 연결을 명시함 (환경변수를 통해)
  2. Generator: 생성하길 원하는 Prisma Client를 지시함
  3. Data model: 어플리케이션의 모델을 정의함

The Prisma data model

Functions of Prisma models

  • data modle 은 modles 의 컬렉션입니다. 모델은 두가지 중요 함수를 가집니다.
    1. 관계형 데이터베이스의 테이블 또는 MongoDB의 컬렉션을 나타냅니다
    2. Prisma Client API에서 쿼리에 대한 기반 제공

Getting a data model

  • Prisma Schemadata model 을 '얻는' 두가 주요 워크플로우가 있습니다.

    1. Prisma Migrate를 사용하여 데이터 모델을 수동으로 작성하고 데이터베이스에 매핑
    2. 데이터베이스를 검사하여 데이터 모델 생성
  • 데이터 모델이 정의되면 정의된 모델에 대한 CRUD 및 더 많은 쿼리를 노출하는 Prisma Client를 생성할 수 있습니다.

  • TypeScript를 사용하는 경우 모델 필드의 하위 집합만 검색하는 경우에도 모든 쿼리에 대해 type-safety를 제공합니다.

Accessing your database with Prisma Client

Generating Prisma Client

Prisma Client를 사용할 때 우선적으로 해야 하는 것은 @prisma/client 를 설치하는 것입니다.

  • npm install @prisma/client

  • @prisma/client 패키지를 설치하면 prisma generate 명령이 실행되고, prisma schema를 읽고 prisma Client 코드를 생성합니다.

    • 코드는 기본적으로 node_modules/.prisma/client 폴더에 생성됩니다.
  • 데이터 모델을 변경한 후에는 수동으로 Prisma Client를 다시 생성하여 node_modules/.prisma/client 내부의 코드를 업데이트해야 합니다:prisma generate

Prisma Client 를 사용해서 쿼리들을 데이터베이스에 보내기

  • Prisma 클라이언트가 생성되면 코드에서 해당 클라이언트를 가져와 데이터베이스로 쿼리를 보낼 수 있습니다. 이것이 설치 코드의 모습입니다.
import { PrismaClient } from "@prisma/client";

const prisma = new PrismaClient();
  • 이제 생성된 Prisma 클라이언트 API를 통해 쿼리를 보내기 시작할 수 있습니다.
  • 여기 몇 가지 샘플 쿼리가 있습니다.
  • 모든 Prisma 클라이언트 쿼리는 JavaScript 객체를 반환합니다. [Prisma Client API reference] 에서 사용 가능한 작업에 대해 자세히 알아보세요.

User 레코드를 데이터베이스에서 검색

// Run inside `async` function
const allUsers = await prisma.user.findMany();

반환되는 각 User 객체에 posts 릴레이션을 포함하기

// Run inside `async` function
const allUsers = await prisma.user.findMany({
  include: { posts: true },
});

"prisma" 를 포함하는 Post 레코드를 필터링

// Run inside `async` function
const filteredPosts = await prisma.post.findMany({
  where: {
    OR: [
      { title: { contains: "prisma" } },
      { content: { contains: "prisma" } },
    ],
  },
});

새로운 UserPost 를 생성하고 같은 쿼리에 기록하기

// Run inside `async` function
const user = await prisma.user.create({
  data: {
    name: "Alice",
    email: "alice@prisma.io",
    posts: {
      create: { title: "Join us for Prisma Day 2020" },
    },
  },
});

이미 존재하는 Post 를 업데이트 하기

// Run inside `async` function
const post = await prisma.post.update({
  where: { id: 42 },
  data: { published: true },
});

Typescript 와 함께 사용하기

  • TypeScript를 사용할 때 이 쿼리의 결과는 존재하지 않는 속성에 실수로 액세스할 수 없도록 정적으로 입력됩니다.
  • 문서의 생성된 Advanced usage of generated types에서 Prisma Client의 생성된 type을 활용하는 방법에 대해 자세히 알아보십시오.

Typical Prisma workflows

  • 언급한 바와 같이, 데이터 모델을 프리즈마 스키마에 "넣는" 두 가지 방법이 있습니다. 어떤 접근법을 선택하느냐에 따라 기본 프리즈마 워크플로우가 다르게 보일 수 있습니다.

Prisma Migrate

  • Prisma의 통합 데이터베이스 마이그레이션 도구인 워크플로우는 다음과 같습니다:
  1. 수동으로 프리즈마 데이터 모델조정하기
  2. prisma migrate dev CLI 명령을 사용하여 개발 데이터베이스 마이그레이션
  3. 어플리케이션 코드에서 Prisma Client를 사용하여 데이터베이스 액세스

0개의 댓글