[python] Marshmallow와 GraphQL을 함께 사용하여 데이터 쿼리하기

이번에는 Marshmallow와 GraphQL을 함께 사용하여 데이터를 쿼리하는 방법에 대해 알아보겠습니다.

Marshmallow란?

Marshmallow는 Python에서 사용되는 직렬화 및 역직렬화 라이브러리입니다. Marshmallow를 사용하면 복잡한 데이터 객체를 직렬화하여 JSON, YAML 또는 텍스트로 변환할 수 있으며, 역으로도 같은 방식으로 변환할 수 있습니다.

GraphQL이란?

GraphQL은 Facebook에서 개발된 쿼리 언어입니다. GraphQL은 RESTful API보다 유연하며, 클라이언트가 필요로하는 데이터를 정확히 요청할 수 있습니다. GraphQL은 하나의 엔드포인트로 여러 데이터를 한 번에 요청할 수 있으며, 반환되는 데이터의 구조도 클라이언트에 따라 동적으로 정의할 수 있습니다.

Marshmallow-GrahpQL 라이브러리

Marshmallow-GrahpQL은 Marshmallow와 GraphQL을 함께 사용하기 위한 라이브러리입니다. 이 라이브러리는 Marshmallow의 기능을 GraphQL 스키마와 함께 사용할 수 있도록 도와줍니다.

데이터 쿼리하기

먼저 Marshmallow 스키마를 작성해야 합니다. 스키마는 데이터 모델과 직렬화 / 역직렬화 규칙을 정의하는 데 사용됩니다. 예를 들어, 다음과 같은 User 모델이 있다고 가정해 봅시다.

from marshmallow import Schema, fields

class UserSchema(Schema):
    id = fields.Int()
    name = fields.Str()
    email = fields.Email()

이제 GraphQL 스키마를 작성하고 Marshmallow 스키마와 연결해야 합니다. GraphQL 스키마는 데이터 쿼리 및 반환 형식을 정의하는 데 사용됩니다. 예를 들어, 다음과 같이 사용자를 조회하는 쿼리를 작성할 수 있습니다.

import graphene
from graphene_sqlalchemy import SQLAlchemyObjectType

from models import User

class UserObject(SQLAlchemyObjectType):
    class Meta:
        model = User
        interfaces = (graphene.relay.Node,)

class Query(graphene.ObjectType):
    users = graphene.List(UserObject)

    def resolve_users(self, info):
        query = User.get_query(info)
        return query.all()

schema = graphene.Schema(query=Query)

이제 GraphQL 스키마를 실행하는 GraphQL 쿼리 엔진을 빌드해야 합니다. Flask를 사용한다고 가정해 봅시다.

from flask import Flask
from flask_graphql import GraphQLView

app = Flask(__name__)
app.add_url_rule(
    '/graphql',
    view_func=GraphQLView.as_view(
        'graphql',
        schema=schema,
        graphiql=True  # 개발용 GUI 도구를 제공합니다.
    )
)

이제 서버를 실행하고 localhost:5000/graphql로 접속하면 GraphQL Playground와 함께 데이터를 쿼리할 수 있는 환경이 구성됩니다. users를 조회하기 위해 다음 쿼리를 실행할 수 있습니다.

query {
  users {
    id
    name
    email
  }
}

위의 GraphQL 쿼리를 실행하면 users의 id, name, email이 반환되어 표시됩니다.

결론

이상으로 Marshmallow와 GraphQL을 함께 사용하여 데이터를 쿼리하는 방법에 대해 알아보았습니다. Marshmallow-GrahpQL 라이브러리를 사용하면 Marshmallow의 강력한 직렬화 기능과 GraphQL의 유연한 데이터 요청 기능을 함께 사용할 수 있습니다. 새로운 프로젝트를 시작할 때 이러한 기술을 고려해보는 것을 추천합니다.

참고 자료