Prisma란?

박찬효·2023년 5월 9일
0

🧑🏻‍💻 Prisma이란?


Prisma는 오픈 소스 차세대 ORM입니다. 다음 부분으로 구성됩니다.

  • Prisma 클라이언트 : Node.js 및 TypeScript용 자동 생성 및 유형 안전 쿼리 빌더

  • Prisma Migrate : 마이그레이션 시스템

  • Prisma Studio : 데이터베이스에서 데이터를 보고 편집하는 GUI이다.

Prisma Studio는 오픈 소스가 아닌 Prisma ORM의 유일한 부분입니다. Prisma Studio는 로컬에서만 실행할 수 있습니다. Prisma Studio는 Data Browser 라는 이름으로 Prisma Data Platform 에 통합되어 있습니다 . 데이터 브라우저에서 각 프로젝트의 데이터를 보고 편집할 수 있으며 다른 팀원도 적절한 역할 과 함께 권한을 부여한 후 동일한 작업을 수행할 수 있습니다 .

다른 ORM들의 많은 문제점들은 객체 지향 방식으로 관계형 데이터 베이스 테이블을 매핑하지만 Prisma는 Prisma shcema로 선언적인 모델을 정의해서 복잡한 모델 인스턴스를 관리하는데 안전하게 데이터를 읽고 쓸 수 있다.

🤔 Why Prisma?


관계형 데이터베이스 작업은 애플리케이션 개발의 주요 병목 현상이다. SQL쿼리 또는 복잡한 ORM 개체를 디버깅하는 데 종종 개발 시간이 많이 소요된다.

Prisma는 데이터베이스 쿼리를 제출하기 위한 명확하고 형식이 안전한 API를 제공하여 개발자가 데이터 베이스 쿼리에 대해 쉽게 추론할 수 있도록 한다.

Prisma docs를 보게 되면 가장 먼저 프리즈마가 추구하는 것은 "개발자의 생산성" 이다.
원시적으로 SQL을 작성하는 것이나, 기존의 ORM은 개발자의 생산성을 떨어 뜨린다고 주장한다.

1. 원시적 SQL 문제점

원시적으로 SQL을 작성하는 방법은 번거롭고 많은 오버헤드(수동연결,반복적인 상용구)등을 발생 시켜 생산성이 저하되고, 뿐만 아니라 쿼리 결과에 대한 타입 안정성을 얻을 수 도 없다.

2. ORM

  • 관계형 데이터베이스 : 데이터는 일반적으로 정규화 되며 외래 키를 사용하여 엔티티 간에 연결한다. 그런 다음 엔티티를 조인하여 실제 관계를 나타낸다.

  • 객체 지향 : 객체는 단순히 점 표기법을 사용하여 관계를 트래버스할 수 있는 깊게 중첩된 구조이다.

이는 ORM의 주요 함정 중 하나를 암시하고 친숙한 점 표기법을 사용하여 관계를 순회할 수 있는 것처럼 보이지만 내부적으로 ORM은 비용이 많이 들고 애플리케이션 속도를 크게 저하시킬 가능성이 있는 SQL JOIN을 생성한다.

결론을 말하면 ORM의 매력은 관계형 모델을 추상화하고 순수하게 개체 측면에서 데이터를 생각한다는 전제이다. 전제는 훌륭하지만 관계형 데이터가 객체에 쉽게 매핑될 수 있다는 잘못된 가정을 기반으로 하여 많은 복잡성과 위험을 초래한다.

🛠️ REST API 서버 예시

  • Prisma 스키마
datasource db {
  provider = "sqlite"
  url      = "file:./dev.db"
}

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

model Post {
  id        Int     @id @default(autoincrement())
  title     String
  content   String?
  published Boolean @default(false)
  author    User?   @relation(fields: [authorId], references: [id])
  authorId  Int?
}

model User {
  id    Int     @id @default(autoincrement())
  email String  @unique
  name  String?
  posts Post[]
}

이제 들어오는 HTTP 요청이 도착하면 데이터베이스 작업을 수행하기 위해 생성된 Prisma 클라이언트 API를 사용하는 경로 컨트롤러 를 구현할 수 있다.

  • Controller (Nest.js)
@Get('feed')
  async getPublishedPosts(): Promise<PostModel[]> {
    return this.postService.posts({
      where: { published: true },
      includes: { author: true },
    });
  }

feed이 경우 엔드포인트는 개체를 포함하는 Post개체의 중첩된 JSON응답을 반환한다.

[
  {
    "id": "21",
    "title": "Hello World",
    "content": "null",
    "published": "true",
    "authorId": 42,
    "author": {
      "id": "42",
      "name": "Alice",
      "email": "alice@prisma.io"
    }
  }
]

참고한 사이트
https://www.prisma.io/
https://fomaios.tistory.com/entry/Nodejs-Prisma%EB%9E%80-feat-%EC%82%AC%EC%9A%A9%ED%95%B4%EC%95%BC-%EB%90%98%EB%8A%94-%EC%9D%B4%EC%9C%A0

profile
개발자가 되기 위한 1인

0개의 댓글