개발·튜토리얼

Prisma 입문 가이드: 5분 만에 이해하는 현대적 ORM

SQL 몰라도 괜찮아요. Prisma로 데이터베이스를 다루는 가장 쉬운 방법을 코드 예시와 함께 설명합니다. 초보 개발자를 위한 완벽 가이드.

CC
클론코딩 팀
4분 읽기

Prisma 입문 가이드: 5분 만에 이해하는 현대적 ORM

"데이터베이스 연결하려는데... SQL 문법이 헷갈려요."

--- 썸네일
--- 썸네일

이런 경험 있으신가요? SELECT, JOIN, WHERE... 매번 구글링하면서 SQL 쿼리를 작성하는 건 정말 피곤한 일입니다. 특히 타입 에러까지 만나면 디버깅에 하루를 날리기도 하죠.

Prisma는 이 문제를 해결해줍니다. SQL을 몰라도 JavaScript/TypeScript 코드만으로 데이터베이스를 다룰 수 있게 해주는 도구입니다. 이 글에서는 Prisma가 무엇인지, 어떻게 시작하는지 실제 코드와 함께 알려드립니다.

💡 이 글을 읽으면 알 수 있는 것:

  • Prisma가 뭔지, 왜 쓰는지
  • 10줄로 DB 연결하는 방법
  • 실제 CRUD 코드 예시

목차

  1. Prisma란? 한 문장 정의
  2. 왜 Prisma를 쓰나요? (vs 기존 방식)
  3. 5분 만에 시작하기: 설치부터 첫 쿼리까지
  4. 실전 CRUD 코드 예시
  5. 마무리

Prisma란? 한 문장 정의

Prisma = JavaScript/TypeScript로 데이터베이스를 쉽게 다루게 해주는 도구(ORM)

Prisma란? 한 문장 정의 관련 이미지
Prisma란? 한 문장 정의 관련 이미지

ORM(Object-Relational Mapping)이라는 용어가 어렵게 느껴질 수 있어요. 쉽게 말하면:

기존 방식Prisma 사용 시
SQL 쿼리 직접 작성JavaScript 코드로 작성
타입 체크 없음TypeScript 자동 타입 지원
DB별로 문법 다름동일한 코드, DB만 교체

지원하는 데이터베이스

Prisma는 다양한 DB를 지원합니다:

  • 관계형 DB: PostgreSQL, MySQL, SQLite, SQL Server
  • NoSQL: MongoDB
  • 서버리스: PlanetScale, Neon, Supabase

💡 Pro Tip: 개발할 때는 SQLite(파일 기반)로 시작하고, 배포할 때 PostgreSQL로 바꾸는 패턴이 인기 있어요. 코드 변경 거의 없이 가능합니다!


왜 Prisma를 쓰나요?

문제 상황: 기존 방식의 불편함

SQL을 직접 쓰면 이런 코드가 됩니다:

// 😰 기존 방식: SQL 직접 작성
const users = await db.query(
  'SELECT * FROM users WHERE email = ? AND deleted_at IS NULL',
  [email]
);
// 결과 타입이 any... 오타 있어도 런타임에서야 발견됨

본문 관련 이미지
본문 관련 이미지

해결책: Prisma 방식

// 😊 Prisma 방식: 타입 안전한 코드
const users = await prisma.user.findMany({
  where: {
    email: email,
    deletedAt: null
  }
});
// 자동완성 지원 + 타입 체크 + 오타는 컴파일 에러로 즉시 발견

Prisma의 3가지 핵심 장점

1. 타입 안전성

  • 스키마에서 자동으로 TypeScript 타입 생성
  • 잘못된 필드명 쓰면 빨간 줄로 바로 알려줌

2. 직관적인 API

  • findMany, create, update, delete
  • 영어 읽듯이 코드를 읽을 수 있음

3. 마이그레이션 자동화

  • 스키마 바꾸면 DB 테이블 자동 업데이트
  • SQL 마이그레이션 스크립트 직접 안 써도 됨

5분 만에 시작하기

5분 만에 시작하기 관련 이미지
5분 만에 시작하기 관련 이미지

Step 1: 설치

# 프로젝트 폴더에서 실행
npm install prisma --save-dev
npm install @prisma/client
 
# Prisma 초기화
npx prisma init

실행하면 2개 파일이 생성됩니다:

  • prisma/schema.prisma - DB 스키마 정의 파일
  • .env - DB 연결 정보

Step 2: 스키마 작성

prisma/schema.prisma 파일을 열고 모델을 정의합니다:

// prisma/schema.prisma
 
// 1. DB 연결 설정
datasource db {
  provider = "sqlite"    // 또는 "postgresql", "mysql"
  url      = "file:./dev.db"  // SQLite는 파일 경로
}
 
// 2. Prisma Client 생성 설정
generator client {
  provider = "prisma-client-js"
}
 
// 3. 데이터 모델 정의 (테이블)
model User {
  id        Int      @id @default(autoincrement())
  email     String   @unique
  name      String?
  posts     Post[]
  createdAt DateTime @default(now())
}
 
model Post {
  id        Int      @id @default(autoincrement())
  title     String
  content   String?
  published Boolean  @default(false)
  author    User     @relation(fields: [authorId], references: [id])
  authorId  Int
}

스키마 문법 빠른 정리:

문법의미예시
@id기본키id Int @id
@unique유니크 제약email String @unique
@default()기본값@default(now())
?선택적 필드name String?
[]일대다 관계posts Post[]

Step 3: DB에 반영하기

# 스키마를 DB에 반영 (테이블 생성)
npx prisma db push
 
# Prisma Client 생성 (타입 정의 파일)
npx prisma generate

Step 4: 코드에서 사용하기

// src/index.ts
import { PrismaClient } from '@prisma/client'
 
const prisma = new PrismaClient()
 
async function main() {
  // 유저 생성
  const user = await prisma.user.create({
    data: {
      email: 'alice@example.com',
      name: 'Alice'
    }
  })
  console.log('생성된 유저:', user)
}
 
main()

💡 Pro Tip: npx prisma studio 명령어를 실행하면 브라우저에서 DB를 GUI로 볼 수 있어요!


실전 CRUD 코드 예시

Create (생성)

// 단일 생성
const user = await prisma.user.create({
  data: {
    email: 'bob@example.com',
    name: 'Bob'
  }
})
 
// 관계 데이터와 함께 생성
const userWithPost = await prisma.user.create({
  data: {
    email: 'charlie@example.com',
    name: 'Charlie',
    posts: {
      create: {
        title: '첫 번째 글',
        content: '안녕하세요!'
      }
    }
  }
})

Read (조회)

// 전체 조회
const allUsers = await prisma.user.findMany()
 
// 조건 조회
const user = await prisma.user.findUnique({
  where: { email: 'alice@example.com' }
})
 
// 관계 데이터 포함 조회
const userWithPosts = await prisma.user.findUnique({
  where: { id: 1 },
  include: { posts: true }  // 해당 유저의 posts도 가져옴
})
 
// 필터링 + 정렬 + 페이지네이션
const recentUsers = await prisma.user.findMany({
  where: {
    name: { contains: 'a' }  // 이름에 'a' 포함
  },
  orderBy: { createdAt: 'desc' },  // 최신순
  take: 10,  // 10개만
  skip: 0    // 0번째부터
})

Update (수정)

// 단일 수정
const updatedUser = await prisma.user.update({
  where: { id: 1 },
  data: { name: 'Alice Kim' }
})
 
// 여러 개 수정
const updateMany = await prisma.post.updateMany({
  where: { published: false },
  data: { published: true }
})

Delete (삭제)

// 단일 삭제
const deletedUser = await prisma.user.delete({
  where: { id: 1 }
})
 
// 조건부 삭제
const deleteMany = await prisma.post.deleteMany({
  where: { published: false }
})

체크리스트: Prisma CRUD 요약

  • create() - 데이터 생성
  • findMany() / findUnique() - 데이터 조회
  • update() / updateMany() - 데이터 수정
  • delete() / deleteMany() - 데이터 삭제

마무리

Prisma를 사용하면:

  • ✅ SQL 없이 DB를 다룰 수 있습니다
  • ✅ TypeScript 타입 자동 생성으로 버그를 줄입니다
  • ✅ 직관적인 API로 개발 속도가 빨라집니다

마무리 관련 이미지
마무리 관련 이미지

다음 단계로 추천하는 것:

  1. 공식 문서의 Quickstart 따라하기
  2. npx prisma studio로 데이터 직접 확인해보기
  3. 간단한 TODO 앱 만들어보기

🚀 지금 바로 시작해보세요!

npx prisma init

자주 묻는 질문 (FAQ)

Q1: Prisma는 무료인가요?

네, Prisma ORM 자체는 완전 무료 오픈소스입니다. Prisma Accelerate(캐싱), Prisma Pulse(실시간) 같은 클라우드 서비스는 유료 플랜이 있습니다.

Q2: 기존 DB에 Prisma를 연결할 수 있나요?

네, npx prisma db pull 명령어로 기존 DB의 테이블 구조를 스키마 파일로 자동 생성할 수 있습니다. 이를 "introspection"이라고 합니다.

Q3: Prisma vs TypeORM, 뭐가 다른가요?

  • Prisma: 스키마 파일로 모델 정의, 자동 타입 생성, 직관적 API
  • TypeORM: 데코레이터로 모델 정의, 더 많은 설정 옵션, ActiveRecord 패턴 지원

초보자에게는 Prisma가 더 쉽고, 복잡한 레거시 시스템에는 TypeORM이 유연할 수 있습니다.


📌 관련 콘텐츠 추천:

CC

클론코딩 팀

튜토리얼 기반 학습의 새로운 기준을 만들어가는 클론코딩입니다.

개발 교육콘텐츠 크리에이터