Node.js와 TypeScript를 사용하는 프로젝트에서 Prisma를 ORM 도구로 선택하여 관련 내용을 정리했습니다.

Alt text

공식 문서에서 Prisma는 읽기 쉬운 데이터 모델과 자동 마이그레이션, 타입 안전성, 자동 완성을 제공하는 오픈 소스 Node.js 및 TypeScript ORM 도구 라고 설명되어있다.

ORM

ORM 이란 Object-Relational Mapping 의 약자로, 객체 지향 프로그래밍 언어를 사용하여 호환되지 않는 유형의 시스템 간에 데이터를 변환하는 프로그래밍 기술이다.

ORM을 사용하면 SQL 쿼리 없이 데이터를 데이터베이스에 저장하고 관리할 수 있다.

Alt text

쉽게 말해 우리는 Prisma를 통해서 데이터베이스와 통신을 하게된다.

Prisma 특징

  • 타입 안전성: Prisma는 TypeScript와 잘 통합되어 타입 안전성을 제공합니다. 이는 코드 작성 시 오류를 줄이는 데 도움을 줍니다.
  • 자동 생성된 쿼리: Prisma는 모델을 기반으로 자동으로 쿼리를 생성해줍니다. 이는 개발 시간을 줄여주고 코드의 일관성을 유지하는 데 도움이 됩니다.
  • 마이그레이션 관리: Prisma는 데이터베이스 스키마의 변화를 추적하고, 이를 자동으로 마이그레이션할 수 있는 도구를 제공합니다.
  • 직관적인 API: Prisma의 API는 직관적이어서 데이터베이스 쿼리를 작성하는 것이 더 쉬워집니다.

TypeORM, Sequelize 등 여러 ORM 도구가 있지만 타입 안전성, 쿼리 작성의 직관성, 간편한 마이그레이션 관리 등 여러 장점을 가진 prisma를 ORM 도구로 선택했다.

Prisma 시작하기

  • tool : vscode
  • language : typeScript
  • SQL : mySQL

1. TypeScript 및 관련 패키지 설치

yarn add typescript ts-node @types/node --dev

2. TypeScript 설정 파일 생성

npx tsc --init

3. Prisma CLI 및 Prisma Client 설치

yarn add @prisma/client

yarn add prisma --dev

4. Prisma 초기화

npx prisma init

테이블 생성하기

*vscode 익스텐션 Prisma를 설치해주자

schema.prisma

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

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

model bad_landlord {
  id                String   @id @default(uuid()) // 기본 키, UUID로 자동 생성
  name              String   @db.VarChar(50) // 최대 50자까지 저장 가능한 문자열 (이름)
  age               Int?     @db.UnsignedTinyInt // 부호 없는 작은 정수 (나이)
  address           String   @db.VarChar(255) // 최대 255자까지 저장 가능한 문자열 (주소)
  depositObligation Decimal  @db.Decimal(15, 2) // 소수점 이하 2자리, 최대 15자리까지의 정수 (보증금 의무)
  dueDate           DateTime @db.Date // 날짜 데이터 (채무 발생일)
  delinquency       Int      @db.UnsignedSmallInt // 부호 없는 작은 정수 (채무 불이행 기간)
  fulfillmentDate   DateTime @db.Date // 날짜 데이터 (이행일)
  reimbursementDebt Decimal  @db.Decimal(15, 2) // 소수점 이하 2자리, 최대 15자리까지의 정수 (구상채무)
  executionCount    Int      @db.UnsignedTinyInt // 부호 없는 작은 정수 (강제집행 또는 보전처분 신청 횟수)
  referenceDate     DateTime @db.Date // 날짜 데이터 (기준일)
}


DB 연결

.env 파일을 생성한다

// 환경변수를 저장하는 파일 
NODE_ENV=dev
PORT=8000
// mysql://{USER}:{PASSWORD}@{DB_URL}:{PORT}/{DATABASE_NAME}
DATABASE_URL=mysql://root:0000@loacalhost:3306/database1

DB 업데이트 명령어 실행

yarn prisma migrate dev

Environment variables loaded from .env
Prisma schema loaded from prisma\schema.prisma
Datasource "db": MySQL database "database1" at "localhost:3306"

√ Enter a name for the new migration: ... init table
Applying migration `20240829095031_init_table`

테이블 생성

DBeaver에서 bad_landloard 테이블을 확인 할 수 있다.

bad_landloard 테이블

Alt text

_prisma_migrations 테이블

DB 업데이트 내역을 확인 할 수 있다.

Alt text

migrations 폴더

prisma 폴더 안에 migrations 폴더가 생성됐다.

migrations 이력과 SQL 문법을 볼 수 있다.

📦prisma
 ┣ 📂migrations
 ┃ ┣ 📂20240829095031_init_table
 ┃ ┃ ┗ 📜migration.sql
 ┃ ┗ 📜migration_lock.toml
 ┗ 📜schema.prisma

Prisma Client 업데이트

데이터베이스 구조에 변화가 생기면, 이에 맞게 Prisma Client도 업데이트되어야 한다.

yarn prisma generate

이 명령어를 실행하면, Prisma Client가 다시 생성되어 최신 스키마를 반영하게 된다.


이제 Prisma를 사용한 데이터베이스 연결과 테이블 생성이 모두 완료되었다!

다음에는 Prisma를 이용한 API 생성에 대해 다룰 예정이다.

아래는 참고자료로 Prisma Cli 와 자료형에 대해 정리해봤다.



참고자료 : Prisma CLI 및 자료형

Prisma Cli

yarn prisma init

  • 프로젝트에 prisma를 사용하는데 필요한 파일 생성 > prisma/schema.prisma, prisma.env

yarn prisma generate

  • prisma/schema.prisma를 기반으로 Prisma Client 등의 자원 생성
  • prisma/schema.prisma 수정 후 반드시 실행해야 함

yarn prisma migrate dev

  • schema.prisma를 기반으로 DB 업데이트 1) migrate를 진행하면 DB에 _prisma_migrations 테이블이 생성/수정 됨 2) git 처럼 DB 수정 내역을 관리 가능

yarn prisma migrate dev --create-only

  • 실제 DB에 반영하지 않고 migration 파일 변경 가능

yarn prisma db pull

  • DB 수정 내용을 불러오는 기능 (이미 만들어진 DB를 불러올 때 사용)

yarn prisma db push

  • migration 이력 없이 DB에 수정사항 반영


Prisma 자료형

문자열 - String

MySQL 자료형 Prisma 자료형 Prisma 표현식
VARCHAR String @db.VarChar(n)
char String @db.Char(n)
tinytext String @db.TinyText
text String @db.Text
mediumtext String @db.MediumText
longtext String @db.LongText

정수 - Int

MySQL 자료형 Prisma 자료형 Prisma 표현식
smallint Int @db.SmallInt
smallint unsigned Int @db.UnsignedSmallInt
mediumint Int @db.MediumInt
mediumint unsigned String @db.UnsignedMediumInt
int Int
int unsigned Int @db.UnsignedInt
tinyint Int @db.TinyInt(n)
tinyint unsigned Int @db.UnsignedTinyInt(n)

n은 문자열의 최대 길이를 나타냅니다 (@db.VarChar(255), @db.Char(10)).

실수 - Float, Double, Decimal

MySQL 자료형 Prisma 자료형 Prisma 표현식
decimal(a,b) Decimal @db.Decimal(x,y)
float Float @db.Float
double Float @db.Double

날짜 - DateTime

MySQL 자료형 Prisma 자료형 Prisma 표현식
date DateTime @db.Date
datetime DateTime @db.DateTime
timestamp DateTime @db.TimeStamp
time DateTime @db.Time

논리형 - Boolean

MySQL 자료형 Prisma 자료형 Prisma 표현식
boolean | tinyint(1) Boolean




Reference

댓글남기기