โ :GraphQLModule(Apollo server์ ๊ธฐ๋ฐ)๋ก ๐Apollo server์ ์ฐ๋ฆฌ๊ฐ ์ํ๋ ์ธํ ์ ํ๋ ๋ฐฉ์์ ๋ํด์
-apollo server์ ํ์์ ์ผ๋ก 1>typeDefe
์ 2>resolver
๊ฐ ํ์ํ๋ค.
1>typeDefe
๋ document ํน์ ์ฐ๋ฆฌ์ ์๋ฒ์ schema๋ฅผ ํํํ ๊ฒ์ ์๋ฏธํ๋ค.
2>resolver
๋ query๋ฅผ ์ฒ๋ฆฌํ๊ณ mutate์ํฌ ์ ์๋ function์ ์๋ฏธํ๋ค.
FLOWโ
nestjs g mo Restaurants
- RestaurantsModule ์์ฑํ๊ธฐ
nestjs g re Restaurants
- RestaurantResolver ์์ฑํ๊ธฐ
- app๋ชจ๋์ ์ถ๊ฐํ๊ธฐ
- GraphQLModule.forRoot๋ด์ autoSchemaFile ์์ฑ
app.module.ts ๋ด imports ๋ GraphQLModule ๋ถ๋ถ
@Module({ imports: [ GraphQLModule.forRoot({ autoSchemaFile: join(process.cwd(), 'src/schema.gql'), // 1. ํ์ผ ๋ด์ ์ง์ ์คํค๋ง ํ์ผ ์์ฑํ๊ณ ์ ํ ๋ ์ฌ์ฉ autoSchemaFile: true, // 2. ์คํค๋ง ํ์ผ์ ์๋์ผ๋ก ์์ฑํ์ง๋ง ์ง์ ํ์ผ์ ๊ฐ๊ณ ์์ง ์๊ณ ์ถ์ ๋ ์ฌ์ฉ // ๋ ์ค ํ๋ ์ ํ }), ], })
- app๋ชจ๋์ Imports์ RestaurantsModule ์ถ๊ฐ
app.module.ts
import { Module } from '@nestjs/common'; import { GraphQLModule } from '@nestjs/graphql'; import { join } from 'path'; import { RestaurantsModule } from './restaurants/restaurants.module'; @Module({ imports: [ GraphQLModule.forRoot({ autoSchemaFile: true, }), RestaurantsModule, ], controllers: [], providers: [], }) export class AppModule {}
- restaurants.module.ts ์์ฑํ๊ธฐ
- providers์ ๋ฆฌ์กธ๋ฒ ์ถ๊ฐํ๊ธฐ
restaurants/restaurants.module.ts
import { Module } from '@nestjs/common'; import { RestaurantsResolver } from './restaurants.resovler'; @Module({ providers: [RestaurantsResolver], }) export class RestaurantsModule {}
- restaurants.resolver.ts ์์ฑํ๊ธฐ
- Resolver๋ฐ์ฝ๋ ์ดํฐ ์์ฑ
- Query ๋ฐ์ฝ๋ ์ดํฐ(typeFunc๋ฅผ ๋ฐ์,์ฟผ๋ฆฌ๊ฐ ๋ฆฌํดํ๊ณ ์ํ๋ ํ์ ์ ๋ฆฌํดํ๋ function ํํ๋ก ์์ฑ) ์์ฑ
- Query ๋ฐ์ฝ๋ ์ดํฐ์ ๋ฆฌํด ํ์ ์ ๊ทธ๋ํ ํ์์ ์ํ ๊ฒ(ํ์)์ด๋ค.
- isPizzaGood ํจ์์ ๋ฆฌํด ํ์ ์ ํ์ ์คํฌ๋ฆฝํธํ ์ํ ๊ฒ(์ต์ )์ด๋ค.
restaurants/restaurants.resolver.ts
import { Query, Resolver } from '@nestjs/graphql'; @Resolver() export class RestaurantsResolver { @Query(() => Boolean) isPizzaGood(): boolean { return true; } }
-
entities๋
๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์๋ ๋ชจ๋ธ์ ์๋ฏธํ์ฌ entity ํ์ผ์ ์์ฑํ๋ ๊ฒ์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ชจ๋ธ์ ๋ง๋ ๊ณผ์ ์ด๋ค.
import { Field, ObjectType } from '@nestjs/graphql';
@ObjectType()
export class Restaurants {
@Field((type) => String)
name: string;
@Field((type) => Boolean, { nullable: true })
isGood?: boolean;
}
- entity์ ๋ง๊ฒ resolver์ Query ์์ ํ๊ธฐ
- @Resolver์ ๋ ์คํ ๋ entity๋ฅผ ์ธ์๋ก ์์ฑํด์ฃผ๋ฉดํ์ฌ ์ด Resolver๊ฐ Restaurants์ Resolver ์์ ๋ช ์(์ต์ )ํด์ค ์ ์๋ค.
- @Query()์ ์ธ์๋ก entity๋ก ์์ฑํ Restaurants๋ฅผ ๋๊ฒจ์ค๋ค.
restaurants/restaurants.resolver.ts
import { Query, Resolver } from '@nestjs/graphql'; import { Restaurants } from './entities/restaurants.entity'; @Resolver((of) => Restaurants) export class RestaurantsResolver { // ์ด๋ ๊ฒ ์ฟผ๋ฆฌ๋ฅผ ๋ง๋๋ ๋์ // @Query(() => Boolean) // isPizzaGood(): boolean { // return true; // } @Query((returns) => Restaurants) myRestaurant() { return true; } }
- resolver์ objectType์ nestjs์์ graphql์ ์ฌ์ฉํ๊ธฐ ์ํด ํ์์ ์ธ ์กด์ฌ์ด๋ค~
- ๋๊ผด๋ผ์ค ์ค ์ฐ๋ฒ์ด์ธ ๊ฐ์์ค:]