728x90
728x90

프리즈마(Prisma)

들어가며

  • ORM(Object-Relational Mapping) 도구 중 하나인 프리즈마(Prisma)에 대해 정리해본다.

 

프리즈마(Prisma)

개념

  • ORM(Object-Relational Mapping) 도구
  • 데이터베이스애플리케이션 간의 인터페이스를 간편하게 만들어주는 개발 도구
  • 주로 Node.jsTypeScript 환경에서 사용된다.
  • SQL 쿼리를 직접 작성할 필요 없이 안전한 타입의 코드를 통해 데이터베이스와 상호작용할 수 있도록 도와준다.

 

ORM(Object-Relational Mapping)

  • 객체 지향 프로그래밍 언어에서 사용하는 객체(Object)관계형 데이터베이스(Relational Database)의 테이블 간의 매핑을 자동화하는 기술
  • 데이터베이스의 데이터를 SQL이 아닌, 프로그래밍 언어의 객체(Object)를 통해 조작할 수 있도록 해준다.
  • 대표적으로 다음과 같은 도구들이 있다.
    • JavaScript / TypeScript : Prisma, Sequelize, TypeORM
    • Python : SQLAlchemy, Django ORM
    • Java : Hibernate
    • PHP : Eloquent (Laravel)
  • 장점
    • SQL을 직접 작성하지 않아도 되므로 개발 속도가 빨라진다.
    • 객체 지향 언어의 코드와 데이터베이스의 스키마가 잘 연동되기 때문에 코드 변경 시 유지보수가 쉽다.
    • 객체와 데이터베이스 간의 타입을 맞춰주므로, 데이터 타입 오류를 미리 방지할 수 있다.
    • ORM을 사용하면 코드가 특정 데이터베이스에 종속되지 않고 데이터베이스를 교체하더라도 큰 코드 수정 없이 동작할 수 있다.
  • 단점
    • 복잡한 쿼리를 자동으로 생성하면서 성능이 저하될 수 있다.
    • ORM 도구를 처음 사용하는 데 시간이 걸릴 수 있다.
    • 매우 복잡한 쿼리에서는 SQL이 더 효율적일 수 있다.

 

ORM은 코드와 데이터베이스 간의 매핑을 효율화하여 개발 속도를 높이고 오류를 줄여주며, 유지보수를 쉽게 만들어준다. 특히 팀 개발 환경에서 데이터베이스 작업을 일관되게 처리할 수 있어 유용하다.

 

예제 코드
const { PrismaClient } = require('@prisma/client');
const prisma = new PrismaClient();

async function createUser() {
  const user = await prisma.user.create({
    data: {
      name: 'Alice',
      email: 'alice@example.com',
    },
  });
  console.log(user);
}

createUser();

 

설치하기

패키지 설치하기

  • 아래의 명령을 실행하여 프리즈마를 설치한다.
  • @--save-dev@ 옵션은 해당 패키지를 개발 의존성(devDependency)으로 설치하게 해준다.
    • 이 패키지는 개발 중에만 필요하고, 배포 시에는 사용되지 않는다.
    • 실제 배포 환경에서는 Prisma 클라이언트만 필요하다.
$ npm install prisma --save-dev
$ npm install @prisma/client

 

  • 아래 명령을 실행하여 프리즈마를 초기화해준다.
$ npx prisma init

 

⇒ 프로젝트에 @.env@ 파일과 @/migrations/schema.prisma@ 파일이 생성된다.

 

 

VS Code 확장 설치하기

  • @Prisma@ 확장을 검색하여 설치한다.
 

Prisma - Visual Studio Marketplace

Extension for Visual Studio Code - Adds syntax highlighting, formatting, auto-completion, jump-to-definition and linting for .prisma files.

marketplace.visualstudio.com

 

데이터베이스 스키마 설정하기

/prisma/schema.prisma 

  • 데이터베이스 모델을 정의한다.
datasource db {
  provider          = "postgresql"
  url               = env("DATABASE_URL")
  directUrl         = env("DIRECT_URL")
}

generator client {
  provider = "prisma-client-js"
}

model User {
  id    Int    @id @default(uuid())
  name  String
}

 

/.env

  • @DATABASE_URL@은 Transaction + Password + @"?pgbouncer=true@connection_limit=1"@로 지정해준다.
  • @DIRECT_URL@은 Session + Password와 같이 지정해준다.
DATABASE_URL=""
DIRECT_URL=""

 

사용 예 : Supabase
  • @Mode: Transaction@ Connection 주소를 복사해서, @.env@ 파일의 @DATABASE_URL@의 값으로 넣어준다.
    • @[YOUR-PASSWORD]@ 부분에는 Supbase에서 프로젝트를 생성할 때 지정했던 비밀번호를 넣어준다.

 

  • @Mode: Session@Connect 주소를 복사해서 @,env@ 파일의 @DIRECT_URL@의 값으로 넣어준다.

 

 

마이그레이션 실행하기

  • 아래 명령을 실행하여 마이그레이션을 실행한다.
$ npx prisma migrate dev --name init

 

  • 아래 명령을 실행하여 @schema.prisma@ 파일의 스키마를 데이터베이스에 적용한다.
$ npx prisma db push

 

@schema.prisma@ 파일에 새로운 모델을 정의할 경우, @npx prisma db push@ 명령을 실행해야 업데이트된 내용이 반영된다.

 

Prisma Studio 실행하기

Prisma Studio

  • 웹 인터페이스를 제공하며, 코드 없이 데이터베이스를 관리할 수 있게 해주는 도구이다.
  • 데이터베이스에 있는 테이블의 데이터를 확인하고 CRUD 작업(생성, 읽기, 수정, 삭제)을 직관적으로 수행할 수 있다.
  • 로컬 개발 환경에서 편리하게 데이터의 상태를 확인하거나, 직접 데이터 조작을 할 수 있다.

 

실행하기

  • 아래 명령을 실행하여 Prisma Studio을 실행할 수 있다.
$ npx prisma studio

Prisma Studio의 실행 모습

 

CRUD 연산해보기

레코드 1개 생성하기 (CREATE)

const task = await prisma.task.create({
  data: {
    content: 'some task',
  },
});

 

모든 레코드 가져오기 (READ)

const tasks = await prisma.task.findMany();

 

특정 레코드 가져오기 (READ)

  • 고유 식별자(Unique Identifier) 또는 ID를 이용하여 특정 레코드를 가져올 수 있다.
// By unique identifier
const user = await prisma.user.findUnique({
  where: {
    email: 'elsa@prisma.io',
  },
});

// By ID
const task = await prisma.task.findUnique({
  where: {
    id: id,
  },
});

 

레코드 업데이트하기 (UPDATE)

const updateTask = await prisma.task.update({
  where: {
    id: id,
  },
  data: {
    content: 'updated task',
  },
});

 

레코드 업데이트 또는 생성하기 (CREATE / UPDATE)

const upsertTask = await prisma.task.upsert({
  where: {
    id: id,
  },
  update: {
    content: 'some value',
  },
  create: {
    content: 'some value',
  },
});

 

레코드 삭제하기 (DELETE)

const deleteTask = await prisma.task.delete({
  where: {
    id: id,
  },
});

 

참고 사이트

 

Prisma | Simplify working and interacting with databases

Build, fortify, and grow your application easily with an intuitive data model, type-safety, automated migrations, connection pooling, caching, and real-time database subscriptions.

www.prisma.io

 

Prisma Documentation

Get started with Prisma in the official documentation, and learn more about all Prisma's features with reference documentation, guides, and more.

www.prisma.io

 

728x90
728x90

'DevOps > Service' 카테고리의 다른 글

[Service] Supabase  (1) 2024.10.21