Modern Database Access for TypeScript & Node.js
Prisma는 오픈소스 프로젝트로써, Typescript 와 Node.js 환경에서 데이터베이스에 대한 접근을 쉽게 하도록 도와주는 소프트웨어 입니다. 기존에 Node 환경에서 사용되던 다른 ORM(Object Relational Mapper)들을 대체해주는 역할을 합니다.
Sequelize, typeORM 보다 후에 TypeScript 와 GraphQL 을 사용한 백엔드 앱의 확장을 고려할 때 사용이 적합합니다.
다른 ORM 들과의 자세한 비교는 Prisma 공식문서 Why Prisma? 에 나와있으니 관심있는 분들은 읽어보시는 것을 추천합니다.
Sequelize
는 Node.js
를 위해 개발된 ORM입니다. Postgres, MySQL, MariaDB, SQLite 와 같은 다양한 데이터베이스를 연결할 수 있습니다.
Prisam는 npm
을 이용해 설치합니다. 원하는 위치에 디렉토리를 생성하신 후, Sequelize와 함께 mysql을 사용할 수 있도록 아래 두 패키지를 설치합니다.
npm install prisma --save-dev
npm install @prisma/client --save
두가지 패키지를 더 설치해보겠습니다.
- nodemon : 코드가 변경 된 이후, 서버를 재실행하지 않아도 변경 사항이 서버에 적용되도록 합니다.
- dotenv : 환경 변수를 사용할 수 있게 해줍니다.
npm install dotenv nodemon -D
npx prisma // 명령어 확인
npx prisma init // prisma 초기 세팅
데이터베이스 연결
datasource db {
provider = "mysql"
url = env("DATABASE_URL")
}
DATABASE_URL = "mysql://USERNAME:PASSWORD@localhost:3306/DATABASE_NAME"
데이터베이스를 연결했으니, Prisma를 통해서 데이터베이스에 테이블을 정의해보겠습니다.
이렇게 코드로 데이터베이스를 생성하는 과정을 "모델을 만든다." 라고 표현합니다.
가장 먼저, 사용자를 관리해줄 모델을 만들어 보겠습니다. users
이라는 이름으로 만들 것이고, 사용자의 이름과 이메일, 비밀번호를 저장할 수 있도록 생성하겠습니다.
├── **node_modules**
├── **prisma**
│ └── schema.prisma
├── package.json
└── server.js
model articles {
id Int @id @default(autoincrement())
user_id Int
title String
body String
created_at DateTime? @default(now())
updated_at DateTime?
deleted_at DateTime?
users users @relation(fields: [user_id], references: [id])
comments comments[]
@@index([user_id], name: "user_id")
}
model comments {
id Int @id @default(autoincrement())
article_id Int
user_id Int
body String
created_at DateTime? @default(now())
updated_at DateTime?
deleted_at DateTime?
articles articles @relation(fields: [article_id], references: [id])
users users @relation(fields: [user_id], references: [id])
@@index([article_id], name: "article_id")
@@index([user_id], name: "user_id")
}
model users {
id Int @id @default(autoincrement())
email String @unique
password String
created_at DateTime? @default(now())
updated_at DateTime?
deleted_at DateTime?
articles articles[]
comments comments[]
}
지금부터 여기 users
모델은 MySQL 데이터베이스 에서 users
라는 테이블이 될 것입니다. 그 테이블에는 id
, name
, email
, password
, created_at
, updated_at
과 같은 컬럼들이 있습니다.
세 개의 모델을 생성해주었으니 세 개의 테이블이 형성될 것이고, 데이터를 넣지 않았으니 빈 테이블이 형성 되겠죠?
코드로 필요한 모델을 모두 생성했으니, 해당 모델을 테이블로 변경해보겠습니다.(Migration)
npx prisma migrate dev --name init
마이그레이션이 성공하면 prisma/migrations
디렉토리에 생성시각_init
이라는 이름의 마이그레이션 폴더가 생성되고 내부에는 데이터베이스에 직접 테이블을 생성해줄 migration.sql
파일이 생성됩니다.
├── **node_modules**
├── **prisma**
│ ├── **migratinos**
│ │ └── **20201212000000_init**
│ │ └── migration.sql
│ └── schema.prisma
├── package.json
└── server.js
생성된 마이그레이션 파일이 해당 DB에 적용되었는지 확인할 수 있습니다.