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의 가장 큰 강점입니다.