Zenn
🏗️

GraphQLの導入 〜Shopifyに寄り添う〜

2024/12/21に公開

はじめに

こんにちは!株式会社ブロードエッジ・ウェアリンク CTOの高丸です。
今回は、Qiita Advent Calendar 2024の6日目の記事です。

今回は、バックエンドAPIにGraphQLを導入したことに関して書いていきます。

GraphQL導入の決断

5日目の記事でも触れましたが、Shopifyをヘッドレス化するにあたり、バックエンドのAPIが新たに必要になり、それをFastAPIで実現することになりましたが、そのAPIの形式をどうするかが、検討すべきポイントになりました。

結果として、GraphQLを導入することに決定しました。

Shopifyとの協調がGraphQL採用の決め手に

私たちがヘッドレスコマースを実現するにあたり、これらのAPIとの連携は必須でした。
また、5日目の記事でも紹介しましたが、今回作成するAPIは、既存のカルテのバックエンドシステムを最終的に吸収する目的があるため、Shopify APIと我々のAPIを呼び分ける必要が出てきます。

Storefront APIはフロントエンドから直接呼びますが、弊社のバックエンドAPIがShopify Admin APIを叩く構成になる可能性も高いので、その途中がRESTfulというのは難しいだろうと判断しました。

みなさんはShopifyのAPIのドキュメントをご覧になったことはありますか?
Shopifyのストアフロント向けのStorefront APIと、裏側の管理のためのAdmin APIは、GraphQL界隈で最も大規模なAPIの一つです。正直使う側が困るくらいの規模です……(笑)
https://shopify.dev/docs/api/storefront
https://shopify.dev/docs/api/admin-graphql

ですが、逆にこの概念を理解できれば、「どんなGraphQLにも対応できるのでは?」という学びの機会としての期待も感じていました。

弊社のデータ構造からの判断

弊社は、Shopifyに登録するワインの商品データの他に、弊社独自の味わいタイプの概念や、ユーザーの好みのワイン情報(カルテ)や、マッチ度というユーザーの好みとの相性度の表示があるため、それぞれをRESTfulでコールすると、フロントの処理のパフォーマンスに影響するのでは?という目線でも仮説を立てていました。
「RESTfulはオーバーフェッチの可能性がある」という定説があり、フロントが必要なデータだけを取ることも大事ですが、スキーマを中心にフロントエンドとバックエンドが議論できるということも開発効率の上では大事かなと思います。

FastAPIでのGraphQLの実現

FastAPIで、GraohQLを実現するために Strawberryというライブラリを用いて実現しました。
https://strawberry.rocks

Strawberryは、FastAPIとの相性も良く、FastAPIでGraphQLを実現するのはこれのほぼ一択かなと思います。

GraphQLを実現するライブラリはさまざまありますが、パフォーマンス・学習コスト・コミュニティの活発さのどれを取っても、Strawberryは良いものでした。

import strawberry
from fastapi import FastAPI
from strawberry.fastapi import GraphQLRouter

@strawberry.type
class Query:
    @strawberry.field
    def hello(self) -> str:
        return "Hello World"

schema = strawberry.Schema(Query)
graphql_app = GraphQLRouter(schema)
app = FastAPI()
app.include_router(graphql_app, prefix="/graphql")

といった形で、GraphQLRouterをFastAPIのルーティングに追加してあげて、そこに /graphql のエンドポイントを設定するだけで連携できます。

Pythonの型ヒントが使え、FastAPI側のPydanticと同様、GraphQLにおいても型の制御ができます。

GraphQLを使ってみて

使ってみて、GraphQL APIの作り心地としては、Strawberryの恩恵を受けたので難しくはなかったものの、単純にパフォーマンスの低下を招くことがありました。
初期にはDataloadersの機能ををうまく使えていなかったことも挙げられます。これらは後日の記事で詳しく説明していきたいと思います。

また、初期にはできていなかったのですが、Strawberryは、schema.graphqlという形でファイルにスキーマ定義をエクスポートすることができ、これをフロントエンドのエンジニアのIDEに読み込ませることで、GraphQLクエリの補完ができるようになります。開発効率の面で助かりました。

さらには、直近の話にはなりますが、GraphQLの扱い方が弊社システムの鍵になるというチーム内の判断で、GraphQL勉強会(読書会)を開催し、チーム全体のGraphQLの設計・実装スキルの向上させられるまでに至りました。これも後日の記事で紹介していきたいと思います。

Discussion

ログインするとコメントできます