📚

Apollo Server の v3 と v4 における変更内容について調べる

2023/07/17に公開

この記事は Apollo Server の version 3 および 4 における大まかな変更内容と背景について調べた自分用のメモです。

バージョンアップの詳細な影響については公式ドキュメントの Migration guide をご覧ください。

https://www.apollographql.com/docs/apollo-server/migration/

背景

2022 年 11 月に Apollo Server v4 がリリースされた。

https://www.apollographql.com/blog/announcement/backend/apollo-server-4-a-lightweight-and-easier-to-use-apollo-server/

v4 リリースに伴い v2/v3 は既に Deprecated となっており、2023 年 10 月 22 日をもって EOL となる。Deprecated となってもセキュリティパッチの対応は引き続き行われるが、明記されている終了日が過ぎると EOL となり全てのサポートやメンテナンスが打ち切られる。

npm のレジストリから削除されることは無いのでインストールすることは可能だが、当然ながら推奨はされない。

https://www.apollographql.com/docs/resources/product-launch-stages/#stages-for-discontinuing-support

Apollo Server は2021 年 7 月に v3 がリリースされた。v2 のリリースは 2018 年 7 月なので、間隔が短くなっている。個人的な意見として、立て続けにメジャーアップデートが行われたことで「この前バージョン上げたばかりなのにもう EOL になるのか...」と不安を覚えた。

移行について調べる中で Apollo Server の tech lead を名乗る人物が最近の状況について Reddit に投稿していた長文を見つけた。

https://www.reddit.com/r/graphql/comments/z2d5uo/comment/iy94y43/

これを読んで面白かったので v3/v4 の変更内容と背景が整合しているかを軽く調べてみることにした。なお、上記の Reddit の投稿は公式のロードマップ v3 / v4 に書かれている内容やその始まりとなった Issue #3184 とも整合している。

Apollo Server の役割について

Apollo Server は GraphQL サーバーの一種で、様々なデータソースに接続してグラフ構造のデータを返すことができる。

そもそも GraphQL とは

  • HTTP の POST リクエストで
  • GraphQL のクエリや引数を含む JSON を送り
  • レスポンスを JSON で受け取る

ためのクエリ言語とその実行環境であり Apollo Server を使わなくても GraphQL API サーバーを作ることはできる。Apollo Server を使う主な理由としては、GraphQL API のリクエストやレスポンスを扱う上で便利な機能があるため。例えば以下のような機能がある。

  • プラグイン機構
  • Apollo Studio との統合
    • Apollo Studio は GraphQL クエリのための IDE のようなもの
    • スキーマを基にクエリや引数を補完してくれる
  • キャッシュ
    • GraphQL スキーマのフィールドごとに cache の動作を設定できる
    • スキーマで静的に定義することもできるし、リゾルバで動的に定義することもできる
  • persisted query
    • サーバー側にクエリ文字列とその識別子である SHA-256 ハッシュがキャッシュされる
    • クライアントはクエリ文字列の代わりに識別子を送ることで、リクエストに含まれる文字列のサイズを減らすことができる
    • ハッシュを GET リクエストで送信し CDN でキャッシュさせるなどの使い道がある

GraphQL のクエリ解析などは GraphQL.js が行うので、Apollo Server は実質的には TypeScript/JavaScript の Web サーバーと との間をくっつけるアダプタのような役割を果たしているといえる。

変更内容

v3

公式の Migration guide を読むと変更点が書いてある。

v3 で削られた機能

v3 で追加・変更された機能

v4

公式の Migration guide を読むと変更点が書いてある。

パッケージ構造の変更

https://www.apollographql.com/docs/apollo-server/migration#the-new-apolloserver-package

v3 以前の Apollo Server では apollo-server-core が ApolloServer クラスや built-in の plugin やエラークラスを export していたが、v4 ではこれが廃止され @apollo/server を使うようになった。built-in のエラークラスが削除されるなど後方互換性がない変更があった。

Web アプリケーションフレームワークとの統合

もともと Apollo Server では apollo-server-koa のような Web アプリケーションフレームワークごとの integration 用パッケージがあり、それを統一する API はなかった。それらのパッケージは Apollo Server の開発チームによってメンテされていた。それぞれ apollo-server-core から export される ApolloServer のサブクラスとして拡張されており、ユーザーはそれを import して使っていた。

v4 では Apollo Server においてリクエストやレスポンスを扱うための統一された API が定義され、それが各フレームワークの integration から呼ばれるようになった。apollo-server-koa 等の Web アプリケーションフレームワーク向けのパッケージで Apollo によってメンテナンスされていたものは廃止され、@as-integrations/koa のようなコミュニティによってメンテナンスされるパッケージを使うようになった。

v2 では 2018 年時点で Apollo Server が様々なサードパーティのパッケージ(Web アプリケーションフレームワークなど)に対して直接依存しており、共通の API がないため新しい Web アプリケーションフレームワークの統合を追加することが困難だった。また、サードパーティ側のパッケージのバグを Apollo Server の開発チームが修正することもたくさん行われていた。

開発チームとしては Apollo Server と密結合した Web アプリケーションフレームワークなど外部パッケージのバグや脆弱性を修正するのに手間がかかっており、それを改善したい(Apollo の開発チームが修正するのではなく、その外部パッケージを実際に使っている人たちに修正してほしい)という動機があったようだ。

v4 で削られた機能

v4 で追加・変更された機能

v3 で初めて導入された機能で v4 で破壊的変更をされたものはない。やはり本記事冒頭の Reddit 投稿にもある通り v2 からの破壊的変更が大きすぎるので v3/v4 の 2 回に分けてリリースしたように見える。

今後の Apollo

振り返ってみると、メジャーアップデートで削除された機能はどれも Apollo Server の本質的な役割(TypeScript/JavaScript の Web アプリケーションと GraphQL.js のアダプタ)からすると周辺的な機能であり、追加・変更された機能は本質的な役割を補強するものだった。

私個人の Apollo との向き合い方を考えた結果、本質的な役割に沿った機能を使い依存先を絞っていけばバージョンアップに伴う破壊的変更で影響を受けることは少なそうという結論に至った。いわゆる技術スタックと呼ばれるものは何でもそう言えるかもしれないが...

理想を言えば外部への依存は少なければ少ないほど管理しやすいのだが現実にはそうも言ってられないので、依存するならば

  • 明確な役割がある
  • それを体現したインターフェイスが定義されている

ものを選ぶのがよさそう。

会社としての Apollo

Apollo Server は主に Apollo Graph Inc. (以下、Apollo 社と呼ぶ)によって開発されている。

Apollo Server だけでなく Apollo Client や Apollo Studio など主要な製品は全て無料だが、何で収益を得ているのだろうか。

収益源

2019 年 9 月〜2022 年 10 月ごろまでは Apollo Team プランという開発のあれを売っていた。それ以前は GraphQL operation(Query や Mutation)の数に応じて課金されていたらしい。

https://www.apollographql.com/blog/announcement/introducing-new-simpler-pricing-for-apollo-graph-manager-cf4b39d27a82/
https://www.apollographql.com/migration-faq/

また、企業向けに有償機能 + 技術サポートを売っている。

https://www.apollographql.com/enterprise

2022 年 10 月以降は、GraphOS という supergraph(彼らが subgraph と呼ぶ様々な GraphQL API を一箇所に統合するための public なエンドポイント)の実行環境であるクラウドプラットフォームを売っている。

https://www.apollographql.com/blog/announcement/platform/introducing-apollo-graphos/

歴史

Apollo 社の創業メンバーは元々 Meteor Development Group (以下、Meteor 社と呼ぶ)という会社で Meteor.js やそのデプロイ先となるサービスを開発していた。

Meteor 社はプロジェクト名に宇宙関連の用語を使う慣習があり、それで NASA のアポロ計画にあやかって名付けられたようだ(YouTube: Transmission - Episode 7: Apollo AKA Reactive GraphQL)。アポロはギリシャ神話で真実を司る神の名前でもあるので、様々なデータソースを GraphQL で統合する Apollo にはある意味ぴったりな名前と言えるかもしれない。

Discussion