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?

GraphQLとは

Posted at

GraphQLとは

GraphQLはAPIのクエリ言語です。
「クエリ」という単語を聞くとSQLみたいなものを想像しがちですが、実態は関数の実行を通して、データの取得や操作などのリクエストを行います。
一言で言うと「クライアントとサーバー間のデータ問い合わせに特化した言語」となります。

GraphQLの誕生背景

GraphQLの詳細を語る前にREST APIについて簡単に解説します。

REST APIとは

REST(Representational State Transfer)の原則に基づいて設計されたAPIのことです。Webシステムを外部から利用するためのプログラムの呼び出し規約(API)の種類の一つです。
RESTの原則は以下のものになります

  • アドレス可能性
    • URIを使ってリソースに対して一意のアドレスを割り当てること
  • 統一したインターフェース
    • HTTPプロトコルという標準化されたインターフェース(GET、POST、PUT、DELETEなど)を使うことで、アプリケーション間での相互運用性を高めること
  • ステートレス状態
    • サーバがクライアントのコンテキストや状態を保持しないため、セッションIDやログイン状態などはクライアント側で管理する
  • 接続性
    • クライアントとサーバが論理的に通信可能であること
    • サーバーは、クライアントがより多くのリソースを動的に検出できるように、表現でハイパーリンクを送信することによってこれを実現する

GraphQLとは

GraphQLは、複雑化するモバイルやWebアプリのニーズに応えるために設計されました。
REST APIでは、エンドポイントごとに取得するデータが固定されているため、過剰なデータ取得や不足が課題となることがありました。
GraphQLはこの問題を解決するために、クエリごとに必要なデータを指定できるようになっています。

GraphQLの特徴

クエリ言語としての柔軟性

GraphQLでは、フロントエンドが必要なデータを明示的に指定できるため、APIで固定されているデータの過不足が解消されます。

型システムによる安全性

GraphQLはスキーマで型を定義します。これにより、クライアントとサーバー間の通信が型安全になり、デバッグが容易になります。

単一のエンドポイント

GraphQLではすべてのリクエストが1つのエンドポイントを通じて処理されます。異なるリソースを取得する際でも一つのエンドポイントへのリクエストで済みます。

REST APIとの比較

特徴 REST API GraphQL
データアクセス リソースを定義する複数のURLエンドポイント 単一のURLエンドポイント
データ取得 エンドポイントごとに取得するデータが固定されている 必要なデータをクエリで指定可能
過剰なデータ取得の有無 過剰または不足が発生する可能性 必要なデータのみ取得
型システム 通常は型がない 強力な型システムを持つ

GraphQLの基本構文

クエリ: データを取得する操作

query {
  user(id: "1") {
    id
    name
    email
  }
}

ミューテーション: データを更新・作成・削除するための操作

mutation {
  createUser(input: { name: "Alice", email: "alice@example.com" }) {
    id
    name
  }
}

サブスクリプション: リアルタイム更新を受け取るための操作

subscription {
  messageAdded {
    id
    content
    sender {
      name
    }
  }
}

GraphQLのアーキテクチャ

スキーマ

データの型や返す値の型を定義するところです。以下の例は、ユーザーと投稿のスキーマ定義です。

type User {
  id: ID!
  name: String!
  posts: [Post]
}

type Post {
  id: ID!
  title: String!
  content: String!
  author: User
}

リゾルバ

スキーマで定義されたフィールドに対して実際のデータを返すロジックです。

const resolvers = {
  Query: {
    user: (parent, args, context) => {
      return context.db.getUserById(args.id);
    },
  },
};

デメリット

  • 学習コスト
    スキーマ設計やリゾルバの実装には学習が必要となる。
  • パフォーマンスの課題
    複雑なクエリによるサーバー負荷の増加の可能性がある。
  • キャッシングの難しさ
    RESTに比べてキャッシュ管理が複雑。

終わりに

GraphQLは名前は聞いたことあるけど…と言う方向けに概要を抑えられるようまとめてみました。
読んでいただきありがとうございました!

参考記事

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?