본문 바로가기

백엔드/Prisma + GraphQL

GraphQL 데이터 모델링 도구 (@graphql-tools, nexus-prisma)

제가 알고 있는 GraphQL 모델 정의 방법은 2가지가 있습니다.

1. @graphql-tools/merge, @graphql-tools/load-files

제가 사용한 방법입니다. 특정 경로에 있는 모든 graphql 파일과 js 파일별로 통합해서 타입 객체와 Resolvers 객체를 만들 수 있습니다.

노마드 코더님의 인스타그램 클론 강의에선 merge-graphql-schemas 모듈을 사용했는데요. 최근에 GraphQL Tools로 통합되면서 @graphql-tools/merge 모듈과 @graphql-tools/load-files 모듈로 분리이전되었습니다.

src/schema.js

const path = require("path");
const { makeExecutableSchema } = require("graphql-tools");
const { mergeTypeDefs, mergeResolvers } = require("@graphql-tools/merge");
const { loadFilesSync  } = require('@graphql-tools/load-files');

// schema.js 파일이 /src/ 경로에 있기 때문에 /src/ 기준이다.

// api 폴더에 있는 모든 폴더(**)의 모든 graphql 파일(*)을 배열 객체로 로드
const allTypes = loadFilesSync(path.join(__dirname, "/api/**/*.graphql"));

// api 폴더에 있는 모든 폴더(**)의 모든 js 파일(*)을 배열 객체로 로드
const allResolvers = loadFilesSync(path.join(__dirname, "/api/**/*.js"));

const schema = makeExecutableSchema({
    // allTypes를 한 개의 문자열로 통합
    typeDefs: mergeTypeDefs(allTypes, {all: true}),
    // allResolvers를 한 개의 자바스크립트 코드로 통합
    resolvers: mergeResolvers(allResolvers)
});

console.log("schema: ", schema);

module.exports = {
    schema
};

참조: https://www.graphql-tools.com/docs/merge-resolvers/#usage

 

src/api/model.graphql에서 타입을 정의하고 나머지 graphql 파일에서 Resolver 형태를 정의합니다. 그리고 js 파일에서 Resolver를 구현합니다. src/api 경로에 있는 모든 graphql 파일과 js 파일은 타입 객체와 Resolvers 객체로 변환되어 schema 객체에 입력됩니다. 이렇게 생성된 schema 객체는 ApolloServer 생성자에 입력됩니다.

참조: 서버리스 GraphQL 백앤드 구축

 

 

2. nexus-prisma

Nexus는 GraphQL 스키마와 Resolvers를 생성하기 위한 프레임워크입니다.

Nexus

자동으로 GrpahQL 모델(model.graphql)을 생성해 주는 것이 아니라, Nexus 모델을 생성 하면 GraphQL 서버를 시작할 때, 자동으로 GraphQL 모델로 변환해 줍니다.

그리고 nexus-prisma는 Nexus 모델을 GraphQL 모델로 변환하기 전에 Prisma 클라이언트 객체와 오류 체크를 해 주는 Nexus 플러그인입니다. 

Prisma 개발팀에서 제공해 주는 기본 예제도 Nexus를 사용했습니다.

참조: https://github.com/prisma/prisma-examples

 

Nexus를 사용하면 타입에 안전하게 GraphQL 모델을 만들 수 있고, nexus-prisma 플러그인과 연동해서 기본적인 CRUD Resolvers까지 생성해 주는 기능이 있습니다.

1번 방법처럼 Nexus 모델을 쪼갤 수 있는 방법만 찾는다면, 다음부터는 nexus-prisma를 사용할 것 같습니다.