Skip to main content

Nest JS + GraphQL

NestJs + GraphQL 사용하기#

NestJs GraphQL Start

$ npm i @nestjs/graphql graphql-tools graphql apollo-server-express
  • @nestjs/graphql NestJS 에서 GraphQL을 사용하기 위해 제공해주는 GraphQL 관련 모듈
  • graphql-tools 빠르게 Mocking 테스트 및 프로토타이핑을 지원해주는 Graphql Tool 모듈
  • apollo-server-express GraphQL Server 와 Express 를 통합 및 연결해주는 Connect 모듈 (Apollo Server는 수많은 Node.js HTTP 서버 프레임 워크와 함께 작동하며 커뮤니티에서 관리하는 오픈 소스 GraphQL 서버)

Schema or Code first#

Nest는 GraphQL 애플리케이션을 구축하는 두 가지 방법, 즉 코드 우선 방법 과 스키마 우선 방법을 제공

자신에게 가장 잘 맞는 것을 선택한다.

하나는 코드를 먼저 채택하면 따라야 하며 다른 하나는 스키마를 먼저 채택 할 때 사용해야합니다.

Code first#

코드 첫 번째 방법, @decorators 그리고 TypeScript 클래스들을 사용하여 GraphQL 스키마를 생성하는 방법

이 방법은 TypeScript로만 작업하고 언어 간의 컨텍스트 전환을 피하려는 경우 유용하다.

Schema first#

스키마 첫 번째 방법, GraphQL은 SDL (스키마 정의 언어) 파일의 주체로 이루어진다. SDL은 서로 다른 플랫폼간에 스키마 파일을 공유하는 언어에 구애받지 않는 방법입니다.

이 방법은 GraphQL 스키마를 기반으로 TypeScript 정의 (클래스 또는 인터페이스 사용)를 자동으로 생성하여 중복 된 상용구 코드를 작성할 필요성을 줄인다.

  • TypeScript를 사용하여 코드작성하고 빠르게 스키마 생성하고싶다 Code First
  • GraphQL 스키마를 작성해서 TypeScript 정의를 자동으로 생성하고싶다 Schema First

Getting Start With GraphQL & TypeScript#

패키지 설치 후 진행해야한다.

// Module쪽에 GraphQLModule Import
import { Module } from '@nestjs/common';
import { GraphQLModule } from '@nestjs/graphql';
@Module({
imports: [
GraphQLModule.forRoot({
// option도 할 수 있다.
debug: false,
playground: false,
}),
],
})
export class AppModule {}

Code First#

// Module쪽에 GraphQLModule Import
import { Module } from '@nestjs/common';
import { GraphQLModule } from '@nestjs/graphql';
// 스키마를 파일을 자동으로 생성해주기위해 지정한다.
@Module({
imports: [
GraphQLModule.forRoot({
autoSchemaFile: 'schema.gql',
}),
],
})
export class AppModule {}

Cats 서비스로 모듈화를 진행한다.#

  • cats
    • cats.module.ts
    • cats.resolver.ts

cats.module.ts

import { Module } from '@nestjs/common';
import { CatsReslover } from './cats.resolver';
@Module({
providers: [CatsReslover],
})
export class CatsModule {}

cats.resolver.ts

import { Resolver, Query } from '@nestjs/graphql';
@Resolver()
export class CatsReslover {
@Query(() => String)
async hello() {
return 'hello';
}
@Query(() => String)
async Angry() {
return 'No!!';
}
}

app.module.ts

import { Module } from '@nestjs/common';
import { GraphQLModule } from '@nestjs/graphql';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { CatsModule } from './cats/cats.module';
import { MoviesModule } from './movies/movies.module';
@Module({
imports: [
GraphQLModule.forRoot({
autoSchemaFile: 'schema.gql',
})
, CatsModule
, MoviesModule
],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}