GraphQL - Graphene: 5(Types Reference: Union & Mutation)

Jihun Kim·2022년 4월 28일
0

GraphQL

목록 보기
12/16
post-thumbnail

이 글은 Graphene Docs를 읽고 작성한 것입니다.


Union

  • Union 타입은 필드를 갖지 않으며 다만 다른 ObjectType들의 모임(?)으로 이루어진다.
  • 또한, Union 타입을 정의할 때는 types만 명시해 연결하는 역할을 하며 field를 추가할 수 없다.

타입

import graphene

class Human(graphene.ObjectType):
    name = graphene.String()
    born_in = graphene.String()

class Droid(graphene.ObjectType):
    name = graphene.String()
    primary_function = graphene.String()

class Starship(graphene.ObjectType):
    name = graphene.String()
    length = graphene.Int()

class SearchResult(graphene.Union):
    class Meta:
        types = (Human, Droid, Starship)
  • 위 예시의 SearchResult 타입이 반환됟ㄹ 때는 Human, Droid, Starship 셋 중 하나의 타입을 리턴하게 된다.
  • 주의해야 할 점은 union type에 속한 타입의 경우 다른 Union 타입 또는 interface는 될 수 없다.
    - concrete type이어야 한다.

Mutations

  • Mutation은 데이터 변경에 사용하기 위한 ObjectType이다.

아래의 예시를 보며 파악하는 것이 더 쉽다.

mutation예시

import graphene

class CreatePerson(graphene.Mutation):
    class Arguments:
        name = graphene.String()

    ok = graphene.Boolean()
    person = graphene.Field(lambda: Person)

    def mutate(root, info, name):
        person = Person(name=name)
        ok = True
        return CreatePerson(person=person, ok=ok)
  • person, ok 필드는 mutation이 resolve 되었을 때 반환할 일종의 output field이다.
  • class Arguments는 Mutation 객체인 CreatePerson이 resolve 하기 위해 필요로 하는 attributes이다.
  • mutate함수는 mutation이 호출될 경우 사용되며 일반적인 resolver와 동일한 파라미터를 받는다.
    - 보통 parent(root), info, kwargs를 파라미터로 사용한다.

그러면 mutation에 대한 스키마는 아래와 같이 정의할 수 있다.

schema

# ... the Mutation Class

class Person(graphene.ObjectType):
    name = graphene.String()
    age = graphene.Int()

# mutation에는 CreatePerson Mutation이 사용 된다.
class MyMutations(graphene.ObjectType):
    create_person = CreatePerson.Field()

# person 필드는 Person ObjectType으로 정의된다.
class Query(graphene.ObjectType):
    person = graphene.Field(Person)

schema = graphene.Schema(query=Query, mutation=MyMutations)
  • 정리하면 person 필드는 Person objec type으로 구성되며 mutation이 일어날 때는 MyMutations object type을 사용하는데 해당 object type은 CreatePerson Mutation object를 거쳐 mutate 된다.
profile
쿄쿄

0개의 댓글