본문 바로가기

# GraphQL/GraphQL.js

타입스크립트 GraphQL Resolve Parameter 정보




Resolve 함수의 파라미터 정보


리졸브 함수의 파라미터는 다음과 같습니다.

  • parent: any
    부모 오브젝트 타입에서 반환된 객체.

  • args : any
    현재 오브젝트 타입의 args에 명시된 파라미터의 값

  • context : Context
    오브젝트 타입들이 읽고/쓸수있는 공통객체.
    대표적으로 활용되는 상황은 세션의 값.

  • info : GraphQLResolveInfo
    현재 리졸브 단계에 대한 자세한 정보가 들어있음.





parent? args?


먼저 요약하자면,

현재 오브젝트 타입의 args에 명시된 내용이 args로 들어가고,

부모 오브젝트 타입이 리턴한 내용이 parent로 들어갑니다.


예시를 살펴봅시다.

let book = new GraphQLObjectType({
    name: "book",
    fields: {
        title: { type: GraphQLString },
        author: { type: GraphQLString },
        titleReflect: {
            type: GraphQLString,
            resolve: parent => {
                return parent.title;
            }
        },
        authorReflect: {
            type: GraphQLString,
            resolve: parent => {
                return parent.author;
            }
        }
    }
});

let query = new GraphQLObjectType({
    name: "query",
    fields: {
        book: {
            type: book,
            args: {
                title: { type: GraphQLString },
                author: { type: GraphQLString }
            },
            resolve: (parent, args) => {
                return args;
            }
        }
    }
});

먼저 query 오브젝트 타입은 사용자에게 2개의 인자를 받습니다.

  • title : string

  • author : string


query의 book 필드는 사용자가 전달한 args로 리졸브되고,

book 필드의 반환형인 book 오브젝트 타입으로 args가 흘러들어갑니다.

또한, query에서 리턴한 args가 book 오브젝트 타입의 각 필드에 parent로 들어갑니다.


만약 parent와 필드의 이름 중 일치하는 값이 있다면,

명시적으로 리졸브하지 않아도 parent의 속성으로 결정됩니다.


book 오브젝트 타입의 title과 author가 리졸브되지 않았는데도,

정상적으로 값이 나온것이 바로 그 이유입니다.




titleReflect와 authorReflect는 parent에서 이름이 일치하는 속성이 없으므로,

parent의 title과 author를 가져와서 명시적으로 리졸브해야 합니다.





context


모든 리졸버가 읽고 쓸수 있는 객체이며,

context가 변경되면 뒤의 리졸버에게 영향을 미칩니다.


커스텀 문맥을 넘기고 싶다면, 다음 코드처럼 작성합니다.

명시적으로 문맥을 넘기지 않으면, 다양한 정보가 담긴 무언가가 문맥에 할당됩니다.

const app = express();
app.use(
    "/",
    GraphqlHTTP({
        schema: schema,
        graphiql: true,
        context: {}
    })
);





resolveInfo


현재 리졸브 단계에 대한 정보가 담겨있으며,

대표적인 정보는 다음과 같습니다.

  • 현재 필드 이름

  • 현재 오브젝트 타입 이름

  • 필드 타입

  • 필드 매개변수

  • 스키마

  • 추상문법트리AST 정보

  • ...


분량이 엄청난 관계로...

해외 블로그의 분석글을 퍼다 왔습니다.

resolveInfo의 깊은 이해가 필요하다면 아래 링크로 이동해주세요.

 

GraphQL Server Basics: Demystifying the info Argument in GraphQL Resolvers | Prisma

Structure and Implementation of GraphQL Servers (Part III)

www.prisma.io