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 {}
위와 같이 설정하면, 어플리케이션을 실행할 때마다 자동으로 "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;
}
가끔 이 파일을 수동으로 생성해야 할 필요가 생깁니다.
수동으로 파일을 생성하기 위해서는 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