graphql / code first
nestjs 에서 graphql 사용
npm i @nestjs/graphql @nestjs/apollo @apollo/server graphql
nest generate module brand
nest generate resolver brand
nest generate service brand
src/app.module.ts
에 GraphQL module 설정 (아래 ‘codes’ 참고)/src/brand/brand.type.ts
생성 (아래 ‘codes’ 참고)/src/brand/brand.service.ts
(아래 ‘codes’ 참고)/src/brand/brand.resolver.ts
(아래 ‘codes’ 참고)npm run start
- browser에서
localhost:3000/graphql
codes
// app.modules.ts
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { GraphQLModule } from '@nestjs/graphql';
import { ApolloDriver, ApolloDriverConfig } from '@nestjs/apollo';
import { BrandModule } from './brand/brand.module';
import { join } from 'path';
@Module({
imports: [
BrandModule,
// graphql module 설정
GraphQLModule.forRoot<ApolloDriverConfig>({
autoSchemaFile: join(process.cwd(), 'src/schema.gql'),
driver: ApolloDriver,
playground: true,
}),
],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}
// /src/brand/brand.type.ts
import { Field, ObjectType, Int } from '@nestjs/graphql';
@ObjectType()
export class Brand {
@Field(type => Int)
id: number;
@Field()
name: string;
@Field()
company: string;
}
// /src/brand/brand.service.ts
import { Injectable } from '@nestjs/common';
import { Brand } from './brand.type';
@Injectable()
export class BrandService {
private brands: Brand[] = [
{ id: 1, name: 'Air Force', company: 'nike' },
{ id: 2, name: 'Jordan', company: 'nike' },
];
findAll(): Brand[] {
return this.brands;
}
findOne(id: number): Brand {
return this.brands.find(brand => brand.id === id);
}
}
// /src/brand/brand.resolver.ts
import { Args, Int, Query, Resolver } from '@nestjs/graphql';
import { Brand } from './brand.type';
import { BrandService } from './brand.service';
@Resolver(of => Brand)
export class BrandResolver {
constructor(private brandService: BrandService) { }
@Query(returns => [Brand])
brands(): Brand[] {
return this.brandService.findAll();
}
@Query(returns => Brand)
brand(@Args('id', { type: () => Int }) id: number): Brand {
return this.brandService.findOne(id);
}
}
graphQL query
brand.resolver.ts
에 정의한 method 를 이용하게 된다. 아래처럼 brands
를 query하면 brand.resolver.ts
의 brands
가 호출된다.
{
brands{
id, name, company
}
}
{
"data": {
"brands": [
{
"id": 1,
"name": "John Doe",
"company": "john.doe@example.com"
},
{
"id": 2,
"name": "Jane Doe",
"company": "jane.doe@example.com"
}
]
}
}
See Also
- GraphQL vs. REST | Apollo GraphQL Blog
- Rest 의 아이디어는 resource 다. resource type, 에 따라 fetch way 가 다르다.
- GraphQL 은 2개를 따로 정의한다. rdbms의 모습과 비슷하다.
- data 에 대한 schema 를 정의하고,
- query 를 위한 schema 를 따로 만들 수 있다.
- Getting Started with NestJS GraphQL Schema First Approach
댓글 없음:
댓글 쓰기