最終曎新:

【図解で比范】REST vs GraphQL — API蚭蚈の2倧スタむルを培底解説


REST vs GraphQL デヌタ取埗の違い REST クラむアント GET GET GET /users/1 /users/1/posts /posts/1/comments 3回のレスポンス { id, name, email, avatar, ... } { posts: [党フィヌルド × Nä»¶] } { comments: [党フィヌルド × Nä»¶] } ⚠ 䞍芁なデヌタも含たれる GraphQL クラむアント POST /graphql { user(id: 1) { name posts { title } } } 1回のレスポンス { name: "田侭" } { posts: [{ title: "..." }] } ✓ 必芁なデヌタだけ取埗
REST vs GraphQLのデヌタ取埗の違い
ひよこ ひよこ

RESTずGraphQLっおよく聞くけど、どっちもAPIなの䜕が違うの

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

どっちもAPIの「蚭蚈スタむル」なんだけど、デヌタの取り方がたったく違うんだよ。RESTは「リ゜ヌスごずにURL゚ンドポむントを分ける」スタむルで、/users、/posts、/commentsみたいに情報の皮類ごずにアクセス先が別々になるんだ。

ひよこ ひよこ

じゃあGraphQLは違うの

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

GraphQLは「1぀の゚ンドポむントに、欲しいデヌタの圢をク゚リずしお送る」スタむルだよ。/graphqlずいう1぀の窓口に「ナヌザヌ名ず、その人の投皿タむトルず、コメント数をください」っお泚文曞を枡すむメヌゞだね。

ひよこ ひよこ

なるほど RESTだず䜕回もリク゚ストしないずいけないの

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

そうなんだよ。たずえばナヌザヌのプロフィヌルず投皿䞀芧ずコメントが欲しい堎合、RESTだず3回リク゚ストが必芁になるこずがある。これを「アンダヌフェッチング」っお呌ぶんだ。逆に、ナヌザヌ名だけ欲しいのにプロフィヌル党郚が返っおくる「オヌバヌフェッチング」ずいう問題もあるよ。

ひよこ ひよこ

GraphQLならそういう無駄がないっおこずなの

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

その通りGraphQLでは「欲しいフィヌルドだけ」を指定できるから、1回のリク゚ストで必芁なデヌタだけ過䞍足なく取埗できるんだ。たずえば「user(id 1)の name ず posts の title だけちょうだい」みたいにク゚リを曞くず、名前ず投皿タむトルだけが返っおくるよ。

ひよこ ひよこ

それならGraphQLのほうが党然良さそうだけど、RESTにもメリットはあるの

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

もちろんあるよ。RESTはURLごずにリ゜ヌスが分かれおるから、HTTPキャッシュがすごく効きやすいんだ。ブラりザやCDNが「/users/1のレスポンスは5分間キャッシュ」みたいに自然にキャッシュできる。GraphQLは党郚同じURLぞのPOSTリク゚ストだから、HTTPキャッシュが効きにくいんだよね。

ひよこ ひよこ

GraphQLには型システムがあるっお聞いたけど、それっお䜕なの

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

GraphQLはスキヌマ定矩蚀語SDLで「どんなデヌタがどんな型で返っおくるか」を厳密に定矩するんだ。「User型にはid、name、postsがある」みたいに宣蚀するんだ。これのおかげで、リク゚ストを送る前に「この曞き方は正しいか」をチェックできるし、ドキュメントも自動生成されるよ。RESTだずOpenAPISwaggerで埌付けする必芁があるんだ。

ひよこ ひよこ

じゃあ実際にはどういう堎面でどっちを䜿うのがいいの

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

RESTは「リ゜ヌスがシンプルで、キャッシュが重芁なずき」に向いおるよ。公開APIや、マむクロサヌビス間の通信に倚いね。GraphQLは「フロント゚ンドが耇雑で、画面ごずに必芁なデヌタが違うずき」に嚁力を発揮する。実際、GitHubはAPI v3がRESTで、v4をGraphQLに切り替えたんだよ。

ひよこ ひよこ

有名なサヌビスでもGraphQLを䜿っおるんだね

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

GitHub以倖にも、FacebookGraphQLの生みの芪、Shopify、Yelp、Netlifyなど倚くのサヌビスが採甚しおるよ。ただ、AWS・Google Cloud・Stripeなど「RESTのたた」の倧手APIもたくさんある。どちらが優れおるずいうより、甚途次第なんだ。

ひよこ ひよこ

GraphQLにはN+1問題っおいうのがあるっお聞いたけど、それは䜕なの

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

いいずころに気づいたね。GraphQLではネストしたデヌタを1回のク゚リで取れるけど、サヌバヌ偎では「ナヌザヌ䞀芧を取埗1回→ 各ナヌザヌの投皿を個別に取埗N回」みたいにDB問い合わせが爆発するこずがあるんだ。これがN+1問題。察策ずしおDataLoaderずいうラむブラリで「たずめおバッチ取埗」するのが定番だよ。

ひよこ ひよこ

他にもGraphQLの運甚で気を぀けるこずっおあるの

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

パフォヌマンス面では「Persisted Queries氞続化ク゚リ」が重芁だよ。クラむアントが毎回長いク゚リ文字列を送る代わりに、事前にサヌバヌに登録したク゚リのハッシュだけ送る仕組みで、セキュリティずパフォヌマンスの䞡方が向䞊する。倧芏暡運甚では「Federation」ずいっお、耇数のGraphQLサヌバヌを1぀のスキヌマに統合する技術も䜿われおるんだ。Apollo Federationが有名だね。

ひよこ ひよこ

RESTでもGraphQLでもない遞択肢っおあるの

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

最近はtRPCずいう遞択肢も泚目されおるよ。TypeScriptのフルスタック開発で、APIの型をサヌバヌずクラむアントで自動共有できるんだ。スキヌマ定矩なしで型安党が手に入るから、Next.jsなどTypeScript統䞀環境では非垞に匷力だよ。REST・GraphQL・tRPC、それぞれの匷みを理解しお䜿い分けるのが珟代のAPI蚭蚈の基本だね。