39.백엔드에 Prisma를 사용한 데이터베이스 관리, Prisma의 Migrations와 CRUD 기능 활용

오늘날의 웹 애플리케이션 개발에서는 데이터베이스 관리와 유연한 백엔드 구축이 필수적입니다. 다양한 ORM(Object-Relational Mapping) 도구 중 하나인 Prisma는 Node.js 환경에서 데이터베이스를 손쉽게 관리할 수 있도록 해주는 훌륭한 도구입니다. 이번 강좌에서는 Prisma를 사용하여 백엔드를 구성하고, 데이터베이스 관리, Migrations, 그리고 CRUD(Create, Read, Update, Delete) 기능을 활용하는 방법에 대해 자세히 알아보겠습니다.

1. Prisma 소개

Prisma는 TypeScript와 Node.js 환경에서 사용되는 ORM으로, 관계형 데이터베이스와의 상호작용을 쉽게 도와줍니다. Prisma를 사용하면 SQL 쿼리를 작성하지 않고도 데이터베이스 모델을 정의하고 이를 기반으로 데이터베이스 작업을 수행할 수 있습니다. Prisma는 다음과 같은 장점을 제공합니다:

  • 유형 안전성(Type Safety): TypeScript의 강력한 타입 시스템을 기반으로 안전한 쿼리를 제공합니다.
  • Auto-completion: 개발자가 코드를 작성할 때 IDE에서 자동 완성 기능을 제공합니다.
  • 마이그레이션(Migration): 데이터베이스 스키마 변경을 쉽게 관리할 수 있는 강력한 마이그레이션 도구를 제공합니다.
  • 다양한 데이터베이스 지원: PostgreSQL, MySQL, SQLite, SQL Server 등 다양한 데이터베이스를 지원합니다.

2. Prisma 설치 및 초기 설정

Prisma를 설치하고 사용하기 위해, 먼저 Node.js와 npm이 설치되어 있어야 합니다. 아래 명령어를 통해 Prisma를 설치할 수 있습니다.

npm install prisma --save-dev

설치 후 Prisma의 초기 설정을 위해 다음 명령어를 실행합니다:

npx prisma init

이 명령어를 실행하면 프로젝트 루트에 Prisma 폴더와 schema.prisma 파일이 생성됩니다. schema.prisma 파일은 데이터베이스의 스키마를 정의하는 중요한 파일입니다.

3. 데이터베이스 연결 설정

이제 데이터베이스에 연결하기 위해 schema.prisma 파일을 설정합니다. 예를 들어 PostgreSQL을 사용할 경우, 아래와 같이 설정할 수 있습니다.


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

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

DATABASE_URL 환경 변수에는 PostgreSQL 데이터베이스의 연결 URL을 설정해야 합니다. 다음과 같은 형태가 됩니다:

DATABASE_URL="postgresql://username:password@localhost:5432/mydatabase"

4. Prisma Schema 정의

이제 데이터베이스 모델을 정의해야 합니다. 예를 들어 블로그 애플리케이션을 만든다고 가정해 보겠습니다. 아래는 사용자의 데이터 모델을 정의하는 예시입니다.


model User {
  id    Int     @id @default(autoincrement())
  name  String
  email String  @unique
  posts Post[]
}

model Post {
  id        Int     @id @default(autoincrement())
  title     String
  content   String
  published Boolean @default(false)
  authorId  Int
  author    User    @relation(fields: [authorId], references: [id])
}

5. Migrations 생성 및 실행

Prisma에서 데이터베이스 스키마를 변경하고 이를 데이터베이스에 적용하기 위해 Migrations를 사용합니다. Migrations를 생성하려면 아래 명령어를 입력합니다:

npx prisma migrate dev --name init

이 명령어는 데이터베이스에 초기 스키마를 반영하고, migrations 폴더에 관련 파일을 생성합니다. 이제 데이터베이스에 스키마가 적용되었으므로 Prisma Client를 사용하여 쿼리를 작성할 수 있습니다.

6. CRUD 기능 구현

이제 Prisma Client를 사용하여 CRUD 기능을 구현해보겠습니다. 아래 코드는 Node.js Express 서버에서 CRUD API를 구현하는 예시입니다.


const express = require('express');
const { PrismaClient } = require('@prisma/client');

const app = express();
const prisma = new PrismaClient();

app.use(express.json());

// Create User
app.post('/users', async (req, res) => {
  const { name, email } = req.body;
  const user = await prisma.user.create({
    data: {
      name,
      email,
    },
  });
  res.json(user);
});

// Read Users
app.get('/users', async (req, res) => {
  const users = await prisma.user.findMany();
  res.json(users);
});

// Update User
app.put('/users/:id', async (req, res) => {
  const { id } = req.params;
  const { name, email } = req.body;
  const user = await prisma.user.update({
    where: { id: Number(id) },
    data: { name, email },
  });
  res.json(user);
});

// Delete User
app.delete('/users/:id', async (req, res) => {
  const { id } = req.params;
  await prisma.user.delete({ where: { id: Number(id) } });
  res.json({ message: 'User deleted' });
});

const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
  console.log(`Server is running on http://localhost:${PORT}`);
});

7. Prisma Client 사용 예시

위의 API 예시에서 사용한 Prisma Client는 데이터베이스 상호작용을 매우 직관적으로 도와줍니다. 각 메서드는 CRUD 연산을 쉽게 수행할 수 있도록 설계되어 있습니다. 여기서는 각 연산에 대해 설명하겠습니다.

  • Create: 사용자를 생성하는 prisma.user.create 메서드를 사용하여 새 사용자 레코드를 추가합니다.
  • Read: prisma.user.findMany를 사용하여 모든 사용자 레코드를 조회합니다.
  • Update: prisma.user.update 메서드를 사용하여 특정 사용자의 정보를 업데이트합니다. 이때 사용자 ID를 통해 정확한 레코드를 지정합니다.
  • Delete: prisma.user.delete 메서드를 사용하여 특정 사용자를 삭제합니다.

8. Prisma의 Migrations 활용

Prisma에서 Migrations은 데이터베이스 스키마의 버전을 관리할 수 있도록 해줍니다. 이는 여러 개발자가 동시에 작업할 때 데이터베이스에 일관성을 유지하게 해 줍니다. 데이터베이스 스키마에 변경 사항이 있을 경우 항상 새로운 Migration을 생성하고 실행하는 것이 좋습니다.

예를 들어, 새로운 Post 모델을 추가하고 이를 데이터베이스에 반영하고 싶다면, 아래와 같은 단계를 거치게 됩니다:


// 기존 schema.prisma에 Post 모델 추가
model Post {
  id        Int     @id @default(autoincrement())
  title     String
  content   String
  published Boolean @default(false)
  authorId  Int
  author    User    @relation(fields: [authorId], references: [id])
}

// Migration 생성 및 실행
npx prisma migrate dev --name add-post-model

9. 결론

이번 강좌를 통해 Prisma를 사용하여 백엔드에서 데이터베이스를 쉽고 빠르게 관리할 수 있는 방법을 배웠습니다. Prisma의 강력한 기능을 활용하면 ORM의 복잡성을 줄이고, 데이터베이스 작업을 더욱 직관적으로 할 수 있습니다. Migrations는 데이터베이스 스키마 변경을 효율적으로 관리할 수 있도록 도와줍니다. CRUD 기능을 구현하는 과정을 통해 Prisma Client의 편리함도 경험하셨기를 바랍니다.

이와 같은 방법으로 모든 데이터베이스 관련 작업을 쉽게 수행할 수 있는 Prisma를 이용하여 반응형 웹 애플리케이션의 백엔드를 더욱 견고하게 구축해 보세요. 향후에도 Prisma와 관련된 더 많은 주제를 다뤄보도록 하겠습니다.