Category: 공부정리
Created Time: Jan 05, 2020 1:35 PM
Last Updated Time: Jan 05, 2020 8:16 PM
이번에 프로젝트를 시작하면서 graphql을 사용해보려고 했다.
일단 만들어 놓긴 했는데, 용어나 개념들이 정리가 안된거 같아서 정리차원에서 글을 쓰려고 한다.
대부분 내용은 공식문서를 참고했다.
Prisma 장점 중 하나는 공식문서가 충실하다는 점이다. 웬만한 레퍼런스는 공식문서에서 볼 수 있다.
현대 앱 개발을 위한 데이터베이스 툴이라고 소개한다.
**node.js에서 인기있는 서버개발 스택은 express + sequelize ORM이다.
이 중 prisma는 이런 squelize ORM을 대체하며 추가 기능까지 제공하는 데이터베이스 툴**이다.
이전의 ORM들에서 불편한 작업을 대채한다.
개인적 경험으론 장고 orm보다 훨씬 편했고, 딱히 어드민 코딩하지 않아도 웬만한 기능은 있어서 작업이 매우 간편해졌다. 특히 graphql 서버를 만들 때 매우 편리하다.
Prisma - Database tools for modern application development
Prisma
는 APP
or API server
와 Database
사이에 위차한 Data Access Layer
다. 아키텍처가 깔금해지기 때문에 불필요한 boilerplate가 필요없어진다.
프리즈마를 이해하려면 3가지 컨셉을 알아야한다.(사실 모른상태로 프로젝트를 진행했다.)
Datamodel
: 애플리케이션의 모델을 정의하고 Prisma 클라이언트 API의 기반(선택 사항: 데이터베이스에 대해 마이그레이션을 수행하는 데 사용할 수 있음)Prisma 서버
: 데이터베이스 맨 위에 있는 독립 실행되는 인프라구조 컴포넌트Prisma 클라이언트
: Prisma
서버에 연결하여 데이터베이스에서 데이터를 읽고, 쓰고, 스트리밍할 수 있는 자동 생성된 라이브러리. 응용 프로그램에서 데이터 액세스에 사용된다.데이터 모델은 Prisma Client
의 API
운영의 기초 역할을 한다.
Prisma Client
는 데이터모델에 따라 아래 작업들을 할 수 있는 API
를 자동 생성해준다.
즉 모델의 레코드을 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
는 API 서버의 기존 ORM을 대체하는 자동 생성 라이브러리다. 데이터베이스 맨 위에 있는 Prisma Server에 연결된다.
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의 경우 이러한 쓰기 작업 세트는 데이터베이스 트랜잭션을 수동으로 제어해야 하는 부분을 자동으로 처리해준다. 심지어 관계형 데이터베이스를 사용함해도 불구하고 말이다.
타입이 있다는 것 개발할 때 정말 행복한 일이다. 타입같은 쓰잘데기 없는데 신경을 쓸필요도 없고 자동완성 기능또한 지원하기 쉽기 때문이다.
이 타입 또한 Prisma Client가 자동 생성해주기 때문에 쓸데없는 보일러 플레이트를 작성할 필요가 없다.
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를 통해 프리스마 서버를 직접 설정할 수도 있습니다.
곧 나올 Prisma 2는 몇 가지 변경점을 갖고 있다.
클라이언트와 쿼리엔진이 Photon
마이그레이션이 Lift로 분리되고
서버는 옵션으로 바뀐다.
이전에는 서버에서 쿼리와 마이그레이션 엔진이 작동되었지만, 2에선 앱에서 동일한 호스트로 동작 가능하게 바뀐다.
Prisma 1은 Scala로 구현되서 JVM에서 실행되어야 했다면, 이젠 그럴필요가 없다.
개발진들은 Prisma 실행의 오버헤드를 줄이기 위해 Rust로 다시 개발하였다.(함수형 언어를 좋아하는 구나)
Prisma 2 Preview: Type-safe Database Access & Declarative Migrations | Prisma
공식문서 번역
Prisma Client는 API 서버의 기존 ORM을 대체하는 자동 생성 라이브러리다. 데이터베이스 맨 위에 있는 drift hunters Prisma Server에 연결된다.