📅 最終更新:2026年5月26日

GraphQLとは?
REST APIとの違い・クエリの書き方・スキーマ【実装例付き】

GraphQLはFacebookが開発したAPIクエリ言語です。RESTと異なり、クライアントが「欲しいフィールドだけ」を1リクエストで取得できるため、オーバーフェッチ・アンダーフェッチの問題を解決します。

REST比較 クエリ言語 スキーマ定義

GraphQL vs REST API

比較項目REST APIGraphQL
エンドポイントリソースごとに複数単一(/graphql)
データ取得固定レスポンス形式必要なフィールドのみ指定
オーバーフェッチ起きやすいほぼなし
型安全OpenAPIで補完スキーマで型定義必須
リアルタイムWebSocketで別途実装Subscriptionで標準対応
学習コスト中(スキーマ設計が必要)

クエリの書き方(実装例)

Query(データ取得)

# 必要なフィールドだけ指定して取得
query GetUser {
  user(id: "42") {
    id
    name
    email
    posts {
      title
      createdAt
    }
  }
}

# RESTなら /users/42 と /users/42/posts の2回リクエストが必要だった部分を1回で取得

Mutation(データ変更)

mutation CreatePost($title: String!, $body: String!) {
  createPost(input: {{ title: $title, body: $body }}) {
    id
    title
    createdAt
  }
}

スキーマ定義(SDL)

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

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

type Query {
  user(id: ID!): User
  posts: [Post!]!
}

type Mutation {
  createPost(input: CreatePostInput!): Post!
}

よくある質問

「複数クライアント(Web/モバイル)が異なるデータ形式を必要とする」「フロントエンドが頻繁に変わる」「関連データをネストして1回のリクエストで取得したい」ケースに向いています。小規模な単純なCRUDアプリやシンプルなBFFにはREST APIの方がシンプルで管理しやすいこともあります。

はい、ナイーブな実装だとN+1問題が発生します。解決策として「DataLoader」パターン(バッチ処理でDB呼び出しをまとめる)が広く使われています。Node.js(Apollo/DataLoader)・Python(Strawberry/graphene)等の主要ライブラリはDataLoaderをサポートしています。

使えます。多くの実務プロジェクトでは既存のREST APIをラップしてGraphQLレイヤーを追加する「GraphQL as BFF」パターンを採用しています。Apolloの「Apollo Federation」を使えば複数のマイクロサービスのGraphQLスキーマを統合することも可能です。

関連用語・ページ

🔌

REST APIとは

GraphQLと比較されるREST設計の基礎

🔗

APIとは

APIの基礎知識・Web APIの仕組み

🔷

TypeScriptとは

GraphQLスキーマと相性の良い型安全言語

🏗️

マイクロサービスとは

GraphQL Federationが活きるアーキテクチャ

スキルを転職・年収アップにつなげる

Direct typeでスカウトを受け取る → レバテックキャリアに相談する →