GraphQL - Graphene: 2(Types Reference: Schema, Scalar, List, Non-Null)

Jihun Kim·2022년 4월 24일
0

GraphQL

목록 보기
9/16
post-thumbnail

Types Reference

Graphene은 Python의 일반적인 값을 나타내는 몇 가지 기본 types를 제공한다. 이 types는 query의 leaves에서 값을 보여주는 역할을 한다(GraphQL은 그래프이고 이 그래프의 leaf node는 해당 값이 된다고 보면 될 것 같다).

이밖에 본인이 원한다면 커스텀 Scalar types를 만드는 것도 가능하다. 여기서는 커스텀 Scalar types를 만드는 방법을 알아본다.

Custom Datetime Scalar

아래는 커스텀 DateTime 스칼라 타입을 만드는 예시이다.

  • graphene.types에서 Scalar를 임포트 한 뒤 이를 상속 받아 사용하면 된다. 아래와 같이 다양한 메소드를 만들 수 있다.
import datetime
from graphene.types import Scalar
from graphql.language import ast

class DateTime(Scalar):
    '''DateTime Scalar Description'''

    @staticmethod
    def serialize(dt):
        return dt.isoformat()

    @staticmethod
    def parse_literal(node):
        if isinstance(node, ast.StringValue):
            return datetime.datetime.strptime(
                node.value, "%Y-%m-%dT%H:%M:%S.%f")

    @staticmethod
    def parse_value(value):
        return datetime.datetime.strptime(value, "%Y-%m-%dT%H:%M:%S.%f")

Non-Null

  • 만약 name 필드가 non-null 값을 가져야 할 경우 아래와 같이 NonNull 클래스로 String 타입을 wrapping 하면 된다.
  • 그러면 서버는 항상 name 필드를 non-null인 값이 들어올 것으로 알기 때문에 null 값이 들어오면 GraphQL이 에러를 반환한다.

방법1

import graphene

class Character(graphene.ObjectType):
    name = graphene.NonNull(graphene.String)

이는 아래와 같이 String 스칼라 타입에 require=True 속성을 줘서 사용할 수도 있다.

방법2

import graphene

class Character(graphene.ObjectType):
    name = graphene.String(required=True)
  • 만약 Non-Null List를 타입으로 받고 싶다면?
    - 아래와 같이 List 타입의 속성으로 NonNull을 받고, NonNull은 String을 타입 속성으로 받으면 된다.

    import graphene
    
    class Character(graphene.ObjectType):
      appears_in = graphene.List(graphene.NonNull(graphene.String))

    - 이는 아래의 타입 정의와 같은 의미를 갖는다.

    type Character {
    	  appearsIn: [String!]
    }

ObjectType

  • Graphene ObjectType은 스키마의 필드와 해당 데이터가 검색되는 방법 간의 관계를 정의하는 데 사용되는 빌딩 블록이다.
    - ObjectType의 속성은 Field를 나타낸다(아래 예시의 경우 first_name, last_name 등).
    - 각 Field는 데이터를 가져오기 위한 resolver method를 갖는다.
from graphene import ObjectType, String

class Person(ObjectType):
    first_name = String()
    last_name = String()
    full_name = String()

    def resolve_full_name(parent, info):
        return f"{parent.first_name} {parent.last_name}"
profile
쿄쿄

0개의 댓글