回答:
短所:
しかし、それらはこれらによって対抗される以上のものです。
graphql-spring-boot-starter
とgraphql-java-tools
、アーティファクトをプルして開始することができます。.graphqlsリソースでスキーマを作成し、Resolverクラスを作成すれば完了です。動作するテスト例を起動して実行するには、約10分かかりました。
私はGraphQLの使用を検討しているすべての人にいくつかの重要な懸念を発見しました。これまでの主なポイントは次のとおりです。
クエリで無期限の深さ:あなたは木を持っていると深さを知らずに枝を返すようにしたい場合はGraphQLは、無期限の深さで照会することはできませんので、あなたには、いくつかのページネーションを行う必要があるでしょう。
特定の応答構造:GraphQLでは、応答はクエリの形状と一致するため、非常に特定の構造で応答する必要がある場合は、変換レイヤーを追加して応答を再形成する必要があります。
ネットワークレベルでのキャッシュ:GraphQLがHTTP(単一のエンドポイントでのPOST)を介して一般的に使用されるため、ネットワークレベルでのキャッシュは困難になります。これを解決する方法は、持続クエリを使用することです。
ファイルアップロードの処理:GraphQL仕様にはファイルアップロードについては何もありません。また、ミューテーションは引数のファイルを受け入れません。これを解決するには、他の種類のAPI(RESTなど)を使用してファイルをアップロードし、アップロードしたファイルのURLをGraphQLミューテーションに渡すか、実行コンテキストにファイルを挿入して、リゾルバー関数内にファイルを配置します。
予測できない実行:GraphQLの性質は、必要なフィールドを組み合わせてクエリを実行できることですが、この柔軟性は無料ではありません。パフォーマンスやN + 1クエリのように、知っておくとよい問題がいくつかあります。
超シンプルAPI:本当にシンプルなAPIを公開するサービスがある場合、GraphQLは複雑さを追加するだけなので、シンプルなREST APIの方が優れている場合があります。
この最大の問題は、graphQLで発生します。つまり、リレーショナルデータベースで使用している場合は、結合です。
いくつかのフィールドを許可または禁止できるという事実は、結合を重要なものにします(単純ではありません)。これは余分なクエリにつながります。
また、graphqlのネストされたクエリは循環クエリにつながり、サーバーをクラッシュさせる可能性があります。特別な注意が必要です。
レート制限通話のは困難だって、今、ユーザーが1回の呼び出しで複数のクエリを発射することができなりました。
ヒント:javascript / nodeの場合、Facebookのデータローダーを使用してクエリの数を減らします
cost
リクエストを解析して割り当てることができます。また、クライアントがIDのみを送信する定義済みクエリを使用している場合も、これは問題になりません。
それは年々改善されており、現在のところ、GraphQL のコミュニティーは成長しており、その結果、以前に他の回答で強調されていた多くの問題に対する解決策が多くあります。しかし、企業がすべてのリソースをGraphQLに投入することを依然として妨げているものを認めるために、いくつかの問題と解決策をリストし、その後に未解決のものをリストしたいと思います。
しかし、不利な点として数えることができるいくつかのケースがあります:
要約すると、GraphQLは特定の目標のためのツールに過ぎず、すべての問題に対する特効薬ではなく、もちろんRESTの代替品ではありません。
単一のエンドポイントを持ち、すべてのデータを公開するのは本当に素晴らしいことです。GraphQLについて考慮すべき点を以下に示します。
また、その実装後に長所を検討する必要があります:
一度実装すると、引数とカスタムの順序を使用して条件を簡単に追加できます
多くのカスタムフィルターを使用し、作成する必要があるすべてのアクションを削除します。例として、ユーザーがID、名前などを引数として持ち、フィルタリングを実行できます。さらに、フィルターはユーザーのグループにも適用できます。
現時点では、graphqlはバックエンドアーキテクチャの一部である必要があると思います。ファイルのアップロードでは、まだ通常のAPIを使用しています