본문 바로가기

백엔드/Prisma + GraphQL

GraphQL with Prisma2 설계 구조

  1. 개발자가 GraphQL 모델(model.graphql)과 대응하는 Prisma 모델(schema.prisma)을 작성해 줍니다.
    Prisma1에선 GraphQL 모델과 Prisma 모델이 거의 비슷했지만, Prisma2는 약간 달라졌습니다.
  2. Prisma CLI를 사용하여 Prisma 모델 구조를 따르는 데이터베이스 테이블을 생성합니다.
    참조: Prisma CLI를 사용하여 데이터베이스 테이블 생성
  3. Prisma CLI를 사용하여 Prisma 클라이언트를 생성합니다.
    참조: Prisma2 클라이언트 생성

GraphQL + Prisma2 설계 구조

GraphQL 모델(model.graphql)이 뭔가요?

타입, 쿼리, Mutation을 정의해 놓은 graphql 파일입니다.

예를 들어 User라는 타입을 정의할 때는 User가 갖는 속성들 id, name, email 등을 정의합니다.

쿼리Mutation클라이언트가 요청할 수 있는 함수입니다. 실제 요청은 각각의 쿼리와 Mutation에 대응하는 Resolvers가 수행합니다.

그리고 Resolvers 안에서 Prisma 클라이언트가 사용됩니다.

GraphQL에 대한 자료는 인터넷에 많기 때문에, 이정도만 설명하겠습니다.

추천 강의: 나의 첫번째 GraphQL서버 만들기

Prisma 모델(schema.prisma)이 뭔가요?

타입, Relation을 정의해 놓은 prisma 파일입니다.

이 파일은 prisma CLI를 설치하고, 초기화를 하면 ./prisma 폴더에 자동으로 생성되는 파일입니다.

npm install @prisma/cli --save-dev
npx prisma init

Relation은 Prisma의 핵심 기능입니다.

주요 Relation 정의 방법은 다음 포스트에서 알아보겠습니다.

GraphQL 모델과 Prisma 모델이 대응한다는 의미는 무엇인가요?

타입의 속성이 매칭된다는 것을 의미합니다.

예를 들어, GraphQL 모델에서 User의 속성으로 id와 name을 정의했다면, Prisma 모델에서도 User의 속성으로 id와 name을 정의하는 것입니다.

GraphQL 모델과 Prisma 모델을 대응하도록 작성하는 이유는 무엇인가요?

필수는 아니지만 대응하도록 작성하는게 편합니다.

GraphQL에서 User 타입을 반환하는 Resolver가 있다고 가정해 봅시다.

GrpahQL 모델에서 User의 스키마를 id, email으로 정의했는데, Prisma 모델에서 User의 스키마를 id, e-mail로 정의했다면, Resolver에서 Prisma 클라이언트로 얻은 객체의 e-mail 속성을 email로 변환한 다음 반환해야 합니다. 

Prisma 모델로 부터 GraphQL 모델을 생성해 주는 도구는 없나요?

없습니다.

Prisma는 GraphQL과 궁합은 잘 맞지만, GraphQL만을 위한 도구는 아닙니다.

대안으로 nexus-prisma라는 도구가 있습니다.

이 도구를 사용해도 Prisma 모델과 대응하는 모델을 nexus 모델로 만들어야 합니다.

하지만 Prisma 클라이언트와 비교하여 오류가 없는지 체크하고, 오류가 없으면 GraphQL 모델(model.graphql)을 자동으로 생성합니다.

또한 기본적인 CRUD Resolvers도 제공해 줍니다.

하지만 nexus-prisma를 사용하면, @graphql-toolkit/merge 모듈을 사용하여 GraphQL 모델을 여러 파일로 분리할 수 없기 때문에, 인스타그램 클론코딩의 백앤드에 nexus-prisma를 사용하지 않았습니다.

'백엔드 > Prisma + GraphQL' 카테고리의 다른 글

Prisma2 데이터 모델링2 - 1:N Relation  (0) 2020.05.27
Prisma2 데이터 모델링1 - 1:1 Relation  (0) 2020.05.27
Prisma1 vs Prisma2 비교  (0) 2020.05.27
Prisma2 설치 (CLI, 클라이언트)  (0) 2020.05.27
Prisma란?  (0) 2020.05.22