Prisma 관련 정보정리

👊0👊·2020년 1월 5일
9

graphql 정리

목록 보기
1/2
post-thumbnail

Category: 공부정리
Created Time: Jan 05, 2020 1:35 PM
Last Updated Time: Jan 05, 2020 8:16 PM

들어가기 앞서

이번에 프로젝트를 시작하면서 graphql을 사용해보려고 했다.
일단 만들어 놓긴 했는데, 용어나 개념들이 정리가 안된거 같아서 정리차원에서 글을 쓰려고 한다.

대부분 내용은 공식문서를 참고했다.

Prisma 장점 중 하나는 공식문서가 충실하다는 점이다. 웬만한 레퍼런스는 공식문서에서 볼 수 있다.

prisma

Untitled.png

현대 앱 개발을 위한 데이터베이스 툴이라고 소개한다.
**node.js에서 인기있는 서버개발 스택은 express + sequelize ORM이다.
이 중 prisma는 이런 squelize ORM을 대체하며 추가 기능까지 제공하는
데이터베이스 툴**이다.

이전의 ORM들에서 불편한 작업을 대채한다.

  • Prisma client가 DBMS와 언어(js, ts, go)에 관계없이 자동생성해준다.
  • 어드민 페이지가 매우 편하다.(prisma admin)
  • 모델들의 관계를 정의하기도 매우 편하다.(prisma client)
  • 데이터베이스 서버를 만들기 쉽다.(prisma cloud)
  • REST API, GraphQL, gPRC를 구축할 수 있어 상황에 맞춰 만들면 된다.

개인적 경험으론 장고 orm보다 훨씬 편했고, 딱히 어드민 코딩하지 않아도 웬만한 기능은 있어서 작업이 매우 간편해졌다. 특히 graphql 서버를 만들 때 매우 편리하다.

Prisma - Database tools for modern application development

아키텍처

Untitled 1.png

PrismaAPP or API serverDatabase 사이에 위차한 Data Access Layer다. 아키텍처가 깔금해지기 때문에 불필요한 boilerplate가 필요없어진다.

주요 컨셉

프리즈마를 이해하려면 3가지 컨셉을 알아야한다.(사실 모른상태로 프로젝트를 진행했다.)

  • Datamodel: 애플리케이션의 모델을 정의하고 Prisma 클라이언트 API의 기반(선택 사항: 데이터베이스에 대해 마이그레이션을 수행하는 데 사용할 수 있음)
  • Prisma 서버: 데이터베이스 맨 위에 있는 독립 실행되는 인프라구조 컴포넌트
  • Prisma 클라이언트: Prisma 서버에 연결하여 데이터베이스에서 데이터를 읽고, 쓰고, 스트리밍할 수 있는 자동 생성된 라이브러리. 응용 프로그램에서 데이터 액세스에 사용된다.

Datamodel(데이터모델)

데이터 모델은 Prisma ClientAPI 운영의 기초 역할을 한다.
Prisma Client는 데이터모델에 따라 아래 작업들을 할 수 있는 API를 자동 생성해준다.

  • Read a single record of the model
  • Read a list of records of the model (including filtering, sorting & pagination)
  • Write a new record of the model
  • Update an existing record of the model
  • Delete an existing record of the model
  • Check for the existence of a certain record of the model
  • Receive realtime updates when there is a write operation on any record of the model

즉 모델의 레코드을 CRUD를 할 수 있다. 또한 레코드 리스트를 조건을 주어서 읽을 수도 있고, 실시간 업데이트 수신 또한 가능하다.

또한 이 모델을 정의하기도 graphql문법을 가져와 간단하다.
간단한 디렉티브와 타입만 정의하면 모델링이 끝난다.

    type Post {
      id: ID! @id
      createdAt: DateTime! @createdAt
      published: Boolean! @default(value: false)
      title: String!
      author: User!
    }
    
    type User {
      id: ID! @id
      email: String @unique
      name: String!
      posts: [Post!]!
    }

Prisma client

Untitled 2.png

Prisma Client는 API 서버의 기존 ORM을 대체하는 자동 생성 라이브러리다. 데이터베이스 맨 위에 있는 Prisma Server에 연결된다.

특징

  • Seamless relation API
  • Type-safe data access
  • Realtime updataed

exmple

    const newUserWithLinks = await prisma.createUser({
      name: 'Alice',
      password: 'IlikeTurtles',
      posts: {
        create: [
          {
            title: 'Prisma is the data layer for modern applications',
          },
          {
            title: 'Check out How to GraphQL - The fullstack tutorial for GraphQL',
          },
        ],
        connect: {
          id: 'cjli6tknz005s0a23uf0lmlve',
        },
      },
    })
    class ServiceListView(APIView, PageNumberPagination):
        page_size = 8
    
        def get(self, request, format=None):
            filters = {
                'activityclass__in': request.GET.getlist('activites'),
                'subjectclass__in': request.GET.getlist('subjects'),
                'city': request.GET.get('city'),
                'region': request.GET.get('town')
            }
            filters = dict(filter(lambda item: item[1], filters.items()))
            volunteer = Volunteer.objects.filter(
                **filters)
            result = self.paginate_queryset(volunteer, request, view=self)
            serializer = VolunteerSerializer(result, many=True)
    
            return self.get_paginated_response(serializer.data
    
    # 끔직하다 

- 장고로 했던 비슷한 작업

        class UserDV(APIView):
            def get(self, request, user_id, format=None):
                user = User.objects.get(id=user_id)
                serializer = UserSerializer(user)
                return Response(serializer.data)
        
            def patch(self, request, user_id, format=None):
                user = User.objects.get(id=user_id)
                data = request.data
        
                activity_data = data.pop('activity', [])
                subject_data = data.pop('subject', [])
                region_data = data.pop('region', [])
                serializer = UserSerializer(user, data=data, partial=True)
                if serializer.is_valid():
                    serializer.save(user=user, activity=activity_data,
                                    subject=subject_data, region=region_data)
                    return Response(data=serializer.data, status=status.HTTP_204_NO_CONTENT)
                else:
                    return Response(data=serializer.errors, status=status.HTTP_400_BAD_REQUEST)

장고 ORM을 쓸 때, 이런 관계형 데이터를 처리하기 너무 번거럽고 트랜잭션도 수동으로 해줘야 해서 너무 번거러웠다. 아마 전 프로젝트에서 prisma를 썼다면 엄청난 시간이 단축됬을 것이라고 본다.

Prisma는 기존 ORM의 경우 이러한 쓰기 작업 세트는 데이터베이스 트랜잭션을 수동으로 제어해야 하는 부분을 자동으로 처리해준다. 심지어 관계형 데이터베이스를 사용함해도 불구하고 말이다.

Type-safe data access

타입이 있다는 것 개발할 때 정말 행복한 일이다. 타입같은 쓰잘데기 없는데 신경을 쓸필요도 없고 자동완성 기능또한 지원하기 쉽기 때문이다.

이 타입 또한 Prisma Client가 자동 생성해주기 때문에 쓸데없는 보일러 플레이트를 작성할 필요가 없다.

Prisma server

Untitled 3.png

Prisma server는 데이터베이스 연결된 standalone infrastructure component 이다.

장고를 하다보면 데이터베이스가 뻑나는 경우가 진짜 많았다. 프리즈마로 개발할 때는 그런 경우를 거의 경험한적 없었다. 독립적인 컴포넌트이기 때문이다. 특히 prisma cloud에서 제공하는 admin은 django admin보다는 편하다.

Prisma server는 도커를 이용해서 로컬이나 아무 클라우드 서버에 배포하면 된다. 또한 Prisma는 Prisma server를 관리하기 위한 자체 툴을 지원하는 데, 이것이 Prisma cloud다.

클라우드 공급자(AWS, Google Cloud, heroku, etc...)의 Docker 및 APIs / UI를 만지작 거리는 대신 웹 UI를 통해 프리스마 서버를 직접 설정할 수도 있습니다.

정리

  • 프리즈마는 데이터모델, 클라이언트, 서버로 이루어져있다.
  • 프리즈마는 다양한 언어와 데이터베이스를 제공한다.(아직 제공안하는 것도 많음)
  • 데이터모델 & 마이그레이션은 선언적이고, 유용한 SDL(Schema Definition Language) syntax를 제공한다.
  • 클라이언트는 자동생성되고 데이터베이스에 type-safe 접근을 한다. 특히 관계형 데이터를 다루기 편하다.
  • 서버는 독립된 인프라구조를 갖고 있다. 다양한 클라우드 서비스를 사용하여 배포할 수 있다.

사족(Prisma 2)

곧 나올 Prisma 2는 몇 가지 변경점을 갖고 있다.
클라이언트와 쿼리엔진이 Photon
마이그레이션이 Lift로 분리되고
서버는 옵션으로 바뀐다.

이전에는 서버에서 쿼리와 마이그레이션 엔진이 작동되었지만, 2에선 앱에서 동일한 호스트로 동작 가능하게 바뀐다.

Untitled 4.png

코어가 Scala에서 Rust로 변환

Prisma 1은 Scala로 구현되서 JVM에서 실행되어야 했다면, 이젠 그럴필요가 없다.
개발진들은 Prisma 실행의 오버헤드를 줄이기 위해 Rust로 다시 개발하였다.(함수형 언어를 좋아하는 구나)

참고자료(혹은 도움이 될만한 자료들)

Home - Prisma Docs

Prisma 2 Preview: Type-safe Database Access & Declarative Migrations | Prisma

공식문서 번역

cadenzah (cadenzah) #graphql yoga

profile
ㅎㅎ

2개의 댓글

comment-user-thumbnail
2022년 5월 11일

Prisma Client는 API 서버의 기존 ORM을 대체하는 자동 생성 라이브러리다. 데이터베이스 맨 위에 있는 drift hunters Prisma Server에 연결된다.

답글 달기
comment-user-thumbnail
2022년 7월 14일

매우 이해하기 쉽고 유용한 기사입니다. 작가님 감사합니다

답글 달기