반응형
Jake Seo
제이크서 위키 블로그
Jake Seo
전체 방문자
오늘
어제
  • 분류 전체보기 (715)
    • 일상, 일기 (0)
    • 백준 문제풀이 (1)
    • 릿코드 문제풀이 (2)
    • 알고리즘 이론 (10)
      • 기본 이론 (2)
      • 배열과 문자열 (8)
    • 데이터베이스 (15)
      • Planet Scale (1)
      • MSSQL (9)
      • 디비 기본 개념 (1)
      • SQLite 직접 만들어보기 (4)
    • 보안 (7)
    • 설계 (1)
    • 네트워크 (17)
      • HTTP (9)
      • OSI Layers (5)
    • 회고 (31)
      • 연간 회고 (2)
      • 주간 회고 (29)
    • 인프라 (52)
      • 도커 (12)
      • AWS (9)
      • 용어 (21)
      • 웹 성능 (1)
      • 대규모 서비스를 지탱하는 기술 (9)
    • 깃 (7)
    • 빌드 도구 (7)
      • 메이븐 (6)
      • 그레이들 (0)
    • Java (135)
      • 이펙티브 자바 (73)
      • 자바 API (4)
      • 자바 잡지식 (30)
      • 자바 디자인 패턴 (21)
      • 톰캣 (Tomcat) (7)
    • 프레임워크 (64)
      • next.js (14)
      • 스프링 프레임워크 (28)
      • 토비의 스프링 (6)
      • 스프링 부트 (3)
      • JPA (Java Persistence API) (5)
      • Nest.js (8)
    • 프론트엔드 (48)
      • 다크모드 (1)
      • 노드 패키지 관리 매니저 (3)
      • CSS (19)
      • Web API (11)
      • tailwind-css (1)
      • React (5)
      • React 새 공식문서 요약 (1)
      • HTML (Markup Language) (5)
    • 자바스크립트 (108)
      • 모던 자바스크립트 (31)
      • 개념 (31)
      • 정규표현식 (5)
      • 코드 스니펫 (1)
      • 라이브러리 (6)
      • 인터뷰 (24)
      • 웹개발자를 위한 자바스크립트의 모든 것 (6)
      • 팁 (2)
    • Typescript (49)
    • 리눅스와 유닉스 (10)
    • Computer Science (1)
      • Compiler (1)
    • IDE (3)
      • VSCODE (1)
      • IntelliJ (2)
    • 세미나 & 컨퍼런스 (1)
    • 용어 (개발용어) (16)
      • 함수형 프로그래밍 용어들 (1)
    • ORM (2)
      • Prisma (2)
    • NODEJS (2)
    • cypress (1)
    • 리액트 네이티브 (React Native) (31)
    • 러스트 (Rust) (15)
    • 코틀린 (Kotlin) (4)
      • 자바에서 코틀린으로 (4)
    • 정규표현식 (3)
    • 구글 애널리틱스 (GA) (1)
    • SEO (2)
    • UML (2)
    • 맛탐험 (2)
    • 리팩토링 (1)
    • 서평 (2)
    • 소프트웨어 공학 (18)
      • 테스팅 (16)
      • 개발 프로세스 (1)
    • 교육학 (1)
    • 삶의 지혜, 통찰 (1)
    • Chat GPT (2)
    • 쉘스크립트 (1)
    • 컴파일 (2)
    • Dart (12)
    • 코드팩토리의 플러터 프로그래밍 (4)
    • 플러터 (17)
    • 안드로이드 스튜디오 (1)
    • 윈도우즈 (1)
    • 잡다한 백엔드 지식 (1)
    • 디자인 패턴 (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 팩터리 메서드 패턴
  • 싱글턴
  • 자바 디자인패턴
  • try-with-resources
  • 참조 해제
  • item7
  • 메이븐 페이즈
  • Javadoc 자바독 자바주석 주석 Comment
  • MSSQL
  • 자바
  • 토비의 스프링
  • item8
  • 디자인패턴
  • 러스트
  • 외래키 제약조건
  • 프로그래머의 뇌
  • Java
  • item9
  • 싱글톤
  • 플라이웨이트패턴
  • next js app
  • 서버리스 컴퓨팅
  • 추상 팩터리 패턴
  • 이펙티브 자바
  • 스프링 검증
  • 자료구조
  • serverless computing
  • 빈 검증
  • pnpm
  • 느린 쿼리
  • 자바스크립트 인터뷰
  • 알고리즘
  • 자바 검증
  • 자바스크립트
  • 작업기억공간
  • rust
  • Next.js
  • 슬로우 쿼리
  • 메이븐 라이프사이클
  • 이펙티브 자바 item9
  • 자바스크립트 면접
  • bean Validation
  • Pre-rendering
  • 메이븐 골
  • 객체복사
  • prerendering
  • 이펙티브자바
  • 싱글톤 패턴
  • 도커공식문서
  • NEXT JS

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Jake Seo

제이크서 위키 블로그

ORM/Prisma

Prisma 정리와 세팅법

2022. 7. 3. 03:17

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 을 적절히 수정해주면 된다.

생성된 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
    'ORM/Prisma' 카테고리의 다른 글
    • Prisma Schema 란?
    Jake Seo
    Jake Seo
    ✔ 잘 보셨다면 광고 한번 클릭해주시면 큰 힘이 됩니다. ✔ 댓글로 틀린 부분을 지적해주시면 기분 나빠하지 않고 수정합니다. ✔ 많은 퇴고를 거친 글이 좋은 글이 된다고 생각합니다. ✔ 간결하고 명료하게 사람들을 이해 시키는 것을 목표로 합니다.

    티스토리툴바