[NestJS] GraphQL Module 설정하는 법

유제·2021년 2월 28일
0

NestJS 공부하기

목록 보기
3/6

해야할 것

여러 패키지들을 설치해야한다. 아래 명령어로 패키지들을 설치하자.
Fastify를 사용한다면, apollo-server-express 대신 apollo-server-fastify를 설치해야한다.

npm i @nestjs/graphql graphql-tools graphql apollo-server-express

개요

NestJS는 GraphQL 어플리케이션을 구축하는 두 가지 방법을 제공한다.

  • code first 방식
    - 이 방식은 decorator와 typescript class를 이용해서 GraphQL Schema에 해당하는 코드를 작성한다. 그리고 GraphQL SDL(Schema Definition Language)를 사용하지 않고 Typescript만을 이용하고 싶을 때 도움이 된다.
  • schema first 방식
    - SDL는 다른 플랫폼과 Schema 파일을 공유할 수 있는, 언어에 구애받지 않는 방법이다. Nest는 GraphQL Schema를 기반으로 클래스 혹은 인터페이스를 이용한 TypeScript Definition을 자동으로 생성하여 중복 보일러 플레이트 코드를 작성할 필요성을 줄인다.

나는 Typescript만을 이용해서 코드를 작성하고 싶기 때문에 code first 방식을 이용할 것이다.

시작하기

GraphQLModuleAppModule에 추가해준다. forRoot 메소드는 객체 하나를 인자로 받는다. 이 옵션들은 Apollo Instance로 전달되기 때문에 Apollo Docs에서 어떤 옵션이 있는지 확인할 수 있다.

// src/app.module.ts
import { Module } from '@nestjs/common';
import { GraphQLModule } from '@nestjs/graphql';

@Module({
  imports: [
    GraphQLModule.forRoot({}),
  ],
})
export class AppModule {}

code first 방식으로 스키마 생성하기

아래처럼 autoSchemaFile 옵션에 자동으로 스키마가 생성될 위치를 넣어준다. 만약 true로 넘겨준다면, 스키마 파일이 생성되지 않고 메모리에 바로바로(on the fly) 스키마가 생성된다.

GraphQLModule.forRoot({
  autoSchemaFile: join(process.cwd(), 'src/schema.gql'),
}),
  
-------------------- or --------------------

GraphQLModule.forRoot({
  autoSchemaFile: true,
}),

Resolver 만들기

아래처럼 만들면 된다.
@Query() 데코레이터 안에 리턴하고자하는 타입을 리턴하는 함수를 넣으면 된다.
returns => String에서 returns는 단순히 @Query(return => String)가 문장(Query returns String)처럼 보이기 위해서 넣은 이름이며, 사용되진 않는다. 당연하겠지만, @Mutation 데코레이터도 있다.

import { Resolver, Query } from '@nestjs/graphql';

@Resolver()
export class Resolver {
  @Query(returns => String)
  hello() {
    return 'Hello';
  }
}

0개의 댓글