👀

サクっとGraphQLを学ぶ

2023/11/08に公開

GraphQLはAPIのクエリ言語(データの問い合わせのための言語)です。

以下、基本的な三つの特徴を説明します。

3つの特徴

1. 必要なデータのみを取得できる

クライアントからリクエストを送信する際、レスポンスの形式を指定することができ、必要なデータのみを取得することができます。

例)ユーザー情報の中からuserIdとuserNameのみを取得するためのクエリ

リクエスト

query {
 users {
   userId
   userName
 }
}

レスポンス

{
  "data": {
    "users" : [
      { "userId": "1", "userName": "山田" },
      { "userId": "2", "userName": "田中" }
    ]
  }
}

2. 単一のエンドポイントで複数のリソースからデータを取得できる

RestAPIと比較して、一つのエンドポイントで複数のデータソースからデータの取得ができます。これにより、エンドポイントの管理が容易になります。複数のデータソースから一度でデータを取得できるため、データ量の多い場合などは通信効率の向上につながります。

以下リンクの図を参考にしています。
https://zenn.dev/yoshii0110/articles/2233e32d276551#クライアントからのレスポンス形式の指定

3. 型安全なデータ通信が可能になる

schema.graphqlというファイルを作成し、データの型を定義することでDB等のリソースとアプリ側での型の整合性をとることができる。

type User {		→ オブジェクト型		
       id: ID								
       name: String
       email: String						
}

type Query {		→ クエリ型(データ取得)
       me: User		→ User型のデータが返却される
}
 
type Mutation {		→ ミューテーション型(データ追加、更新、削除)
       createUser(id: 4, name: "Gnabry", friends: []){	 createUser(data: UserCreateInput!): User! 	
       → dataを引数にして、User型のデータが返却される
}

"type Subscription { → (変更検知) 
       CreateUserInput: User  → User型のデータが返却される
}								

Restとの比較

以下のサイトを参考に記載しています。
https://zenn.dev/nameless_sn/articles/the_differences_between_rest_and_gql

Restとの大きな違いは以下の二点です。
・取得するデータをリクエスト内で指定できるか
・エンドポイントが単一か複数か

使用できる例

GraphQLが採用される具体的なタイミングとしては以下が代表的なものです。
・複数のデータソースからデータを取得する場合
・帯域幅が限られている場合(スマホやスマートウォッチなどの小さなデバイス)
・迅速なプロトタイピング(一つのエンドポイントでAPIを管理するため柔軟性がある)

導入においてはセキュリティやパフォーマンス面の問題も考慮する必要があり、以下のリンクが参考になりました。
https://engineering.mercari.com/blog/entry/20220303-concerns-with-using-graphql/

まとめ

GraphQLは学習コストが高いなどのデメリットはありますが、今後より多く使用されていくとこになると考えられるので、概念だけでも理解しておく価値はあると思います。
間違えている点等ありましたら教えていただけると嬉しいです!
読んでいただいてありがとうござます。

Discussion