Schema-first vs Code-first

박선우·2023년 1월 29일
0

CS 스터디

목록 보기
30/53
post-thumbnail

🌼 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
  }
`;

// resolvers
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.'})
    }
})

// resolver
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)
  }
})

참조

profile
코린이 열심히 배우자!

0개의 댓글