📖

Production Ready GraphQLを読んでみた

2022/04/18に公開

https://book.productionreadygraphql.com/

https://zenn.dev/adwd/articles/4b1e38796bd763

こちらの記事で紹介されているProduction Ready GraphQLを読みました。

ざっくりと感想をまとめたいと思います。

※英文のため理解も曖昧だったりしたので、解釈に間違いがあれば、ご指摘をいただければ幸いです🙏

どんな本?

GraphQL APIを構築する上で考慮すべきことがトピックごとに網羅されています。

冒頭の紹介記事や「Production Ready」という書籍のタイトルにもあるように、GraphQLを触ったことがあって、プロダクトに本格的に採用しようとする段階で読むと、GraphQLにまつわるさまざまな話題を概観することができるので良いと思います。

例えば、「GraphQL Schema Design」ではスキーマ設計にあたって優先すべきことが示されていますし、他にもセキュリティやパフォーマンス、N+1問題に関しても触れられています。

逆に、「これからGraphQLを触ってみたい」という方には、抽象的な内容が多すぎるので、まずは簡単なAPIを構築してみたり、GitHubやShopifyなど公開されているGraphQL APIを叩いて、実際に手を動かしてみることをおすすめします。

感想

GraphQL Schema Design

スキーマを設計する上でのポイントが記載されています。

例えば、publishPostunPublishPostのように対称性だったり、Userで済ませるのではなく、TeamMemberViewerという風に取得できるオブジェクトをより具体的にすると、ユーザーにとって使いやすいスキーマとなるといった感じのことです。

また、スキーマを実装していると、「これとこのオブジェクトってほとんどプロパティが共通だから、一緒にしちゃっていいんじゃないの...?」と思うことも多いと思うのですが、「Sharing Types」という項では、型を共有しすぎると変更した際の影響範囲が大きくなってしまうのでおすすめしない、とされています。

ShopifyやGitHubのスキーマで実践されているポイントが具体的に言語化されているような印象でした。

Implementing GraphQL Servers

GraphQLサーバーを構築する上で検討すべき事柄が記載されています。

例えば、「Code First vs Schema First」という項では、両者のメリットを挙げながら、結論としては各プログラミング言語からスキーマ(SDL)を生成するCode Firstをおすすめしているようでした。

他にも、セキュリティやパフォーマンス・キャッシュなどについて触れられています。

N+1問題に関しては、こちらの記事でも取り上げられているData Loaderというライブラリが紹介されていました。

個人的には、「Persisted Query」という、クエリに対して/graphql/queries/{ハッシュ値}という形式のクエリ固有のHTTPエンドポイントを返しクライアント側がそれを再利用することで、サーバー側でのクエリのパースとバリデーションを省略するという仕組みが面白かったです。
(実際にどれぐらい使われてるんだろう...?)

https://www.apollographql.com/docs/apollo-server/performance/apq/

https://qiita.com/Quramy/items/b3943a0c27f3ade2c57d

GraphQL in a Distributed Architecture

この章は、話の流れがちょっとよくわからなかったですが、基本的には、「RESTと違ってGraphQLの場合はエンドポイントが一つだから、メソッドxエンドポイントを各処理・サービスにマッピングするRESTなどとはインターフェースとしてのAPI Gatewayに求められることが違うよね」という話から、ApolloのSchema Stiching(今ではdepreciated)・Schema Stichingの紹介があって、最終的には、「GraphQL APIはBFFとして、つまり、Gatewayそのものとして機能させるのがおすすめ」という感じでした。

確かに、GraphQL自体、宣言的にすることでクライアント側が使いやすいようにしたものという印象なので、むしろ、APIのインターフェースとして機能させることに集中するというのは結論として納得できたのですが、話の流れがちょっとよくわからなかったかな。。。(オブジェクト同士の依存性とか処理の複雑性をどこに持つかという話で、BFFとして機能するGraphQLから後ろに切り離しちゃった方がいいよ、ってことだったのかな)

BFFとしてのGraphQL APIは、Yahoo! Japanやメルカリで採用されていますね(以下の記事では、フレームワークとしては、どちらもNest.jsを採用しているようですね)

https://engineering.mercari.com/blog/entry/20210818-mercari-shops-nestjs-graphql-server/

https://techblog.yahoo.co.jp/entry/2020121530052952/

おわりに

読む&記事を書くためにもう一度読み返すのに20時間くらいかかってしまいました💦(しかも、理解が曖昧な部分が多い)

もっとGraphQL APIを自分で構築してみてから読んでみても良かったのかなと思います。

ただ、GraphQLに関してこういったトピックがあるということは把握できたので、これから手を動かす中で理解できていくものなのかなと前向きに捉えています。

Discussion