ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • GraphQL Code Generator
    Languages/GraphQL 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

    'Languages > GraphQL' 카테고리의 다른 글

    GraphQL Query & Mutation  (0) 2023.08.13
Designed by Tistory.