[파이썬] Flask를 이용한 GraphQL 연동

GraphQL는 RESTful API의 대안으로 개발된 데이터 쿼리 언어입니다. 이를 이용하여 클라이언트가 원하는 데이터를 효율적으로 요청하고 받을 수 있습니다. 이번 글에서는 Flask 웹 프레임워크를 이용하여 Python에서 GraphQL을 어떻게 연동하는지 배워보겠습니다.

Flask 설치

먼저 Flask를 설치해야 합니다. 아래의 명령어를 이용하여 Flask를 설치해주세요.

pip install flask

Flask-GraphQL 설치

다음으로 Flask-GraphQL을 설치해야 합니다. Flask-GraphQL은 Flask와 GraphQL을 연동하기 위한 라이브러리입니다. 아래의 명령어를 이용하여 설치해주세요.

pip install flask-graphql

Flask 앱 생성

이제 Flask 앱을 생성해보겠습니다. 아래의 예제 코드를 참고하여 Flask 앱을 작성해주세요.

from flask import Flask
from flask_graphql import GraphQLView
import graphene

app = Flask(__name__)

class Query(graphene.ObjectType):
    hello = graphene.String()

    def resolve_hello(self, info):
        return "Hello, World!"

schema = graphene.Schema(query=Query)

app.add_url_rule('/graphql', view_func=GraphQLView.as_view('graphql', schema=schema, graphiql=True))

if __name__ == '__main__':
    app.run()

위의 코드는 /graphql URL에 GraphQL 쿼리를 보낼 수 있는 Flask 앱을 생성하는 예제입니다. hello 필드를 가지는 Query 클래스를 정의하고, 해당 필드의 값을 반환하는 resolve_hello 메서드를 작성합니다. 이후 schema 객체를 생성하고, GraphQLView를 이용하여 Flask 앱에 GraphQL 엔드포인트를 등록합니다.

GraphQL 스키마 작성

그 다음으로는 GraphQL 스키마를 작성해야 합니다. GraphQL 스키마는 서버에서 제공하는 데이터 구조와 쿼리 가능한 필드들을 정의하는 역할을 합니다. 아래의 예제 코드를 참고하여 GraphQL 스키마를 작성해주세요.

import graphene

class Query(graphene.ObjectType):
    hello = graphene.String()

    def resolve_hello(self, info):
        return "Hello, World!"

schema = graphene.Schema(query=Query)

위의 코드는 Query 클래스를 정의하고, 그 안에 hello 필드를 추가한 예제입니다. resolve_hello 메서드에서는 해당 필드의 값을 반환합니다. 이렇게 작성된 스키마는 이전에 작성한 Flask 앱에서 사용될 것입니다.

GraphQL 실행

이제 Flask 앱을 실행하고 GraphQL 쿼리를 보내보겠습니다. 터미널에서 다음의 명령어를 입력하여 Flask 앱을 실행해주세요.

python app.py

Flask 앱이 정상적으로 실행된 후에는 브라우저에서 http://localhost:5000/graphql에 접속하여 GraphQL IDE를 사용할 수 있습니다. IDE에서 적절한 GraphQL 쿼리를 작성하여 실행해보세요.

예를 들어, 아래와 같은 쿼리를 입력할 수 있습니다.

query {
  hello
}

그리고 실행 버튼을 클릭하면, 서버로부터 “Hello, World!”라는 응답을 받을 수 있습니다.

이처럼 Flask를 이용하여 GraphQL을 연동하는 방법에 대해 알아보았습니다. Flask-GraphQL은 GraphQL 서버를 쉽게 구축할 수 있는 편리한 도구입니다. GraphQL을 사용하면 데이터 요청의 효율성을 향상시킬 수 있으므로, 개발 과정에서 유용하게 활용할 수 있습니다.