[node.js] GraphQL vs RESTAPI(overfetching/underfetching)


1-1. RESTAPI


リクエストのエンドポイントに応答するときに使用するコマンド.
エンドポイントからデータを取得するために必要な呼び出し関数と言語.
クライアントとサーバの間でデータとWebページ(テンプレート)を送受信するプロセスの核心は、エンドポイントからデータを取得することです.
デル(=client)のリクエストに応じて、サーバは応答し、データとテンプレート(Webページ)に応答します.
サーバまたは管理者の観点から、特定のユーザが書いた投稿や追従者など、同じ原理でユーザの詳細を得ることができると考えられる.
このように、サーバ側から取得したデータまたは複数のテンプレートが、エンドポイント(データ保持ポイント、URI)から要求されて呼び出されて使用されるコマンドをRESTAPIと呼ぶ.

1-2. RESTAPIの問題点



上図に示すように,最終的には特定のユーザの追従者情報を確保すべきであると考えられる.
RESTAPIを使って私たちが望む追従者情報を得るために、
  • は、まず、特定のユーザの完全な情報を有するエンドポイント(RESTAPI①)
  • を要求する.
  • の後、ユーザID(キー)の値(RESTAPI 1で得る)
  • を探し出す.
  • で見つけるIDにより、ユーザ追跡情報を有するエンドポイント(RESTAPI②)
  • を再度要求する.
  • のトラッキング情報を含む端点からトラッキング情報(RESTAPI③)
  • を取得する.
    前述したように、最終的な追跡情報を得るためには、段階的なエンドポイント時点を理解し、各エンドポイントからRESTAPIを呼び出して必要な情報を得る必要がある.
    overfetching
    この場合,ユーザ全体情報やid値など,追従者情報を得るために不要なすべての情報を確保する必要がある.
    1つの情報を取得するために、不要な情報を取得する必要さえあるトラブルを過剰取得と呼ぶのは、RESTAPIの最大の問題の一つです.
    underfetching
    それを異なる観点と見なすこともできる.
    追従者情報を取得するために、RESTAPIで直接情報を取得しようとすると、そのユーザIDを知らずに情報を取得したり、他のエンドポイント追従者情報を取得したりする不確実性がある.
    このように、必要な情報ではなくRESTAPIによって他の情報や欠落した情報を取得する話題を取得不足と呼ぶことも、RESTAPIの問題の一つである.
    バージョン管理とメンテナンスが面倒
    また、RESTAPIを使用する場合は、APIバージョンで管理する必要があります.
    バージョン別にAPIを管理する場合は、バージョンに一致するエンドポイントを個別に作成する必要があります.これにより、バックエンド/フロントエンド間の実際の反復プロトコルが面倒になります.
    これは、RESTAPIを使用する場合、データの整合性とメンテナンスが非常に困難である可能性があることを示しています.

    2-1. GraphQL(Graph-data Query Language)


    GraphQLにはURL概念は存在しません.
    非線形データ構造パターンのようなデータ間には無数の関連が存在する.
    Query Languageにより必要なデータを選択的に取得できるシステム(コマンド).
    GraphQLは、RESTAPIの致命的な欠点を「複数のエンドポイント」「単一のエンドポイント」化し、1回のエンドポイントアクセスで必要なデータを得る.

    GraphQLは、すべてのデータが図のように関連していると考えています.
    必要なデータを取得するには、クライアントまたはサーバ管理者は、ユーザー情報を含む複数のエンドポイントではなく、1つのエンドポイントにのみアクセスします.
    その後、Query Languageにより、ユーザIDと追従者キー値にアクセスし、所望の追従者情報のみをフィルタリングして取得することができる.
    GraphQLはデータ整合性とメンテナンスの面でRESTAPIより優れており、サーバ操作の面で非常に簡潔で容易である.

    2-2. GraphQL Queryの例


    ※一つの端点の特定データを得るために伝達されるQuery
    データベースにユーザのfeed情報(コメント、賛数)と基本情報(クエリ数)を要求するQuery
    query {
      feed {
        comment,
        likeNumbers,
      }
      notifications{
        isRead
      }
    }
    ※Queryを受信してDatabaseでJavascript構文で出力する例
    DB JavaScriptでfeed情報と基本情報を提供する仕組み
    {
      feed : [
        {
          comments : 1,
          likeNumbers : 3
        }
      ]
        
        notifications : [
        	{
        		isRead : 2
        	}
        ]
    }

    3.参考資料とリンク


    Fastキャンパス講座抜粋(GraphQLとRESTAPIの違い)
    https://velog.io/@gyrbs22/node.js-node.js%EB%A5%BC-%ED%86%B5%ED%95%9C-TDD%EA%B8%B0%EB%B0%98-API-%EC%84%9C%EB%B2%84%EA%B0%9C%EB%B0%9C