Languages/GraphQL

GraphQL Code Generator

iam102 2023. 8. 15. 16:46

이전 GraphQL 포스팅에서 언급되었던 Code Generator에 대해 소개하려고 합니다. Code Generator은 BE에서 설계된 데이터 모델링을 GraphQL 스키마를 기반으로 TypeScript로 가져오기 위해 사용합니다.

 

Code Generator의 이점

1. 설계된 데이터 모델링을 찾아보는데 편합니다.

  • 어떤 필드를 가지는지, 그리고 그 타입이 무엇인지 등 확인할 수 있습니다.
  • graphiql을 사용하는 것보다 generator로 스키마를 직접 확인하는 게 편합니다.

2. 차후에 GQL을 통해 가져온 데이터들을 타입 체킹 하는 데 사용합니다. 

 

Code Generator 셋업

1. Installing Codegen

npm install graphql @graphql-codegen/cli @graphql-codegen/typescript

or

yarn add graphql @graphql-codegen/cli @graphql-codegen/typescript

 

2. codegen 작성

wizard을 이용하여 간편하게 생성 가능합니다.(옵션들만 선택해서 생성)

npx graphql-codegen init

or

yarn graphql-codegen init

만약 wizard을 사용하지 않을 경우는 추가로 필요한 라이브러리를 설치하고 codegen.yml or codegen.ts를 생성하여 작성합니다.

 

codegen.yml example

schema: ${SCHEMA_PATH} 
overwrite: true
generates:
  ./src/models/types.ts:
    plugins:
      - typescript
    config:
      declarationKind: 'interface'
      skipTypename: true
      maybeValue: T | null | undefined

 

3. Generate

package.json의 scripts에 generate 추가합니다.(recommended)

{
  "scripts": {
    "codegen": "graphql-codegen"
  }
}

GraphQL Code Generator 구버전에서는 gql-gen 현재는 graphql-codegen으로 migration.

 

그 후 Command 실행합니다.

npm run codegen

or

yarn codegen

 

codegen에 작성된 내용으로 generate 결과를 TypeScript의 타입으로 생성됩니다.

 

types.ts example

// types.ts
export type Maybe<T> = T | null | undefined;
export type InputMaybe<T> = T | null | undefined;
/** All built-in and custom scalars, mapped to their actual values */
export interface Scalars {
  ID: { input: string; output: string; }
  String: { input: string; output: string; }
  Boolean: { input: boolean; output: boolean; }
  Int: { input: number; output: number; }
  Float: { input: number; output: number; }
}

export interface Mutation {
  updateTodo?: Maybe<Todo>;
}

export interface MutationUpdateTodoArgs {
  input: UpdateTodoInput;
}

export interface Query {
  /** Get all todos */
  todos?: Maybe<Array<Maybe<Todo>>>;
  /** Get a user by id */
  user?: Maybe<User>;
  /** Get all users */
  users?: Maybe<Array<Maybe<User>>>;
}

export interface QueryUserArgs {
  id?: InputMaybe<Scalars['String']['input']>;
}

export interface Todo {
  description?: Maybe<Scalars['String']['output']>;
  done?: Maybe<Scalars['Boolean']['output']>;
  id?: Maybe<Scalars['String']['output']>;
}

export interface UpdateTodoInput {
  description?: InputMaybe<Scalars['String']['input']>;
  done?: InputMaybe<Scalars['Boolean']['input']>;
  id?: InputMaybe<Scalars['String']['input']>;
}

export interface User {
  email?: Maybe<Scalars['String']['output']>;
  id?: Maybe<Scalars['String']['output']>;
  name?: Maybe<Scalars['String']['output']>;
  todos?: Maybe<Array<Maybe<Todo>>>;
}

 

 

마무리

Code Generator를 통해 GQL의 스키마 변경에 대해 간편하게 대응할 수 있으며 유지 보수 측면에서 효율적입니다. Code Generator을 잘 활용한다면 GQL 환경에서 더 편하게 개발할 수 있습니다.

 

 


참고 자료

https://www.graphql-code-generator.com/docs/config-reference/codegen-config

https://www.graphql-code-generator.com/plugins/typescript/typescript