mysql 사용 기준으로 작성되어 몇몇 기능 및 지원에 대한 내용이 없을 수 있습니다.
설명
Prisma는 데이터베이스와 상호작용하기 위한 현대적인 ORM(Object-Relational Mapping) 도구입니다. TypeScript 및 JavaScript와 함께 주로 사용되며, 간단하고 타입 안전한 방식으로 데이터베이스 작업을 처리할 수 있도록 도와줍니다. Prisma는 스키마 정의, 데이터베이스 마이그레이션, 데이터 쿼리 및 관리에 초점을 맞춘 풀스택 개발자 도구입니다.
prisma 의 컨셉 및 장점
- 객체 관점: 관계형 데이터를 매핑하는 대신 객체 지향적으로 처리.
- 함수형 쿼리: 복잡한 모델 객체 대신 함수 기반 쿼리 사용.
- 단일 진실 소스: 데이터베이스와 애플리케이션 모델의 단일화된 관리.
- 건강한 제약 조건: 안티패턴 방지와 안전한 데이터베이스 작업 지원 (필수 값 설정, 고유 값 설정 등등).
- 타입 안전성: 컴파일 시점에 쿼리 타입 검증으로 오류 예방.
- 보일러플레이트 감소: 반복 작업을 줄여 핵심 로직에 집중.
- 자동 완성 지원: 코드 에디터에서 문서 참조 없이 작업 가능.
주요 키워드 및 개념
- Prisma Client
Prisma의 주요 구성 요소로, 데이터베이스와 상호작용하기 위한 자동 생성된 타입 안전 쿼리 빌더입니다.
- Prisma Schema
.prisma 파일에 작성되며, 데이터베이스 스키마를 정의하고 데이터 모델과 관계를 설정합니다. 이를 통해 Prisma Client를 생성합니다.
- Prisma Migrate
데이터베이스 마이그레이션을 생성 및 관리하는 도구입니다. Prisma Schema를 기준으로 데이터베이스 구조를 변경합니다.
- Prisma Studio
데이터베이스의 데이터를 브라우저에서 관리할 수 있는 시각적 인터페이스를 제공합니다.
설치 및 초기 세팅
// prisma 설치
npm install prisma
// prisma 초기 세팅
npx prisma init
// prisma init 과정
// 1. 데이터베이스 연결 변수와 스키마 모델이 포함된 Prisma 스키마를 포함하는 schema.prisma 라는 파일을 포함하는 prisma 라는 새 디렉토리를 만듭니다.
// 2. 프로젝트의 루트 디렉토리에 .env 파일을 생성합니다. 이 파일은 환경 변수(예: 데이터베이스 연결)를 정의하는 데 사용됩니다.
- db 연결
Prisma 스키마의 datasource 블록의 url 필드를 데이터베이스 연결 URL 로 설정
// prisma/schema.prisma
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
- Prisma Client 설치
# 설치
npm install @prisma/client
구현 과정
1. Schema 기반 데이터 모델링
// prisma/schema.prisma
generator client {...}
datasource db {...}
// 모델링 부분
model Post {
id Int @id @default(autoincrement())
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
title String @db.VarChar(255)
content String?
published Boolean @default(false)
author User @relation(fields: [authorId], references: [id])
authorId Int
}
model Profile {
id Int @id @default(autoincrement())
bio String?
user User @relation(fields: [userId], references: [id])
userId Int @unique
}
model User {
id Int @id @default(autoincrement())
email String @unique
name String?
posts Post[]
profile Profile?
}
2. Prisma Client 를 통한 DB 작업
Prisma Client는 Prisma Schema를 기반으로 생성되며, 데이터베이스 작업 시 타입 안전성과 자동 완성 기능을 제공합니다.
// Prisma Client 의 데이터베이스 쿼리 사용
import { PrismaClient } from '@prisma/client'
const prisma = new PrismaClient()
// 데이터베이스에 쿼리를 보내기 위해 main 이라는 비동기 함수를 정의
async function main() {
// 쿼리 사용
await prisma.user.create({
data: {
name: 'Alice',
email: 'alice@prisma.io',
posts: {
create: { title: 'Hello World' },
},
profile: {
create: { bio: 'I like turtles' },
},
},
})
const allUsers = await prisma.user.findMany()
}
main()
.then(async () => {
await prisma.$disconnect()
})
.catch(async (e) => {
console.error(e)
await prisma.$disconnect()
process.exit(1)
})
3. 스키마 변경 업데이트
"npx prisma migrate dev", "npx prisma db push" 중 하나를 사용해 처리할 수 있습니다.
npx prisma migrate dev
- 목적: 이 명령어는 Prisma 스키마 변경 사항을 기반으로 새 마이그레이션을 생성하고 적용합니다. 변경 사항의 기록을 유지하는 마이그레이션 파일을 생성합니다.
- 사용 이유: 데이터베이스 변경 기록을 유지하고 싶을 때 사용, 이는 프로덕션 환경이나 팀으로 작업할 때 필수적입니다. 데이터베이스 스키마의 버전 관리를 가능하게 합니다.
- 이점: 이 명령어에는 데이터 무결성을 보장하기 위해 마이그레이션을 제어된 방식으로 적용하는 검사도 포함되어 있습니다.
npx prisma db push
- 목적: 이 명령어는 현재 프리즈마 스키마를 데이터베이스에 직접 푸시하는 데 사용됩니다. 마이그레이션 파일을 생성하지 않고도 스키마에 변경 사항을 적용합니다.
- 사용 이유: 데이터베이스 스키마를 프리마 스키마와 빠르게 동기화하고 싶을 때 마이그레이션 기록에 대한 걱정 없이 개발 단계에서 특히 유용합니다.
- 주의: 스키마 변경이 기존 테이블이나 열에 영향을 미칠 경우 데이터를 덮어쓸 수 있으므로 초기 단계의 개발이나 프로토타이핑에 가장 적합합니다.
prisma studio
Prisma Studio 는 데이터베이스의 데이터를 위한 시각적 편집기로 명령어 실행 시 로드된 페이지에서 데이터를 관리할 수 있습니다.
npx prisma studio
주요 쿼리 메서드
- findUnique
고유 키를 기반으로 특정 데이터를 검색합니다.
const user = await prisma.user.findUnique({
where: { id: 1 },
});
- findMany
여러 데이터를 검색합니다.
const posts = await prisma.post.findMany({
where: { authorId: 1 },
});
- create
새 데이터를 생성합니다.
const newUser = await prisma.user.create({
data: { name: "Alice" },
});
- update
데이터를 수정합니다.
const updatedUser = await prisma.user.update({
where: { id: 1 },
data: { name: "Updated Name" },
});
- delete
데이터를 삭제합니다.
const deletedUser = await prisma.user.delete({
where: { id: 1 },
});
참고
'Prisma' 카테고리의 다른 글
[Prisma] 6. Pagination & Aggregation (0) | 2025.01.18 |
---|---|
[Prisma] 5. Nested Queries (0) | 2025.01.17 |
[Prisma] 4. query filtering & sorting (0) | 2025.01.17 |
[Prisma] 3. Prisma query 사용 (CRUD, query options) (0) | 2025.01.14 |
[Prisma] 2. Prisma Model 디테일 (0) | 2025.01.12 |