제가 알고 있는 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 생성자에 입력됩니다.
2. nexus-prisma
Nexus는 GraphQL 스키마와 Resolvers를 생성하기 위한 프레임워크입니다.
자동으로 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를 사용할 것 같습니다.
'백엔드 > Prisma + GraphQL' 카테고리의 다른 글
[인스타그램 클론코딩] createAccount (0) | 2020.05.31 |
---|---|
[인스타그램 클론코딩] Prisma2를 활용한 GraphQL Resolvers (0) | 2020.05.30 |
[인스타그램 클론코딩] GraphQL 데이터 모델링 (0) | 2020.05.30 |
Prisma1과 Prisma2 데이터 모델링 비교 (0) | 2020.05.29 |
Prisma2 클라이언트 생성 (0) | 2020.05.27 |