2年前、「新しくクライアント向けのAPIサーバーを作る」ことをしていた。このとき、「REST」と「GraphQL」どちらを採用するか検討し、結局「REST」を採用したのだが、「RESTで保守性の高いAPIサーバーを作るぞ!」と思った時に、「なるほど、こういう点はGraphQLの方が優れているのか」ということがわかってきたので、それについて書く。この記事では「メリット」のみに言及するこれはRESTを採用したことで、「RESTの欠点が見えてきて、一方で、GraphQLのメリットがわかってきた」記事である。そのため、GraphQLの「デメリット」については説明しない。デメリットが無いわけではないので注意してほしい。細かい実装のはしない。型とはまず僕の考える「型」の定義について説明する。人によっては「モデル」の方がしっくりくるかもしれないが、この記事では一律「型」と呼ぶことにする。これを「User型」「Video型」と言う。String}よく言われるGraphQLのメリットさて、よく言われるGraphQLのメリットとして以下のようなものがあると思う。欲しいパラメータだけ取得できる複数のリソースを一発で取得できるしかしこれらはメリットとしてあまり大きくないと個人的には考える。無駄なパラメータを返さないようにすると、負荷が軽くなるが、その実装コストは高い。GraphQLを使うとそれだけで負荷が軽くなる、といった魔法の技術ではない。RESTでもこのような実装は可能である。ようなクエリパラメータをつけることが可能だ。GraphQLのメリットはクエリがわかりやすくなることである。「複数のリソースを一発で取得できる」については、それと「レスポンスが早い」は全く別物である。下手したら「クエリの中の一部がすごく遅いので全体のレスポンスが遅くなる」ことになり、ページ全体が表示されるのが遅くなったりする。本当の強みはGraphQLの本当の強みは「型によるコミュニケーションコストの減少」だと僕は考える。「コミュニケーションコストの減少」とは、GraphQLサーバーを提供するサーバーサイドの開発チームと、それを利用するクライアントサイドの開発チームの間のコミュニケーションコストの減少である。点であると僕は考える。動画を例に考えてみよう。サーバーサイドの型定義には「我々はこういうデータを持っていて、これらの要素を返すことが可能だ」という定義になる。定義がこうあったとする。トップページのおすすめ動画を見てみよう。動画のサムネイル動画のタイトル動画のID(クリックして動画を再生するために必要)とすると、クライアントサイドは以下のような型を定義する。String}この型をGraphQLのクエリで投げつけると返ってくる。次に動画再生ページを考える。投稿者の他の動画(関連動画に表示するとする)投稿者の他の動画については「サムネイル」と「タイトル」と「動画ID」が必要とすると、型定義はこうなる。サブセットなので、このクエリをサーバーサイドに投げると問題なく返ってくる。サーバーサイドの一つの型に対して、クライアントサイドはそのサブセットとなる型を複数定義することができる。これが重要なポイントとなる。コミュニケーションコストが減少するかREST形式の場合、必ずこんなやり取りが発生する。クライアントサイド「動画再生ページで叩くAPIでは、動画の情報とユーザーの情報が必要です。別のクライアントサイド「こっちはまた別のaa要素がほしいですが、bb要素は要りません」クライアントサイドのデバイスごとに微妙に要求する型が異なると、サーバーサイドは頭を抱えながら実装することになる。別のクライアントサイド「お、うちのクライアントで利用する要素も入っているな。いう型を定義しよう」これが結構でかい。近年増加傾向しているので、チームごとにこのやり取りをするとコストが高い。サーバーサイドが型を定義しクライアントサイドがその型を見ながら必要に応じてサブセット型を定義するクライアントの型定義にサーバーサイドが振り回されないのでコミュニケーションコストが減るということである。ここで述べたことは僕がRESTを触って感じた所感であり、事実とはことなることがあります。(異なることがあった場合はコメントやtwitterで「優しく」*1教えてもらえるとありがたいです。公式ページの例のスターウォーズを最近ようやく分かるようになりました。12月にスターウォーズの新作(?)が公開されるみたいです。graphql.org*1:人間のメンタルはそんなに強くないので、知らない人にいきなりキツく言われるともうアドベントカレンダーなんてやるか!って思ってしまいます。アドカレはワクワクするものであって欲しいです。(2)月別アーカイブスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。