[Node.js] Prisma 시작하기
Node.js와 TypeScript를 사용하는 프로젝트에서 Prisma를 ORM 도구로 선택하여 관련 내용을 정리했습니다.
공식 문서에서 Prisma는 읽기 쉬운 데이터 모델과 자동 마이그레이션, 타입 안전성, 자동 완성을 제공하는 오픈 소스 Node.js 및 TypeScript ORM 도구 라고 설명되어있다.
ORM
ORM 이란 Object-Relational Mapping 의 약자로, 객체 지향 프로그래밍 언어를 사용하여 호환되지 않는 유형의 시스템 간에 데이터를 변환하는 프로그래밍 기술이다.
ORM을 사용하면 SQL 쿼리 없이 데이터를 데이터베이스에 저장하고 관리할 수 있다.
쉽게 말해 우리는 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 테이블
_prisma_migrations 테이블
DB 업데이트 내역을 확인 할 수 있다.
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
댓글남기기