-
GraphQL Code GeneratorLanguages/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