iBetter Books
수정

Ch 04. Prisma로 데이터베이스 연동하기

API가 생겼다면 이제 데이터를 저장할 차례입니다. 서버를 재시작해도 데이터가 사라지지 않으려면 데이터베이스가 필요합니다. 이 장에서는 Prisma ORM과 SQLite를 사용해 Nuxt 서버에 데이터베이스를 연결합니다.

SQLite는 파일 하나가 곧 데이터베이스입니다. 별도 서버 설치가 필요 없어 개발 단계에서 시작하기에 가장 간편합니다.

Prisma 설치와 초기화

프로젝트 루트에서 Prisma를 설치하고 초기화합니다.

npm install prisma @prisma/clientnpx prisma init --datasource-provider sqlite

실행하면 prisma/schema.prisma 파일과 .env 파일이 생성됩니다.

스키마 작성

prisma/schema.prisma에 데이터베이스 구조를 정의합니다.

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

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

model Post {
  id        Int      @id @default(autoincrement())
  title     String
  content   String
  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt
}

@id는 기본 키, @default(autoincrement())는 자동 증가 정수, @default(now())는 생성 시각 자동 기록, @updatedAt은 수정 시각 자동 갱신을 의미합니다.

환경변수 설정

.env 파일에 데이터베이스 파일 경로를 설정합니다.

DATABASE_URL="file:./dev.db"

prisma/dev.db 파일이 실제 SQLite 데이터베이스 파일이 됩니다. 이 파일은 .gitignore에 추가해 버전 관리에서 제외하는 것이 일반적입니다.

마이그레이션 실행

스키마를 작성했다면 마이그레이션을 실행해서 실제 데이터베이스 테이블을 생성합니다.

npx prisma migrate dev --name initnpx prisma studio  # DB 데이터 확인

prisma migrate dev는 스키마 변경 사항을 분석해 SQL 마이그레이션 파일을 생성하고 바로 적용합니다. prisma studio를 실행하면 브라우저에서 데이터를 직접 조회하고 편집할 수 있는 GUI가 열립니다.

usePrisma() 유틸리티 만들기

개발 중에는 파일 변경마다 서버가 재시작됩니다. 이때마다 PrismaClient 인스턴스가 새로 생성되면 데이터베이스 연결이 과도하게 쌓이는 문제가 생깁니다. 싱글톤 패턴으로 인스턴스를 하나만 유지합니다.

// server/utils/prisma.tsimport { PrismaClient } from '@prisma/client'const prisma = new PrismaClient()export function usePrisma() {  return prisma}

server/utils/ 폴더에 파일을 넣으면 Nitro가 자동으로 임포트합니다. 서버 API 파일에서 import 구문 없이 usePrisma()를 바로 호출할 수 있습니다.

// server/api/posts/index.get.ts — usePrisma() 사용 예export default defineEventHandler(async () => {  return await usePrisma().post.findMany()})

Prisma는 타입 안전한 쿼리를 제공합니다. findMany, findUnique, create, update, delete 등의 메서드가 모두 TypeScript 타입과 함께 자동 완성됩니다. SQL을 직접 작성하지 않아도 복잡한 쿼리를 안전하게 실행할 수 있다는 점이 Prisma의 가장 큰 강점입니다.