一発目なので、ここ最近検証したネタから行こうと思います!
最近 WebAPI の世界でRESTfulとGraphQLの話がよく出てきます。
GraphQLの説明はいろんな情報がネットにあるので、
実際に仕事などで感じた事と比較して書こうと思います。
RESTだと厳しくなってきた現状
- API利用側の要件増加
- 利用側がかならずしてもドメイン単位で、利用するとは限らない
- 通信コスト増加 (一部データの利用しかなくても付随データが通信上にながれる)
- endpointの増加 (要件ごとに増える)
よく見られる現場での対応方法
- endpointを増やす
- endpointに必要になった段階で情報を増やす (マイクロサービスでなくなっていく。。。)
- こっちの方が多そう
外向けに公開しない場合は、正直そこまで綺麗に分ける必要もないと思いますが、
通信コストと技術的負債の加速的な影響がありそうなので、できればキレイにしたいとこです。
GraphQLとRESTfulの特徴の比較 (Queryのみ)
RESTful | GraphQL | |
---|---|---|
条件付与 | GETパラメータ | リクエストボディ(POST) |
エンドポイント | 複数 | 1つ |
スコープ | ドメイン単位 | 関連データすべて |
キャッシュ | responseキャッシュ | データキャッシュ |
[GitHub Developer] でexplorerが
利用できるので試してみるとイメージがつかみやすいと思います。
GraphQLを体感してみる
[GitHub Developer] でexplorerが
利用できるので試してみるとイメージがつかみやすいと思います。
実際のイメージ
rubyplusさんの記事をもとにサンプルを作ったので
画面で確認したいと思います。
記事につかったものはgithubにあげてあります。
階層がないパターン
- Query
- [allPeople]内で欲しい情報を定義しています [id, fullName]
- Response
- Queryで指定した[field]の値のみが返ってきています
- Document
- Queryとして実行できるものが表示されています。
階層があるパターン
- Query
- [allPeople]内で欲しい情報を定義しています [id, lastName]
- [friends]で異なる情報を指定しています[fullName]
- Response
- Queryで指定した[field]の値のみが返ってきています
- 階層化していした[friend]も指定した[field]の値のみが返ってきています.
- Document
- People(Person)で取得できる[field]を見ることができます
GraphQLを触って思ったこと
メリット
- ドキュメントメンテしなくてよいので、運用や実装が楽
- GraphQLのスキーマを定義するとExplorerで確認できる。
- データアクセスが直観的で、ExplorerでQueryが試せるので開発効率がよさそう
- スキーマ設定がプログラム指定なので、メンテが楽(XMLとかよりは)
デメリット (と言うか気になる点)
- サーバーサイド実装がちょっと大変になるかも
- Schema定義が肥大化しないアプローチは検討したい
- キャッシュのアプローチを検討
(endpointが一つになるのでCDNが使えない??) - 見えてない課題もあるので、ちょっと一息
まとめ
RESTとGrapQLの2択というよりは、お互いのメリットを生かして使っていければと思います。
大量データを返すAPI(肥大化したAPI?)を利用する場面が増えるかもしれないので
積極的に検証していきたいと思います。
次回はスキーマ定義や実装部分についてかければよいなと思います。