Schema-first vs Code-first

박찬효·2022년 10월 22일
0

Graphql Schema

graphql을 사용하면서 schema를 바탕으로 code가 매치되게 할 수 있고, 코드를 바탕으로 schema가 생성되게 할 수 있습니다.

두 케이스 모두 graphql 서비스의 작동을 하게 되지만 어떤 접근법을 사용하느냐에 따라 더 많은 기능을 사용할 수 도 사용하지 못할게 될수도 있으며, 더 쉽거나 어렵게 작업하게 될수도 있습니다.

Schema First ?

스키마 우선 접근 방식에서 진실의 소스는 GraphQL SDL파일입니다.SDL은 서로 다른 플랫폼간에 스키마 파일을 공유하는 언어에 구애받지 않는 방법입니다. Nest는 GraphQL 스키마를 기반으로 타입스크립트 정의를 자동으로 생성하여 중복된 상용구 코드를 작성할 필요성을 줄입니다.

// cat.graphql
type Query {
  cats: [Cat]
  cat(id: ID!): Cat
}

type Mutation {
  createCat(createCatInput: CreateCatInput): Cat
}

type Subscription {
  catCreated: Cat
}

type Owner {
  id: Int!
  name: String!
  age: Int
  cats: [Cat!]
}

type Cat {
  id: Int
  name: String
  age: Int
  owner: Owner
}

input CreateCatInput {
  name: String
  age: Int
}

Schema-first 장단점

👍 장점

  • ASynchronous한 개발이 가능합니다.

  • 확실한 의사소통의 수단입니다.

  • SDL을 제외한 document가 필요 없습니다.

  • 빠른 mocking으로 인해 개발 속도가 빠릅니다.

👎 단점

  • SDL과 Resolver간의 일치성을 보장할 수 없습니다

  • run time에서만 알 수 있는 단점이 있습니다.

  • schema가 늘어갈수록 실수의 가능성이 높아집니다.

  • 다양한 도구들로 문제를 해결하려 하지만 근본적인 해결책이 되지 않습니다.

Code First?

이 방법은 Typescript로만 작업하고 언어 구문간의 컨텍스트 전환을 피하려는 경우 유용합니다. 타입스크립트로 클래스를 짜면 해당 클래스에 해당ㅇ하는 graphql 스키마를 만들어 줍니다.

코드 접근 방식에는 데코레이터와 TypeScript 클래스를 사용하여 해당 GraphQL 스키마를 생성합니다.

export class Board {
  @Field(() => Int)
  number: number;

  @Field(() => String)
  writer: string;

  @Field(() => String)
  title: string;
  
  @Field(() => String)
  contents: string;
}

Code First 장단점

👍 장점

  • 스키마와 Reolver간의 일치성이 보장됩니다.

  • 코드 중복이 최소화 됩니다.

  • 자신이 편한 언어로 개발이 가능합니다.

👎 단점

  • 스키마를 이해하기 쉽지 않을 수 있습니다.
profile
개발자가 되기 위한 1인

0개의 댓글