서버/Node.js
TypeGraphQL ?
이건욱
2020. 6. 5. 10:07
TypeGraphQL ?
GraphQL을 Typescript에서 사용을 할때에는 타입정의를 할 때 불편한 점이 많습니다.
이러한 과정을 TypeGraphQL을 통해서 해결을 할수가 있습니다.
설치
yarn add type-graphql reflect-metadata express-graphql @types/express-graphql
그 다음으로 tsconfig.json 파일의 옵션을 수정을 해야합니다.
{
// Decorator를 위한 metadata를 컴파일시에 내보내줍니다.
"emitDecoratorMetadata": true,
// ES7의 Decorator문법을 허용해줍니다.
"experimentalDecorators": true
}
아래에서는 실제로 사용했을 때 간단한 예시로 보여드리겠습니다.
express-graphql
import * as graphqlHTTP from 'express-graphql'
import { getSchemas } from '../graphql/schema'
const schema = await getSchemas()
// 저는 인증방식이 기존에 되어있어서 저렇게 했지만
// TypeGrpahql에서 @Authorized() 활용해서 구축을 하셔도 됩니다.
app.use(
"/graphql",
jwtConfig.isAuthenticated, // 인증
graphqlHTTP(req => ({
schema, // getSchemas() 아래 내용에 적혀져 있습니다.
graphiql : true,
context : {
user_id : req["user"] // context user_id 설정합니다.
}
})))
// Object Type을 설정하는 곳입니다.
@ObjectType()
export class Memo {
@Field()
title : string
@Field()
message : string
}
import { Arg, FieldResolver, Query, Resolver, Root, Mutation, Ctx } from "type-graphql";
import {Parameter} from '../../utils/CodeUtils'
import { Memo } from "../schema/memo";
import {createMemo ,getMemoList} from '../../components/Memo'
@Resolver(of => Memo)
export default class {
/**
* @description GET 메모 리스트
* @param limit
* @param offset
* @param user_id 처음에 Context에 대해서 주어진 값 입니다.
*/
@Query(returns => Memo , {nullable : true})
async getMemoList(
@Arg(Parameter.LIMIT) limit : number,
@Arg(Parameter.OFFSET) offset : number,
@Ctx(Parameter.USER_ID) user_id: string
) : Promise<Memo>{
try{
return await getMemoList(group_id,limit,offset,user_id)
}catch(error) {
logger.error(error)
return
}
}
/**
* @description POST 메모 아이템 생성
* @param title
* @param message
* @param user_id 처음에 Context에 대해서 주어진 값 입니다
*/
@Mutation(returns => Memo , {nullable : true})
async createMemo(
@Arg(Parameter.TITLE) title : string,
@Arg(Parameter.MESSAGE) message : string,
@Ctx(Parameter.USER_ID) user_id: string
) : Promise<Memo> {
try {
return await createMemo(model)
} catch (error) {
logger.error(error)
return
}
}
}
import "reflect-metadata";
import { GraphQLSchema, printSchema } from 'graphql';
import { buildSchema } from "type-graphql";
import MemoResolver from '../resolvers/MemoResolver'
// 현재는 테스트용이기 때문에 하나이지만 저기 배열안에 N개의 Resolver을 생성하시면 됩니다.
export async function getSchemas() {
const schema = await buildSchema({
resolvers: [
MemoResolver
],
emitSchemaFile: true,
})
return schema
}
더 자세한 내용은 링크를 통해서 확인해주세요!