[파이썬] Tornado에서의 GraphQL 사용

GraphQL은 API 개발을 위한 쿼리 언어와 런타임을 제공하는 웹 서비스입니다. GraphQL은 클라이언트가 필요로하는 데이터를 정확히 요청할 수 있도록 하며, 효율적인 API 호출을 가능하게 합니다. Tornado는 파이썬 기반의 웹 프레임워크로, 비동기 IO를 지원하고 웹 서버와의 통신에 사용되기 때문에 GraphQL과 함께 사용하기에 이상적입니다.

GraphQL 설치

먼저 Tornado와 GraphQL을 설치해야 합니다. 다음 명령을 사용하여 파이썬 패키지 관리자인 pip를 이용해 설치합니다.

pip install tornado
pip install graphql
pip install graphene

GraphQL 서비스 생성

Tornado에서 GraphQL을 사용하기 위해서는 GraphQL 스키마를 정의해야 합니다. 스키마는 GraphQL API의 타입과 필드를 나타내는 역할을 합니다. 다음은 간단한 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 필드를 가진 스칼라 타입인 String 타입을 만들었습니다. hello 필드의 값을 반환하기 위해 resolve_hello 메소드를 정의하였습니다. 이 메소드가 Hello, world!를 반환합니다. 마지막으로 graphene.Schema로 스키마를 구성하였습니다.

GraphQL 엔드포인트 생성

Tornado 애플리케이션에서는 URL 경로와 핸들러를 매핑하는 라우팅을 사용하여 GraphQL 엔드포인트를 생성할 수 있습니다. 다음은 Tornado 애플리케이션에서 /graphql 경로로 GraphQL 스키마를 처리하는 예시입니다.

import tornado.ioloop
import tornado.web
from graphene_tornado.tornado_graphql_handler import TornadoGraphQLHandler

class GraphQLHandler(TornadoGraphQLHandler):
    def prepare(self):
        self.graphql_params = self.get_graphql_params()

if __name__ == "__main__":
    app = tornado.web.Application([
        (r"/graphql", GraphQLHandler, dict(graphiql=True, schema=schema)),
    ])
    app.listen(8888)
    tornado.ioloop.IOLoop.current().start()

위의 코드에서는 TornadoGraphQLHandler를 상속받은 GraphQLHandler 클래스를 정의합니다. prepare 메소드에서는 GraphQL 요청 파라미터를 가져옵니다. app 객체를 생성하고, /graphql 경로와 GraphQLHandler 클래스를 매핑하여 애플리케이션을 시작합니다.

GraphQL 쿼리 실행

GraphQL 엔드포인트를 설정한 뒤에는 클라이언트로부터 GraphQL 쿼리를 전송하고 응답을 받을 수 있습니다. 다음은 curl 명령을 사용해 GraphQL 엔드포인트로 쿼리를 전송하는 예시입니다.

curl -X POST -H "Content-Type: application/json" -d '{"query":"{hello}"}' http://localhost:8888/graphql

위의 명령은 {"query":"{hello}"}라는 GraphQL 쿼리를 /graphql 엔드포인트로 전송합니다. 서버는 Hello, world!라는 응답을 반환합니다.

결론

Tornado에서 GraphQL을 사용하는 것은 매우 간단합니다. GraphQL 스키마를 정의하고, Tornado 애플리케이션에 GraphQL 엔드포인트를 추가하면 됩니다. 이를 통해 클라이언트는 필요한 데이터를 정확하게 요청하고 효율적으로 처리할 수 있습니다. Tornado와 GraphQL을 함께 사용하여 더욱 강력하고 유연한 웹 서비스를 개발해보세요.