🌼 Schema-first vs Code-first
1️⃣ Graphql Schema
클라이언트에서 사용할 수 있는 기능을 설명하는 일련의 규칙
우리가 사용하는 접근 방식에 따라 더 많거나 적은 기능을 더 많거나 덜 쉽게 구현할 수 있는 방식
Code-first/Schema-first
2️⃣ Schema-first
Graphql 스키마를 먼저 정의하고, 정의한 스키마에 따라 코드구현하는 방법
Api의 모든 데이터 구조를 정의해야 한다.
데이터 구조를 resolver로 매핑해야한다.
javasrcipt/typescript => Apollo-server를 사용
const typeDefs = `
type Post {
id: String!
title: String!
content: String!
user_id: String!
}
type Query {
findPosts: [Post]
findPost(id: String!): Post
}
`;
const resolvers = {
Query: {
async findPosts(root, args, ctx) {
return await Post.find()
},
async findPost(root, { id }, ctx) {
return await Post.findOne(id)
}
}
}
resolver 코드가 SDL의 정의와 정확하게 일치해한다.(String!으로 정의했다면, 정확히 String!이여야한다.)
3️⃣ Code-first
Schema-first와 반대로 resolver를 먼저 작성한다.
Schema => resolver을 기반으로 자동으로 생성
코드 중복이 적어진다.
javasrcipt/typescript => Nexus사용
const Post = objectType({
name: 'Post',
definition(t) {
t.string('id', { description: 'ID of the post.'})
t.string('title', { description: 'Title of the post.'})
t.string('content', { description: 'Content of the post.'})
t.string('user_id', { description: 'Author ID.'})
}
})
const findPosts = queryField('findPosts', {
type: list(Post),
resolve: async (root, args, ctx) => {
return await Post.find()
}
})
const findPost = queryField('findPost', {
type: Post,
args: {
id: nonNull(stringArg()),
},
resolve: async (root, { id }, ctx) => {
return await Post.findOne(id)
}
})
참조