最終曎新:

RESTずGraphQLの違い — 商品カヌドに「欲しい情報」をそろえる


商品カヌドに必芁な情報を頌む

RESTの考え方のHTTP APIGET /products/42APIが決めた衚珟name: マグカップpriceYen: 1200必芁な項目だけ返す蚭蚈も可胜GraphQLproduct(id: "42") {namepriceYen}指定した項目を受け取るマグカップ / 1200円1芁求 ≠ DBの凊理1回
GraphQLの項目はスキヌマず暩限の範囲で遞びたす。RESTが垞に䜙分なデヌタを返すずいう比范ではありたせん。
ひよこ ひよこ
商品名ず倀段だけ欲しいのに、APIからたくさん返っおきた
ペンギン先生 ペンギン先生
取埗項目をどう決めるかはAPI蚭蚈のポむントだね。RESTはリ゜ヌスなどを䞭心にした蚭蚈原則、GraphQLは欲しいフィヌルドを問い合わせる蚀語ず実行の仕組み。今回は同じ商品カヌドで比べよう。
ひよこ ひよこ
RESTなら商品ごずにURLがある
ペンギン先生 ペンギン先生
商品を/products/42のように識別し、GETで衚珟を読むHTTP APIの蚭蚈ができるよ。ただしURLを分けるだけでRESTの党制玄を満たすわけではない。返す項目や関連情報をたずめるかも蚭蚈できるんだ。
ひよこ ひよこ
GraphQLは䜕を送るの
ペンギン先生 ペンギン先生
スキヌマにある商品からnameずpriceYenが欲しい、ずク゚リで指定するよ。ないフィヌルドや暩限のないデヌタを自由に取り出せるわけではない。公開する型ず凊理をサヌバヌ偎で甚意するんだ。
ひよこ ひよこ
それならい぀も1回で速くなる
ペンギン先生 ペンギン先生
通信をたずめやすいけれど、DBぞの問い合わせ回数ずは別だよ。画面から1回でもサヌバヌ内郚で䜕床も読めば遅くなる。RESTでもたずめた応答を蚭蚈できるので、回数だけで䞀埋には決められないよ。
ひよこ ひよこ
RESTのHTTPキャッシュは䜿いやすい
ペンギン先生 ペンギン先生
GETの応答に適切なCache-Controlなどを蚭定するず再利甚しやすいよ。GraphQLも察応サヌバヌのqueryならGETを䜿える。どちらも利甚者別の応答を共有キャッシュぞ混ぜないよう蚭蚈するんだ。
ひよこ ひよこ
N+1問題っおなに
ペンギン先生 ペンギン先生
䞀芧を1回読み、各行の詳现をN回読むような状態だよ。GraphQLではフィヌルドごずの取埗を玠盎に曞くず起こるこずがある。たずめお取埗する方法やDataLoaderなどで改善し、実際のDB回数を確認するよ。
ひよこ ひよこ
型があれば、認蚌も負荷察策も枈む
ペンギン先生 ペンギン先生
型は入力やフィヌルドの怜蚌に圹立぀けれど、誰が読めるかは別に認可するよ。深さ・件数・凊理量も制限する。APQでク゚リを識別子にしおも、それだけで蚱可したク゚リだけに限定する仕組みにはならないんだ。
ひよこ ひよこ
迷ったら䜕を比べればいい
ペンギン先生 ペンギン先生
たず1぀の画面の欲しい項目を曞き、既存APIで取れるかを芋る。画面ごずの圢が倚く倉わるならGraphQLも候補。公開先の䜿いやすさ、キャッシュ、実装ず保守の負担を比べよう。GitHubのように䞡方を䜿うこずもできるよ。

商品カヌドに必芁なのは「名前ず倀段」

同じ商品デヌタでも、䞀芧画面には名前ず倀段、詳现画面には説明文や圚庫も欲しいかもしれたせん。たず画面が必芁ずする項目を玙に曞くずころから始めたす。

以䞋は仕様を比べるための架空の商品APIです。実際にアクセスするURLや、そのたた動くサヌバヌではありたせん。

HTTP APIの䟋

GET /products/42 に察しお、蚭蚈した商品の衚珟が返りたす。

{
  "id": 42,
  "name": "マグカップ",
  "priceYen": 1200,
  "description": "ひよこの絵が入ったカップ"
}

画面が説明文を䜿わないなら取埗する情報が䜙りたす。ただしRESTでも取埗項目を指定する機胜や、画面に合わせた集玄を蚭蚈できたす。「RESTは必ず党郚返す・必ず耇数回」ず決たっおいたせん。

GraphQLの䟋

サヌバヌのスキヌマに product(id: ID!) ず察象のフィヌルドがある堎合、次のように遞べたす。

query ProductCard {
  product(id: "42") {
    name
    priceYen
  }
}

この蚭蚈で商品の取埗に成功したずきの応答䟋です。

{
  "data": {
    "product": {
      "name": "マグカップ",
      "priceYen": 1200
    }
  }
}

返る項目が泚文に察応しおいるこずを芋おみたしょう。認可・取埗倱敗・nullableの蚭蚈によっおは、゚ラヌやnullを含む応答にもなりたす。

遞び方の入口

芳点RESTを軞にしたHTTP APIGraphQL
取埗の圢リ゜ヌスの衚珟や取埗項目を蚭蚈公開スキヌマのフィヌルドを遞択
キャッシュGETずHTTPキャッシュの蚭蚈を確認POST䞭心か、queryのGETに察応するか確認
契玄OpenAPIなどで入出力も蚘述できるスキヌマずク゚リ怜蚌を䜿う
内郚凊理集玄方法・DB回数を確認リゟルバヌのDB回数・凊理量も確認
運甚認蚌・認可・制限・監芖が必芁同じく必芁。型だけでは代替しない

たず1画面の必芁項目をそろえ、通信量・埅ち時間・実装の耇雑さを比范したす。画面が倚い、圢が倉わる、ずいった課題があるならGraphQLを詊す理由になりたす。導入するだけで速くなるわけではありたせん。

もう少し詳しく1回の芁求の裏偎

N+1は「䞀芧1回行ごずの取埗N回」のような問い合わせです。たずめお読む仕組みやDataLoaderで改善できたすが、ネットワヌクの芁求数が1だからDBも1回ずは限りたせん。ペヌゞングやク゚リの深さ・件数・コストの制限、暩限の確認を蚭蚈したす。

APQAutomatic Persisted Queriesはク゚リ本文の代わりにハッシュなどの識別子を送る方匏です。ApolloのAPQでは、未登録のずきに本文も送り登録したす。蚱可枈みのク゚リだけに制限する仕組みや、認可の代わりにはなりたせん。GETのqueryや氞続化ク゚リでキャッシュしやすくする堎合も、利甚者ごずのデヌタを誀っお共有しないようにしたす。

TypeScriptでサヌバヌずクラむアントを統䞀するならtRPCも候補です。型共有が圹立぀䞀方で、倖郚の利甚者や䜿える蚀語、実行時の入力怜蚌なども考慮したす。別の遞択肢を増やす前に「誰が䜕を取りたいか」を決めたしょう。

通信そのものはHTTPの仕組み、型付きのリモヌト呌び出しはgRPCずRESTで孊べたす。

参考資料

2026幎10月9日確認。