Prisma & MySQL 시작하기

Hayoung·2021년 6월 28일
17

Prisma

목록 보기
1/1
post-thumbnail

Prisma란?💎

Node.js와 TypeScript용 ORM.
DB는 MySQL, PostgreSQL, SQLite를 지원한다. (2021년 6월말 시점)

공식 문서에 따르면 Prisma는 아래의 구성 요소로 이루어져 있다.

  • Prisma Client: Auto-generated and type-safe query builder for Node.js & TypeScript
  • Prisma Migrate: Migration system
  • Prisma Studio: GUI to view and edit data in your database

이번 글에서는, Node.js에서 Prisma를 도입하고 MySQL과 연동하는 과정을 다뤄본다.


Prisma 도입하기

1️⃣ Prisma 설치

npm i prisma dotenv -D
npm i @prisma/client

설치 후, npx prisma init을 실행하면 프로젝트 루트 디렉토리 내에 아래 두 파일이 생성된다.

npx prisma init
  • prisma/schema.prisma: 자세한 용도는 아래에서 언급
  • .env: 데이터베이스 연결을 위한 환경변수를 정의할 때 사용

2️⃣ 데이터베이스 준비

이 글에서 데이터베이스는 MySQL을 사용하는 것을 가정한다.
MySQL 터미널에서 연동할 데이터베이스를 생성한다.

create database my_database;

.envDATABASE_URL이라는 환경변수를 다음과 같은 양식으로 작성한다.

# .env
DATABASE_URL="mysql://USER:PASSWORD@HOST:PORT/DATABASE"
  • sample
DATABASE_URL="mysql://root@localhost:3306/my_database"

3️⃣ Prisma Schema 파일 작성

Prisma schema 파일 (prisma/schema.prisma)는 Prisma 설정을 위한 메인 파일이며, 아래의 사항을 설정할 수 있다.

  • Data sources: Prisma가 연결해야하는 데이터베이스에 접속 시 필요한 정보를 정의
  • Generators: Prisma Client를 기반으로 생성되어야 하는 클라이언트를 정의
  • Data model definition: 데이터 모델(테이블)을 정의

prisma/schema.prisma를 아래 코드와 같은 형태로 작성해준다.

Prisma schema 작성 시의 자세한 문법은 아래의 공식 문서를 반드시 참고할 것.
사용할 수 있는 Attribute, type, modifier 등 자료가 정말 많다!

// prisma/schema.prisma

datasource db {
  provider = "mysql"
  url      = env("DATABASE_URL")
}

generator client {
  provider = "prisma-client-js"
}

model categories {
  id     Int      @id @default(autoincrement())
  name   String
  drinks drinks[]
}

...중략

4️⃣ Prisma Migrate 진행

Prisma Schema에서 정의한 모델을 바탕으로, Migrate 과정을 통해 MySQL에 실제 DB의 테이블을 생성할 수 있다.

아래의 command를 실행하여 Prisma Migrate를 진행한다.

npx prisma migrate dev --name create_categories 

--name 뒤의 create_categories와 같은 메시지는 prisma/migrations 폴더 아래에 타임 스탬프-입력내용과 같은 형식의 migrations 히스토리 폴더를 생성하는 것에 사용된다.

위의 command가 정상적으로 실행되면, 아래와 같은 디렉토리 형태로 migration.sql파일이 생성된다.

- prisma/                             
 └─migrations/
   └─ 20210629140442_create_categories/
     └─ migration.sql

Migrate를 실행한 후 MySQL의 해당 데이터베이스에 접속해서 테이블을 확인해보면, Prisma schema에서 작성한 model을 토대로 table이 생성된 것을 확인할 수 있다.

mysql> show tables;
+-------------------------+
| Tables_in_my_database   |
+-------------------------+
| _prisma_migrations      |
| categories              |
| drinks                  |
+-------------------------+

때때로, Migration을 수행하기 전에 수정이 필요한 상황이 있다.
예를 들면,

  • 중요한 리팩토링을 행할 때
  • field의 이름을 수정할 때 (기본적으로 Prisma Migrate는 기존 필드를 삭제함)
  • 1-1 관계의 방향을 수정하고자 할 때
  • Prisma Schema 언어로 나타낼 수 없는 기능을 추가하고자 할 때
    ...등등

이러한 상황에는 --create-only라는 command를 추가해주면 된다.
--create-only 옵션을 추가하여 migration을 진행하면, 변경 내용이 DB에 즉시 반영되지 않는다.
최종적으로 수정된 schema로 migration할 때는 npx prisma migrate dev --name XXX를 실행하면 된다.

npx prisma migrate dev --name delete_relations --create-only

Prisma Migrate created the following migration without applying it 20210628171515_delete_relations

You can now edit it and apply it by running prisma migrate dev.

--create-only에 관한 자세한 내용은 공식 문서 참조.


Prisma Client로 DB 조작하기

위의 Prisma schema, Prisma Migrate를 통해, Prisma에서 작성한 model이 실제 DB에 table로 추가, 반영되었다.

이제 Prisma를 통해 Node.js 환경에서 데이터베이스의 데이터에 접근하고 제어, 조작하는 방법을 알아보자.

이때 필요한 것이 바로 Prisma Client이다.
(Prisma Client를 아직 설치하지 않았다면, 위의 설치파트를 참고!)

Prisma Client의 설치를 끝냈다면, 아래의 command를 실행하자.
아래의 command를 통해 Prisma Client가 Prisma schema를 읽고, node_modules/@prisma/client에 Prisma Client를 생성한다.

npx prisma generate


(그림 클릭시 출처로 이동합니다!)

⚠️ 주의: Prisma schema가 변경될 때마다 npx prisma generate로 Prisma Client를 업데이트해줘야 한다! (위 그림 참조)

이제, Prisma Client가 필요한 코드(앱에서 DB의 데이터를 사용해야할 곳, 또는 prisma 모듈 등)에서 PrismaClient를 import한 후 PrismaClient 인스턴스를 생성한다.

import { PrismaClient } from '@prisma/client'

const prisma = new PrismaClient()
// use `prisma` in your application to read and write data in your DB

Prisma Client의 활용⭐️

위에서 작성된 PrismaClient 인스턴스를 활용해서 손쉽게 데이터베이스를 조작하는 쿼리를 작성할 수 있다.

예를 들면 CRUD 작업을 행할 수 있다.

Create

Prisma Client의 쿼리문 중에 create라는 메소드가 있다.
아래의 예시는 create를 사용하여 유저와 post를 같이 생성한 것이다.

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

Read

findUnique라는 메소드를 사용하여, id가 99인 record를 찾고 있다.

const user = await prisma.user.findUnique({
  where: {
    id: 99,
  },
})

Update

update라는 메소드를 사용하여, 조건에 해당하는 post를 update하고 있다.

const post = await prisma.post.update({
  where: { id: 42 },
  data: { published: true },
})

Delete

delete 메소드를 사용하여, 조건에 해당하는 user를 delete하고 있다.

const deleteUser = await prisma.user.delete({
  where: {
    email: 'bert@prisma.io',
  },
})

위에서 사용한 API 외에도 다양한 Prisma Client API가 존재한다.
자세한 내용은 Prisma Client API의 공식문서를 참고.

profile
Frontend Developer. 블로그 이사했어요 🚚 → https://iamhayoung.dev

1개의 댓글

comment-user-thumbnail
2022년 9월 2일

왁 많은 도움되었습니다.

답글 달기