【2026年版】GraphQLの始め方 — 柔軟なAPI設計の第一歩


GraphQL — 必要なデータだけ取得 REST API の場合 クライアント /api/users /api/posts /api/comments 大量のデータが返る (不要な項目も含む) 3回のリクエスト GraphQL の場合 クライアント { user { name } posts { title } } GraphQL Server 必要な分だけ ぴったり返る 1回のリクエストで必要なデータを過不足なく取得
GraphQL のデータ取得フロー
🎚 難易度 ★★☆ 中級者向け
⏱ 学習時間の目安 読むだけ10分、サーバー構築まで30〜60分
📚 前提知識 api-development-getting-started の基礎知識・javascript-getting-started の基礎知識
✅ このガイドで学べること
  • GraphQLとRESTの違いと使い分け
  • スキーマ定義とリゾルバの書き方
  • QueryとMutationの基本
  • Apollo Serverまたは類似ツールのセットアップ

GraphQL vs REST 比較

項目RESTGraphQL
エンドポイント数複数(/users, /posts…)1つ(/graphql)
データ取得サーバー側で決まるクライアントが必要な分だけ指定
過不足オーバーフェッチ/アンダーフェッチが起きやすい必要なフィールドだけ取得できる
学習コスト低いやや高い
向いている場面シンプルなCRUD複雑な関連データを扱うとき

はじめてのGraphQL(Apollo Server)

npm init -y
npm install @apollo/server graphql
// server.ts
import { ApolloServer } from '@apollo/server';
import { startStandaloneServer } from '@apollo/server/standalone';

const typeDefs = `
  type User {
    id: ID!
    name: String!
    email: String
  }
  type Query {
    users: [User]
    user(id: ID!): User
  }
`;

const users = [{ id: '1', name: 'ひよこ', email: 'chick@example.com' }];

const resolvers = {
  Query: {
    users: () => users,
    user: (_: unknown, { id }: { id: string }) => users.find(u => u.id === id),
  },
};

const server = new ApolloServer({ typeDefs, resolvers });
const { url } = await startStandaloneServer(server, { listen: { port: 4000 } });
console.log(`サーバー起動: ${url}`);

よくある詰まりポイント

Q: N+1問題が発生する → GraphQLでは関連データを取得するときにN+1クエリが起きやすいです。DataLoaderライブラリを使ってクエリをバッチ処理することで解決できます。

Q: スキーマが大きくなって管理が大変 → スキーマをファイルに分割して mergeTypeDefs で結合したり、Federation(スキーマの分散管理)を使うと整理できます。

Q: RESTとGraphQLどちらを選ぶべき? → 小規模・シンプルなAPIならREST、複数のクライアント(Web/モバイル)が異なるデータセットを必要とする場合はGraphQLが向いています。

ひよこ ひよこ

GraphQLって最近よく聞くけど、REST APIと何が違うの?

ペンギン先生 ペンギン先生

一番大きな違いは「欲しいデータだけを指定して取得できる」ことだよ。REST APIだとエンドポイントごとに返ってくるデータが決まっていて、不要な情報まで含まれることがあるよね。GraphQLはクライアント側が「この項目だけちょうだい」と指定できるから、無駄な通信がなくなるんだ。

ひよこ ひよこ

なるほど!じゃあGraphQLを始めるには、まず何から覚えればいいの?

ペンギン先生 ペンギン先生

まずは3つの操作を覚えよう。データを取得する「Query」、データを変更する「Mutation」、リアルタイムに更新を受け取る「Subscription」。この3つがGraphQLの基本だよ。最初はQueryだけ使えれば十分だね。

ひよこ ひよこ

Queryってどうやって書くの?SQLみたいな感じかな?

ペンギン先生 ペンギン先生

SQLとは全然違って、JSONに似た見た目だよ。たとえばユーザーの名前とメールだけ欲しいなら「query { user(id: 1) { name email } }」のように書くんだ。返ってくるデータもこの構造そのままのJSONになるから、とても直感的だね。

ひよこ ひよこ

すごく分かりやすい!でもサーバー側はどうやってデータの形を決めてるの?

ペンギン先生 ペンギン先生

そこで登場するのが「スキーマ」だよ。スキーマGraphQLの設計図みたいなもので、どんなデータ型があって、どんなクエリを受け付けるかを定義するんだ。SDL(Schema Definition Language)という専用の記法で「type User { id: ID! name: String! }」みたいに型を定義していくんだね。

ひよこ ひよこ

スキーマを書いたら、次はどうやって動かすの?

ペンギン先生 ペンギン先生

開発中はまず「GraphQL Playground」や「Apollo Sandbox」を使うのがおすすめだよ。ブラウザ上でクエリを書いて即座に結果を確認できるから、スキーマの動作確認がとても楽なんだ。VS Codeの拡張機能も入れておくと補完が効いて快適だね。

ペンギン先生 ペンギン先生

ここで実際にApollo Sandboxを試してみてね。サーバー起動後に「http://localhost:4000」をブラウザで開くとGraphQL Playgroundが使えるよ。「{ users { name } }」とクエリを打ってみて、必要なフィールドだけ返ってくる感覚をぜひ体験してみよう!

ひよこ ひよこ

フレームワークはどれを選べばいいの?Apollo?Relay?

ペンギン先生 ペンギン先生

初心者にはApollo Clientがおすすめだよ。ドキュメントが充実していて、ReactVueAngularなど主要フレームワークに対応しているんだ。Relayはメタ社が開発していてパフォーマンスは優秀だけど、学習コストが高めだね。サーバー側はApollo ServerやGraphQL Yogaが人気で、どちらもNode.jsで手軽に始められるよ。

ひよこ ひよこ

学習のロードマップとしては、どういう順番で進めるのがいいかな?

ペンギン先生 ペンギン先生

おすすめのステップはこうだよ。まず公式サイト graphql.org のチュートリアルでQueryとMutationを体験する。次にApollo Serverでシンプルなスキーマを定義してローカルで動かす。そのあとApollo Clientでフロントエンドからクエリを投げてみる。この3ステップで基本は身につくよ。

ひよこ ひよこ

ちなみにGraphQLって本番環境で使うとき、気をつけることはあるの?

ペンギン先生 ペンギン先生

ここはベテランでも見落としがちなポイントだね。GraphQLはクライアントが自由にクエリを組み立てられるぶん、悪意のある深いネストクエリでサーバーに過負荷をかけられるリスクがあるんだ。「Query Depth Limiting」や「Query Complexity Analysis」で制限をかけるのが必須だよ。あとPersisted Queriesを使えば、事前登録したクエリだけを許可できるからセキュリティがさらに強固になるね。

ひよこ ひよこ

セキュリティ以外にも注意点ってあるの?

ペンギン先生 ペンギン先生

N+1問題は要注意だよ。たとえば投稿一覧を取得して、各投稿の著者情報もリゾルバで取ると、投稿の数だけDBアクセスが走ってしまうんだ。これを解決するのがDataLoaderというライブラリで、リクエストをバッチ化して1回のDBクエリにまとめてくれるよ。Facebook(現Meta)が本番でGraphQLを運用する中で生まれたツールだから、実戦で鍛えられた信頼性があるんだね。

次に学ぶなら