NestJS graphql (2) 스키마 generator 셋팅

peter0618·2020년 10월 12일
0

nestjs

목록 보기
5/9
post-thumbnail

1.기본 셋팅

AppModule에 GraphQLModule을 import할 때 graphql 스키마에 정의된 type, query 등을 비즈니스 로직에서 사용가능한 typescript class로 자동 변환해주는 설정을 추가할 수 있습니다.

AppMudle

import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { GraphQLModule } from '@nestjs/graphql';
import { UserModule } from './module/user/user.module';
import { join } from 'path';

@Module({
  imports: [
    GraphQLModule.forRoot({
      typePaths: ['./**/*.graphql'],
      definitions: {
        path: join(process.cwd(), 'src/autogen/schema.graphql.ts'),
        outputAs: 'class',
      },
    }),
    UserModule,
  ],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

2.결과 확인

위와 같이 설정하면, 어플리케이션을 실행할 때마다 자동으로 "src/autogen/schema.graphql.ts" 파일이 생성됩니다.

src/autogen/schema.graphql.ts


/** ------------------------------------------------------
 * THIS FILE WAS AUTOMATICALLY GENERATED (DO NOT MODIFY)
 * -------------------------------------------------------
 */

/* tslint:disable */
/* eslint-disable */
export abstract class IQuery {
    abstract getAll(): User[] | Promise<User[]>;
}

export class User {
    id: string;
    name: string;
    age: number;
}

3.수동 생성 설정

가끔 이 파일을 수동으로 생성해야 할 필요가 생깁니다.
수동으로 파일을 생성하기 위해서는 GraphQLDefinitionsFactory를 이용하면 됩니다.

schema.generator.ts

import { GraphQLDefinitionsFactory } from '@nestjs/graphql';
import { join } from 'path';

const options: {
  typePaths: string[];
  path: string;
  outputAs?: 'class' | 'interface';
  watch?: boolean;
  debug?: boolean;
  federation?: boolean;
} = {
  typePaths: ['./**/*.graphql'],
  path: join(process.cwd(), 'src/autogen/schema.graphql.ts'),
  outputAs: 'class',
};

(async () => {
  console.log('----------------------------------------------------------------------------------------------------');
  console.log('Start creating classes according to graphql schema defined in each modules...');
  await new GraphQLDefinitionsFactory().generate(options);
  console.log('Finished successfully.');
  console.log('----------------------------------------------------------------------------------------------------');
})();

위와 같이 작성한 뒤 콘솔에서 아래 명령어를 실행하면 graphql 스키마를 class로 정의한 파일이 생성됩니다.

$ ts-node src/schema.generator

0개의 댓글