Quick start
Quick start
GraphQL์ API์ ๋ํ ์ฟผ๋ฆฌ ์ธ์ด์ด๋ฉฐ ๊ธฐ์กด ๋ฐ์ดํฐ๋ก ์ฟผ๋ฆฌ๋ฅผ ์ํํ๊ธฐ์ํ ๋ฐํ์์
๋๋ค. ์ผ๋ฐ์ ์ธ REST API์์ ๋ฐ์ํ๋ ์ด๋ฌํ ๋ง์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ์ฐ์ํ ์ ๊ทผ ๋ฐฉ์์
๋๋ค. GraphQL๊ณผ REST ์ฌ์ด์๋ ํ๋ฅญํ ๋น๊ต๊ฐ ์์ต๋๋ค. ์ด ๊ธฐ์ฌ์์๋ GraphQL์ด ๋ฌด์์ธ์ง ์ค๋ช
ํ์ง ์๊ณ ์ ์ฉ @nestjs/graphql ๋ชจ๋๋ก ์์
ํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ค๋๋ค. ์ด ์ฑํฐ์์๋ ์ด๋ฏธ GraphQL ๊ธฐ๋ณธ ์ฌํญ์ ์ต์ํ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค.
GraphQLModule์ [Apollo] (https://www.apollographql.com/) ์๋ฒ์ ๋ํผ์ ์ง๋์ง ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ๋ฐํด๋ฅผ ์ฌ๋ฐ ๋ช
ํ์ง ์๊ณ ๋์ ์ฌ์ฉํ ์ค๋น๊ฐ ๋ ๋ชจ๋์ ์ ๊ณตํ์ฌ GraphQL๊ณผ Nest๋ฅผ ํจ๊ป ์ฌ์ฉํ ์ ์์ต๋๋ค.
Installation
๋จผ์ ํ์ํ ํจํค์ง๋ฅผ ์ค์นํด์ผํฉ๋๋ค.
$ npm i --save @nestjs/graphql apollo-server-express graphql-tools graphqlOverview
Nest๋ GraphQL ์ดํ๋ฆฌ์ผ์ด์ ์ ๋น๋ํ๋ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ, ์ฆ ์คํค๋ง ์ฐ์ ๊ณผ ์ฝ๋ ์ฐ์ ์ ์ ๊ณตํฉ๋๋ค.
์คํค๋ง ์ฐ์ ์ ๊ทผ๋ฒ์์ ์ง์ค์ ๊ทผ์์ GraphQL SDL (์คํค๋ง ์ ์ ์ธ์ด)์ ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ์๋ก ๋ค๋ฅธ ํ๋ซํผ๊ฐ์ ์คํค๋ง ํ์ผ์ ๊ณต์ ํ ์ ์๋ ์ธ์ด์ ๊ตฌ์ ๋ฐ์ง ์๋ ๋ฐฉ์์ ๋๋ค. ๋ํ Nest๋ GraphQL ์คํค๋ง (ํด๋์ค ๋๋ ์ธํฐํ์ด์ค ์ฌ์ฉ)๋ฅผ ๊ธฐ๋ฐ์ผ๋ก TypeScript ์ ์๋ฅผ ์๋์ผ๋ก ์์ฑํ์ฌ ์ค๋ณต์ฑ์ ์ค์ ๋๋ค.
๋ฐ๋ฉด์ ์ฝ๋ ์ฐ์ ๋ฐฉ์์์๋ ๋ฐ์ฝ๋ ์ดํฐ์ TypeScript ํด๋์ค ๋ง ์ฌ์ฉํ์ฌ ํด๋น GraphQL ์คํค๋ง๋ฅผ ์์ฑํฉ๋๋ค. TypeScript๋ก ๋ ์ ์ ์ผ๋ก ์์ ํ๊ณ ์ธ์ด ๊ตฌ๋ฌธ ๊ฐ์ ์ปจํ ์คํธ ์ ํ์ ํผํ๋ ๊ฒ์ด ๋งค์ฐ ํธ๋ฆฌํฉ๋๋ค.
Getting started
ํจํค์ง๊ฐ ์ค์น๋๋ฉด GraphQLModule์ ๋ฑ๋ก ํ ์ ์์ต๋๋ค.
@@filename()
import { Module } from '@nestjs/common';
import { GraphQLModule } from '@nestjs/graphql';
@Module({
imports: [
GraphQLModule.forRoot({}),
],
})
export class ApplicationModule {}.forRoot()๋ฉ์๋๋ ์ต์
๊ฐ์ฒด๋ฅผ ์ธ์๋ก ๋ฐ์ต๋๋ค. ์ด๋ฌํ ์ต์
์ ๊ธฐ๋ณธ Apollo ์ธ์คํด์ค๋ก ์ ๋ฌ๋ฉ๋๋ค (์ฌ์ฉ ๊ฐ๋ฅํ ์ค์ ์ ๋ํ ์์ธํ ๋ด์ฉ์ ์ฌ๊ธฐ. ์๋ฅผ ๋ค์ด, ๋์ดํฐ๋ฅผ ๋นํ์ฑํํ๊ณ ๋๋ฒ๊ทธ ๋ชจ๋๋ฅผ ๋๋ ค๋ฉด ๋ค์ ์ต์
์ ์ ๋ฌํ์ญ์์ค.
์ธ๊ธ ํ ๋ฐ์ ๊ฐ์ด ์ด ๋ชจ๋ ์ค์ ์ApolloServer ์์ฑ์๋ก ์ ๋ฌ๋ฉ๋๋ค.
Playground
๋์ดํฐ๋ ๊ทธ๋ํฝ ๋ํ ํ ๋ธ๋ผ์ฐ์ ๋ด GraphQL IDE์ด๋ฉฐ ๊ธฐ๋ณธ์ ์ผ๋ก GraphQL ์๋ฒ ์์ฒด์ ๋์ผํ URL์์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ ํ๋ฆฌ์ผ์ด์
์ด ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์คํ๋๋ ๋์ ์น ๋ธ๋ผ์ฐ์ ๋ฅผ ์ด๊ณ http://localhost:3000/graphql๋ก ์ด๋ํ์ญ์์ค (ํธ์คํธ ๋ฐ ํฌํธ๋ ๊ตฌ์ฑ์ ๋ฐ๋ผ ๋ค๋ฅผ ์ ์์).
Multiple endpoints
์ด ๋ชจ๋์ ๋ ๋ค๋ฅธ ์ ์ฉํ ๊ธฐ๋ฅ์ ์ฌ๋ฌ ์๋ ํฌ์ธํธ๋ฅผ ํ ๋ฒ์ ์ ๊ณตํ๋ ๊ธฐ๋ฅ์
๋๋ค. ๋๋ถ์ ์ด๋ค ์๋ ํฌ์ธํธ์ ์ด๋ค ๋ชจ๋์ ํฌํจํ ์ง ๊ฒฐ์ ํ ์ ์์ต๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก GraphQL์ ์ ์ฒด ์ฑ์์ ๋ฆฌ์กธ๋ฒ๋ฅผ ๊ฒ์ํฉ๋๋ค. ๋ชจ๋์ ์๋ธ์
๋ง ์ ํํ๊ธฐ ์ํด include ์์ฑ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
Schema first
์คํค๋ง๋ฅผ ๋จผ์ ์ฌ์ฉํ๋ ค๋ฉด options ๊ฐ์ฒด ์์typePaths ๋ฐฐ์ด์ ์ถ๊ฐํ๋ฉด๋ฉ๋๋ค.
typePaths ์์ฑ์ GraphQLModule์ด GraphQL ํ์ผ์ ์ฐพ์์ผํ๋ ์์น๋ฅผ ๋ํ๋
๋๋ค. ์ด๋ฌํ ๋ชจ๋ ํ์ผ์ ๊ฒฐ๊ตญ ๋ฉ๋ชจ๋ฆฌ์ ๊ฒฐํฉ๋๋ฏ๋ก ์คํค๋ง๋ฅผ ์ฌ๋ฌ ํ์ผ๋ก ๋ถํ ํ์ฌ ๋ฆฌ์กธ๋ฒ ๊ทผ์ฒ์ ์ ์งํ ์ ์์ต๋๋ค.
GraphQL ์ ํ๊ณผ ํด๋น TypeScript ์ ์๋ฅผ ๋ณ๋๋ก ์์ฑํ๋ฉด ๋ถํ์ํ ์ค๋ณต์ด ์์ฑ๋ฉ๋๋ค. ๊ฒฐ๊ตญ, ์ฐ๋ฆฌ๋ ๋จ์ผํ ์ง์ค์ ์์ฒ์์ด ๊ฒฐ๊ตญ SDL ๋ด์์ ์ด๋ฃจ์ด์ง ๊ฐ ๋ณ๊ฒฝ์ผ๋ก ์ธํด ์ธํฐํ์ด์ค๋ ์กฐ์ ํด์ผ ํฉ๋๋ค. ๋ฐ๋ผ์@nestjs/graphql ํจํค์ง๋ ๋ ๋ค๋ฅธ ํฅ๋ฏธ๋ก์ด ๊ธฐ๋ฅ์ ์ ๊ณตํ๋๋ฐ, ์ด๋ ์ถ์ ๊ตฌ๋ฌธ ํธ๋ฆฌ (AST)๋ฅผ ์ฌ์ฉํ TS ์ ์์ ์๋ ์์ฑ์
๋๋ค. ์ด๋ฅผ ๊ฐ๋ฅํ๊ฒํ๋ ค๋ฉด definitions ์์ฑ์ ์ถ๊ฐํ๋ฉด ๋ฉ๋๋ค.
src/graphql.ts๋ TypeScript ์ถ๋ ฅ์ ์ ์ฅํ ์์น๋ฅผ ๋ํ๋
๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ๋ชจ๋ ์ ํ์ด ์ธํฐํ์ด์ค๋ก ๋ณํ๋ฉ๋๋ค. ๊ทธ๋ฌ๋ outputAs ์์ฑ์ class๋ก ๋ณ๊ฒฝํ์ฌ ๋์ ํด๋์ค๋ก ์ ํํ ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ๊ฐ ์์ฉ ํ๋ก๊ทธ๋จ ์์์ ์ ํ ์ ์๋ฅผ ์์ฑํ์ง ์์๋๋ฉ๋๋ค. ๋์ , ์ ์ฉ ๋ช
๋ น์ด ์คํ๋ ๋๋ง ์์ ํ ์ ์ดํ๊ณ ์
๋ ฅ์ ์์ฑํ๋ ๊ฒ์ ์ ํธ ํ ์ ์์ต๋๋ค. ์ด ๊ฒฝ์ฐ generate-typings.ts๋ผ๊ณ ํ๋ ์์ฒด ์คํฌ๋ฆฝํธ๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.
๊ทธ๋ฐ ๋ค์ ๊ฐ๋จํ ํ์ผ์ ์คํํ์ญ์์ค.
info ํํธ ๋ฏธ๋ฆฌ ์คํฌ๋ฆฝํธ๋ฅผ ์ปดํ์ผํ๊ณ ๋์ node ์คํ ํ์ผ์ ์ฌ์ฉํ ์๋ ์์ต๋๋ค.
๊ฐ์ ๋ชจ๋๋ก ์ ํํ๋ ค๋ฉด (.graphql ํ์ผ ๋ณ๊ฒฝ์ ์๋์ผ๋ก ์
๋ ฅ์ ์์ฑ) watch ์ต์
์ generate()๋ฉ์๋์ ์ ๋ฌํ์ญ์์ค.
์์ ํ ์๋ํ๋ ์ํ์ ์ฌ๊ธฐ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
Code first
์ฝ๋ ์ฐ์ ๋ฐฉ๋ฒ์์๋ ๋ฐ์ฝ๋ ์ดํฐ์ TypeScript ํด๋์ค ๋ง ์ฌ์ฉํ์ฌ ํด๋น GraphQL ์คํค๋ง๋ฅผ ์์ฑํฉ๋๋ค.
Nest๋์ด ๊ธฐ๋ฅ์ ์ ๊ณตํ๊ธฐ ์ํด ํ๋ ์๋์์ ๋๋ผ์ด type-graphql ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ๋ฐ๋ผ์ ๊ณ์ ์งํํ๊ธฐ ์ ์ ์ด ํจํค์ง๋ฅผ ์ค์นํด์ผํฉ๋๋ค.
์ค์น ๊ณผ์ ์ด ์๋ฃ๋๋ฉด, autoSchemaFile ์์ฑ์ ์ต์
๊ฐ์ฒด์ ์ถ๊ฐ ํ ์ ์์ต๋๋ค.
autoSchemaFile์ ์๋์ผ๋ก ์์ฑ๋ ์คํค๋ง๊ฐ ์์ฑ๋ ๊ฒฝ๋ก๋ฅผ ๋ํ๋
๋๋ค. ๋ํ buildSchemaOptions ์์ฑ-type-graphql ํจํค์ง์์ buildSchema()ํจ์๋ก ์ ๋ฌ๋๋ ์ต์
๊ฐ์ฒด๋ฅผ ์ ๋ฌํ ์ ์์ต๋๋ค.
์์ ํ ์๋ํ๋ ์ํ์ ์ฌ๊ธฐ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
Async configuration
๋ชจ๋ ์ต์
์ ๋ฏธ๋ฆฌ ์ ๋ฌํ๋ ๋์ ๋น๋๊ธฐ์์ผ๋ก ์ ๋ฌํ๋ ค๋ ๊ฒฝ์ฐ๊ฐ ์ข
์ข
์์ต๋๋ค. ์ด ๊ฒฝ์ฐ ๋น๋๊ธฐ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ช ๊ฐ์ง ๋ค์ํ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ forRootAsync()๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ญ์์ค.
๊ฐ๋ฅํ ์ฒซ ๋ฒ์งธ ๋ฐฉ๋ฒ์ ํฉํ ๋ฆฌ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค.
๋ถ๋ช
ํ, ์ฐ๋ฆฌ ํฉํ ๋ฆฌ๋ ๋ค๋ฅธ ๋ชจ๋ ๊ฒ์ฒ๋ผ ํ๋ํฉ๋๋ค ( async์ผ ์๋ ์๊ณ inject์ ํตํด ์์กด์ฑ์ ์ฃผ์
ํ ์๋ ์์ต๋๋ค).
๋๋ ํฉํ ๋ฆฌ ๋์ ํด๋์ค๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์์ ๊ตฌ์ฑ์ GraphQLModule ๋ด์์ GqlConfigService๋ฅผ ์ธ์คํด์คํ ํ๊ณ ์ด๋ฅผ ํ์ฉํ์ฌ ์ต์
๊ฐ์ฒด๋ฅผ ์์ฑํฉ๋๋ค. GqlConfigService๋ GqlOptionsFactory ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํด์ผํฉ๋๋ค.
GraphQLModule ๋ด์ GqlConfigService๊ฐ ์์ฑ๋๋ ๊ฒ์ ๋ง๊ณ ๋ค๋ฅธ ๋ชจ๋์์ ๊ฐ์ ธ์จ ์ ๊ณต์๋ฅผ ์ฌ์ฉํ๋ ค๋ฉดuseExisting ๊ตฌ๋ฌธ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
ํ๋์ ์ค์ํ ์ฐจ์ด์ ์ผ๋ก useClass์ ๋์ผํ๊ฒ ์๋ํฉ๋๋ค. GraphQLModule์ ๊ฐ์ ธ์จ ๋ชจ๋์ ์กฐํํ์ฌ ์ด๋ฏธ ์์ฑ๋ ConfigService๋ฅผ ์์ฒด์ ์ผ๋ก ์ธ์คํด์คํ ํ๋ ๋์ ์ฌ์ฌ์ฉํฉ๋๋ค.
Last updated