graphql의 schema를 먼저 정의하고, 그 schema 정의에 맞게 코드를 작성하는 방법
schema 작성 위해
graphql의 data model을 나타내기 위해 만들어진 SDL(Schema Definition Language)를 사용
SDL은 모든 프로그래밍 언어와 독립적, 통합되는 언어
Nestjs에서는 GraphQL 스키마를 TypeScript의 클래스 및 인터페이스 형식으로 구현
GraphQLModule.forRoot({
typePaths: ['./**/*.graphql'],
}),
아래와 같이 직접 스키마 작성
type Query {
cats: [Cat]
cat(id: ID!): Cat
}
type Mutation {
createCat(createCatInput: CreateCatInput): Cat
}
type Subscription {
catCreated: Cat
}
type Owner {
id: Int!
name: String!
age: Int
cats: [Cat!]
}
type Cat {
id: Int
name: String
age: Int
owner: Owner
}
input CreateCatInput {
name: String
age: Int
}
데코레이터와 TypeScript 클래스를 사용하여 먼저 작성한 Resolver를 기반으로 GraphQL 스키마를 자동 생성
GraphQLModule.forRoot<ApolloDriverConfig>({
driver: ApolloDriver,
autoSchemaFile: 'src/common/graphql/schema.gql',
})
yarn add @nestjs/graphql @nestjs/apollo graphql apollo-server-express
import { Module } from '@nestjs/common';
import { GraphQLModule } from '@nestjs/graphql';
import { AppController } from './app.controller';
import { AppService } from './app.service';
@Module({
imports: [
GraphQLModule.forRoot<ApolloDriverConfig>({
driver: ApolloDriver,
autoSchemaFile: 'src/commons/graphql/schema.gql',
}),
],
})
export class AppModule {}
import { Injectable } from '@nestjs/common';
@Injectable() // 의존성 주입
export class BoardService {
sayHello() {
return 'Hello World';
}
}
import { Query, Resolver } from '@nestjs/graphql';
import { BoardService } from './boards.service';
@Resolver()
export class BoardResolver {
constructor(private readonly boardService: BoardService) {}
@Query(() => String) // 리턴 타입 정의 : GraphQL API-Docs type으로 대문자 작성
getHello():string { // Typesciprt type 지정
return this.boardService.sayHello();
}
}
import { Module } from '@nestjs/common';
import { BoardResolver } from './boards.resolver';
import { BoardService } from './boards.service';
@Module({
// imports: [],
// controllers: [],
providers: [BoardResolver, BoardService],
})
export class BoardModule {}
import { ApolloDriver, ApolloDriverConfig } from '@nestjs/apollo';
import { Module } from '@nestjs/common';
import { GraphQLModule } from '@nestjs/graphql';
import { BoardModule } from './apis/boards/boards.module';
// import { AppController } from './app.controller';
// import { AppService } from './app.service';
@Module({
imports: [
BoardModule, // BoardModule 주입
GraphQLModule.forRoot<ApolloDriverConfig>({
driver: ApolloDriver,
autoSchemaFile: 'src/commons/graphql/schema.gql',
}),
],
// controllers: [AppController],
// providers: [AppService],
})
export class AppModule {}