TIL | Prisma

peaceminusone·2021년 12월 23일
0

TIL | Backend

목록 보기
12/19
post-thumbnail

Prisma

Modern Database Access for TypeScript & Node.js

Prisma는 오픈소스 프로젝트로써, Typescript 와 Node.js 환경에서 데이터베이스에 대한 접근을 쉽게 하도록 도와주는 소프트웨어 입니다. 기존에 Node 환경에서 사용되던 다른 ORM(Object Relational Mapper)들을 대체해주는 역할을 합니다.

Sequelize, typeORM 보다 후에 TypeScript 와 GraphQL 을 사용한 백엔드 앱의 확장을 고려할 때 사용이 적합합니다.

다른 ORM 들과의 자세한 비교는 Prisma 공식문서 Why Prisma? 에 나와있으니 관심있는 분들은 읽어보시는 것을 추천합니다.

SequelizeNode.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

Prisma Start & 데이터베이스 연결

npx prisma // 명령어 확인
npx prisma init // prisma 초기 세팅

데이터베이스 연결

  • prisma/schema.prisma
datasource db {
  provider = "mysql"
  url      = env("DATABASE_URL")
}
  • .env
DATABASE_URL = "mysql://USERNAME:PASSWORD@localhost:3306/DATABASE_NAME"

3. Prisma 모델 생성 - User

데이터베이스를 연결했으니, Prisma를 통해서 데이터베이스에 테이블을 정의해보겠습니다.
이렇게 코드로 데이터베이스를 생성하는 과정을 "모델을 만든다." 라고 표현합니다.

가장 먼저, 사용자를 관리해줄 모델을 만들어 보겠습니다. users 이라는 이름으로 만들 것이고, 사용자의 이름과 이메일, 비밀번호를 저장할 수 있도록 생성하겠습니다.

├── **node_modules**
├── **prisma**
│   └── schema.prisma
├── package.json
└── server.js
  • prisma/schema.prisma
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

코드로 필요한 모델을 모두 생성했으니, 해당 모델을 테이블로 변경해보겠습니다.(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에 적용되었는지 확인할 수 있습니다.

profile
넘어져도 일어나서 나아가는 개발자의 삶을 염원합니다.

0개의 댓글