Code First vs Schema First

์žฅ์—ฌ์ง„ยท2022๋…„ 4์›” 4์ผ
0

1. Code First(์ฝ”๋“œ ์šฐ์„ )

  • ์ฝ”๋“œ ์šฐ์„  ์ ‘๊ทผ ๋ฐฉ์‹์—์„œ๋Š” decorator์™€ Typescript ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๋‹น GraphQL์Šคํ‚ค๋งˆ๋ฅผ ์ƒ์„ฑ
  • TypeScript๋กœ๋งŒ ์ž‘์—…ํ•˜๊ณ  ์–ธ์–ด ๊ตฌ๋ฌธ๊ฐ„์˜ ์ปจํ…์ŠคํŠธ๋ฅผ ํ”ผํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ์œ ์šฉ!

[์˜ต์…˜ ๊ฐ์ฒด์— autoSchemaFile์†์„ฑ ์ถ”๊ฐ€]
autoSchemaFile - ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋œ ์Šคํ‚ค๋งˆ๊ฐ€ ์ƒ์„ฑ๋  ๊ฒฝ๋กœ

GraphQLModule.forRoot({
      autoSchemaFile: 'src/common/graphql/schema.gql',
    }),

2. Schema First(์Šคํ‚ค๋งˆ ์šฐ์„ )

  • GraphQL SDL (Schema Definition Language) ํŒŒ์ผ
  • SDL์€ ์„œ๋กœ ๋‹ค๋ฅธ ํ”Œ๋žซํผ๊ฐ„์— ์Šคํ‚ค๋งˆ ํŒŒ์ผ์„ ๊ณต์œ ํ•˜๋Š” ์–ธ์–ด์— ๊ตฌ์• ๋ฐ›์ง€ ์•Š๋Š” ๋ฐฉ๋ฒ•

[์˜ต์…˜ ๊ฐ์ฒด์— typePaths์†์„ฑ ์ถ”๊ฐ€]
typePaths - GraphQLModule์ด ์ž‘์„ฑํ•  GraphQL SDL์Šคํ‚ค๋งˆ ์ •์˜ ํŒŒ์ผ ์œ„์น˜

GraphQLModule.forRoot({
  typePaths: ['./**/*.graphql'],
}),

[.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
}

3. Code-First vs Schema-First

Code-first๋Š” typescript๋กœ ํด๋ž˜์Šค๋ฅผ ์งœ๋ฉด ํ•ด๋‹น ํด๋ž˜์Šค์— ํ•ด๋‹นํ•˜๋Š” graphql schema๋ฅผ ์ƒ์„ฑ!
Schema-first๋Š” graphql schema๋ฅผ ๋จผ์ € ์ƒ์„ฑ ํ›„ ํด๋ž˜์Šค๋‚˜ ์ธํ„ฐํŽ˜์ด์Šค ์ƒ์„ฑ!


๊ณต๋ถ€ํ•˜๋ฉฐ ์ž‘์„ฑํ•˜๊ณ  ์žˆ๋Š” ๋ธ”๋กœ๊ทธ์ž…๋‹ˆ๋‹ค.
์ž˜๋ชป๋œ ๋‚ด์šฉ์ด ์žˆ์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ ํ˜น์‹œ ์žˆ๋‹ค๋ฉด ๋Œ“๊ธ€ ๋‹ฌ์•„์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค ๐Ÿ˜Š

0๊ฐœ์˜ ๋Œ“๊ธ€