서버/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
}

더 자세한 내용은 링크를 통해서 확인해주세요!