1. Prisma란?
- Prisma: Node.js 기반의 ORM(Object-Relational Mapping) 도구로,
- 데이터베이스와의 상호 작용을 단순화하고 개발 생산성을 높이는 데 도움을 주는 도구
- SQL 쿼리를 직접 작성하는 대신 자바스크립트 코드로 쿼리를 작성할 수 있게 해주며,
- 타입 세이프한 쿼리 작성을 통해 런타임 에러를 방지
타입 세이프 쿼리: 쿼리를 자바스크립트 코드로 작성하므로 타입 에러를 사전에 방지자동 마이그레이션: 데이터베이스 스키마 변경을 감지하고 자동으로 마이그레이션을 처리하여 스키마 관리를 간소화강력한 문법: 복잡한 쿼리 및 데이터베이스 관계를 다루기 위한 강력한 문법 제공
2. Prisma 개념 (구성 요소)
Prisma Client: Node.js & TypeScript용 쿼리 작성 클라이언트Prisma Migrate: 마이그레이션 시스템Prisma Studio: 데이터베이스의 데이터를 보고 편집하는 GUI- 개발자가 직접 SQL문을 작성하지 않아도, 데이터베이스와 상호작용할 수 있는 ORM
- 타 ORM과는 달리, 자체적인 스키마 문법 제공하여 직접 DB 마이그레이션, 클라이언트 코드 생성 등 작업 가능
- 위에 언급한 간편한 CLI, Prisma Studio등 편리한 GUI 도구 제공하여 생산성 향상
3. Prisma 기능
Prisma Client: 데이터베이스와 상호 작용하기 위한 자바스크립트 코드를 자동으로 생성해주는 도구스키마 정의: 데이터베이스 스키마를 정의하고 관리DB 마이그레이션: 데이터베이스 스키마 변경을 추적하고 적용할 수 있는 마이그레이션 기능 제공DB 관계 정의: 복잡한 데이터베이스 관계를 정의하고 쿼리 기능 제공
4. Prisma 스키마 알아보기
1// 모델2model Post {3// 필드 : 타입4id Int5title String6author User? @relation(fields: [authorId], refrences: [id]) // 관계7}
모델 (Model): 모델은 데이터베이스의 특정 테이블이나 컬렉션과 대응.- Prisma에서 모델을 정의하면 해당 모델에 대한 데이터베이스 테이블이나 컬렉션이 생성됨
필드 (Field): 모델 내에서 필드는 해당 모델이 가지는 데이터 속성을 나타냄.- 각 필드는 데이터 타입과제약 조건을 가질 수 있음
관계 (Relation): Prisma에서 관계는 모델 간의 연결을 나타냄.- 두 테이블 간의 외래 키(Foreign Key)를 관리하고 연관된 데이터를 쿼리 가능
4.1 Prisma로 데이터 모델 정의
1// schema.prisma2model User {3id Int @id @default(autoincrement())4email String @unique5name String @unique6posts Post[]7}89model Post {10id Int @id @default(autoincrement())11title String12content String13userId Int14user User @relation(fields: [userId], references: [id])15}
- Prisma에서는 데이터 모델을 정의하여 데이터베이스 테이블과 관련된 개체를 생성함.
- 데이터 모델은 schema.prisma파일에 정의됨
model User, model Post: 데이터베이스의 테이블을 나타냄@id: 기본 키@unique: 데이터 유일성을 나타냄@relation: 테이블간의 관계 정의
5. Prisma 세팅
cf. https://www.prisma.io/docs/orm/prisma-client/setup-and-configuration/generating-prisma-client
Prisma 설치 후, Prisma Client 인스턴스화 해야함. 세팅은 아래 단계를 따라서 적용
(1) Prisma Schema에 generator 정의
1generator client {2provider = "prisma-client-js"3}
(2) prisma/client 패키지 설치 후 prisma 생성
1yarn add @prisma/client2prisma generate
(3) Prisma Client를 인스턴스화해서 사용
1import { PrismaClient } from '@prisma/client'2const prisma = new PrismaClient()3// use `prisma` in your application to read and write data in your DB
6. Prisma 문법 예시: CRUD
cf. https://www.prisma.io/docs/orm/prisma-client/queries/crud
6.1 Create
1import { PrismaClient } from '@prisma/client'23const prisma = new PrismaClient()45// 사용자 생성6const user = await prisma.user.create({7data: {8email: 'elsa@prisma.io',9name: 'Elsa Prisma',10},11})
Prisma로 데이터를 생성하기 위해서는 create API를 사용
6.2 Read
1// 특정 사용자 가져오기2const user = await prisma.user.findUnique({3where: {4email: 'elsa@prisma.io',5},6})78// 조건에 맞는 사용자 모두 가져오기9const users = await prisma.user.findMany({10where: {11OR: [12{13name: {14startsWith: 'E',15},16},17{18AND: {19profileViews: {20gt: 0,21},22role: {23equals: 'ADMIN',24},25},26},27],28},29})
- Prisma로 데이터를 조회하기 위해서 는 findaMany 또는 findUnique와 같은 메서드 사용.
- where, orderBy, include, select 등의 옵션으로 쿼리 조절 가능
6.2.1 Pagination 및 정렬
1const paginatiedUsers = await prisma.user,findMany({2skip : 0,3take : 10,4orderBy : {5username : 'asc',6},7})
- Prisma를 사용하여 쿼리 결과를 페이지항고 정렬할 수 있음
- 아래 명령어로 원하는 데이터들을 페이징 & 정렬할 수 있음
skip: 쿼리 결과에서 처음 몇 개의 항목을 건너뛰고 그 이후의 항목을 반환하는 데 사용take: 쿼리 결과에서 가져올 항목의 개수를 지정하는 데 사용orderBy: 쿼리 결과를 특정 기준으로 정렬하는 데 사용
6.3 Update
1// 사용자 업데이트2const updateUser = await prisma.user.update({3where: {4email: 'viola@prisma.io',5},6data: {7name: 'Viola the Magnificent',8},9})
- 데이터를 수정하기 위해서 update 메서드 사용
- 하나만 수정하기 위해서는 update 메서드 를 사용하고, 여러 레코드를 한번에 업데이 트 하려면 updateMany 사용
6.4 Delete
1// 사용자 삭제2const deleteUser = await prisma.user.delete({3where: {4email: 'bert@prisma.io',5},6})78// 여러 사용자 삭제9const deleteUsers = await prisma.user.deleteMany({10where: {11email: {12contains: 'prisma.io',13},14},15})
- 데이터를 삭제하기 위해서 delete 메서드 사용
- 하나만 삭제하기 위해서는 delete 메서드 사용하고, 여러 레코드 삭제를 위해서는 deleteMany 사용
7. Prisma로 데이터 Seed 작업
1// prisma/seed.ts2import { PrismaClient } from '@prisma/client'34const prisma = new PrismaClient()56async function seed() {7await prisma.user.createMany({8data: [9{ username: '메시', email: '메시@example.com' },10{ username: '호날두', email: '호날두@example.com' },11],12})13}1415seed()16.catch(e => {17throw e18})19.finally(async () => {20await prisma.$disconnect()21})
- Prisma의 Seed 파일을 사용하여 데이터베이스 초기 데이터를 삽입할 수 있음
- 데이터 시드(Seed): 데이터베이스에 초기 데 이터를 삽입하는 작업
- 위과 같이 데이터를 삽입하는 로직이 담긴 시 드 파일을 생성한 후,
npx prisma db seed명령어를 사용해 데이터베이스에 시드 적용