入った案件でGraphQLを初めて扱うことになったので、それについて記事を書きました。
GraphQLとは
2015年にfacebookが開発したクエリ言語です。
REST APIとやっていることはほぼ同じですが、データ通信量の面でGraphQLの方が負担が少ないという利点があります。
1回の実行で不要な値を取ることがないようにできたり、2度通信するということを防ぐことができます。
ソースコードで定義したコードを元にクライアントとサーバ側でデータの受け渡しができるため柔軟に作ることができます。
同じHTTPエンドポイントにクエリをPOSTするのが特徴。
GraphQLは、WEB/モバイルアプリ(HTTPクライアント)の開発者が、APIを呼び出すことで、バックエンドAPIから必要なデータを正確に取得できるように設計されています。
クライアントサーバーにおけるGraphQLの処理フロー
・GraphQLクエリは、望んでいるJSONと似たフォーマットをしていますが、JSONではないです。そのため、「POST」リクエストを作成してGraphQLクエリをサーバーへ送信されますが、クライアントからは「文字列」になって送信されます。
・サーバーはJSONオブジェクトを取得して、クエリの文字列を抽出します。GraphQLの構文とグラフのデータモデル(GraphQLスキーマ)に従って、サーバーはGraphQLクエリの処理と検証を実施します。
・一般的なAPIサーバーと同様に、GraphQL APIサーバーはデータベースや他のサービスを呼び出して、クライアントがリクエストしたデータを取得します。
・サーバーはデータを取得し、JSONオブジェクトにしてからクライアントに返します。
コード記述例
type Root {
person(id: ID): Person
}
type Person {
id: ID
name: String
birthYear: String
gender: String
friendConnection: PersonfriendsConnection
}
type PersonfriendsConnection {
friends: [Friend]
}
type Friend {
name: String
place: String
relationship: String
}
解説
・Rootはルートとなる型で、サーバーへの問い合わせはここから始まります
・Rootはperson関数を持ち、関数は指定したidのPersonを返します
・Personはid、name、birthYearなどのフィールドを持ちます
・PersonのfriendConnectionフィールドは、PersonfriendsConnection型で、Personの友達(Friends)の配列です
・Friendはname、placeなどのフィールドを持ちます
所感
これまでREST APIしか使ったことがなかったです。
GraphQLを導入することによってコード転送量が減るので、ユーザーレスポンスは少し早くなりそうですね。
ただ実装がやや面倒になるので必要に迫られば導入を検討ですが、表示スピードをそこまで気にしないサービスであれば一般的なREST APIでいいのかなと思われます。
コードでクエリを管理して段々と拡張していけるので大きめのサービスでは効果的そうですね。