1. 概要

クライアント/サーバー通信に関する過去数年間の最も重要なパラダイムの変更の1つは、オープンソースのクエリ言語である GraphQL と、APIを操作するためのランタイムです。 これを使用して、必要な正確なデータをリクエストできるため、必要なリクエストの数を制限できます。

Netflixは、ドメイングラフサービスフレームワーク(DGS)サーバーフレームワークを作成して、作業をさらに簡単にしました。 このクイックチュートリアルでは、DGSフレームワークの主な機能について説明します。 このフレームワークをアプリに追加する方法と、その基本的なアノテーションがどのように機能するかを確認します。 GraphQL自体の詳細については、IntroductiontoGraphQLの記事をご覧ください。

2. ドメイングラフサービスフレームワーク

Netflix DGS (ドメイングラフサービス)は、Kotlinで記述され、SpringBootに基づくGraphQLサーバーフレームワークです。 Springフレームワークを除いて、外部の依存関係を最小限に抑えるように設計されています。

Netflix DGSフレームワークは、SpringBoot上に構築された注釈ベースのGraphQLJavaライブラリを使用します。注釈ベースのプログラミングモデルに加えて、いくつかの便利な機能を提供します。 GraphQLスキーマからソースコードを生成できます。いくつかの重要な機能をまとめましょう

  • アノテーションベースのSpringBootプログラミングモデル
  • 単体テストとしてクエリテストを作成するためのテストフレームワーク
  • スキーマから型を作成するためのGradle/Mavenコード生成プラグイン
  • GraphQLフェデレーションとの簡単な統合
  • SpringSecurityとの統合
  • GraphQLサブスクリプション(WebSocketおよびSSE)
  • ファイルのアップロード
  • エラー処理
  • 多くの拡張ポイント

3. 構成

まず、DGSフレームワークはSpring Bootに基づいているため、Spring Bootアプリを作成しましょう。 次に、DGS依存関係をプロジェクトに追加しましょう。

<dependency>
    <groupId>com.netflix.graphql.dgs</groupId>
    <artifactId>graphql-dgs-spring-boot-starter</artifactId>
    <version>4.9.16</version>
</dependency>

4. スキーマ

4.1. 開発アプローチ

DGSフレームワークは、スキーマファーストとコードファーストの両方の開発アプローチをサポートします。ただし、主にデータモデルの変更に対応しやすいため、推奨されるアプローチはスキーマファーストです。 Schema-firstは、最初にGraphQLサービスのスキーマを定義し、次にスキーマの定義を照合してコードを実装することを示します。 フレームワークは、デフォルトで src / main / resources /schemaフォルダー内のスキーマファイルを取得します。

4.2. 実装

Schema Definition Language(SDL)を使用して、サンプルアプリケーション用の単純なGraphQLスキーマを作成しましょう。

type Query {
    albums(titleFilter: String): [Album]
}

type Album {
    title: String
    artist: String
    recordNo: Int
}

このスキーマを使用すると、アルバムのリストをクエリしたり、オプションでtitleでフィルタリングしたりできます。

5. 基本的な注釈

スキーマに対応するAlbumクラスの作成から始めましょう。

public class Album {
    private final String title;
    private final String artist;
    private final Integer recordNo;

    public Album(String title, String artist, Integer recordNo) {
        this.title = title;
        this.recordNo = recordNo;
        this.artist = artist;
    }

    // standard getters
}

5.1. データフェッチャー

データフェッチャーは、クエリのデータを返す責任があります。 @ DgsQuery、@ DgsMutation、および@DgsSubscription アノテーションは、クエリ、ミューテーション、およびサブスクリプションタイプでデータフェッチャーを定義するための省略形です。上記のすべてのアノテーションは@と同等です。 DgsDataアノテーション。 Javaメソッドでこれらのアノテーションの1つを使用して、そのメソッドをデータフェッチャーにし、パラメーターを使用して型を定義できます。

5.2. 実装

したがって、DGSデータフェッチャーを定義するには、@DgsComponentクラスにクエリメソッドを作成する必要があります。 この例ではAlbumsのリストをクエリしたいので、@DgsQueryでメソッドをマークしましょう。

private final List<Album> albums = Arrays.asList(
  new Album("Rumours", "Fleetwood Mac", 20),
  new Album("What's Going On", "Marvin Gaye", 10), 
  new Album("Pet Sounds", "The Beach Boys", 12)
  );

@DgsQuery
public List<Album> albums(@InputArgument String titleFilter) {
    if (titleFilter == null) {
        return albums;
    }
    return albums.stream()
      .filter(s -> s.getTitle().contains(titleFilter))
      .collect(Collectors.toList());
}

また、メソッドの引数にアノテーション@InputArgumentを付けました。 このアノテーションは、メソッド引数の名前を使用して、クエリで送信された入力引数の名前と一致させます。

6. Code-Genプラグイン

DGSには、GraphQLスキーマからJavaまたはKotlinコードを生成するためのcode-genプラグインも付属しています。 コード生成は通常、ビルドと統合されています。

DGSコード生成プラグインはGradleとMavenで使用できます。プラグインは、ドメイングラフサービスのGraphQLスキーマファイルに基づいて、プロジェクトのビルドプロセス中にコードを生成します。 プラグインは、タイプ、入力タイプ、列挙型、インターフェースのデータ型、サンプルデータフェッチャー、およびタイプセーフクエリAPIを生成できます。の名前を含むDgsConstantsクラスもあります。タイプとフィールド。

7. テスト

APIをクエリする便利な方法は、 GraphiQLです。GraphiQLは、DGSフレームワークに付属しているクエリエディターです。デフォルトのSpring Bootポートでアプリケーションを起動してみましょう。 URL http:// localhost:8080/graphiqlを確認してください。 次のクエリを試して、結果をテストしてみましょう。

{
    albums{
        title
    }
}

RESTとは異なり、クエリから返されるフィールドを具体的にリストする必要があることに注意してください。 応答を見てみましょう:

{
  "data": {
    "albums": [
      {
        "title": "Rumours"
      },
      {
        "title": "What's Going On"
      },
      {
        "title": "Pet Sounds"
      }
    ]
  }
}

8. 結論

Domain Graph Service Frameworkは、GraphQLを使用する簡単で非常に魅力的な方法です。 上位レベルのビルディングブロックを使用して、クエリの実行などを処理します。 DGSフレームワークは、便利なSpringBootプログラミングモデルでこれらすべてを利用できるようにします。 このフレームワークには、この記事で取り上げるいくつかの便利な機能があります。

アプリでのDGSの構成について説明し、その基本的なアノテーションのいくつかを確認しました。 次に、スキーマからデータを作成してクエリを実行する方法を確認する簡単なアプリケーションを作成しました。 最後に、GraphiQLを使用してAPIをテストしました。 いつものように、例はGitHubにあります。