본문 바로가기
Prisma

[Prisma] 1. Prisma 란 무엇인가?

by spare8433 2025. 1. 11.
mysql 사용 기준으로 작성되어 몇몇 기능 및 지원에 대한 내용이 없을 수 있습니다.

설명

Prisma는 데이터베이스와 상호작용하기 위한 현대적인 ORM(Object-Relational Mapping) 도구입니다. TypeScriptJavaScript와 함께 주로 사용되며, 간단하고 타입 안전한 방식으로 데이터베이스 작업을 처리할 수 있도록 도와줍니다. 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 },
});




 

참고

[공식문서] : https://www.prisma.io/docs/getting-started