0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

入った案件で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でいいのかなと思われます。

コードでクエリを管理して段々と拡張していけるので大きめのサービスでは効果的そうですね。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?