1. 序章

この記事では、 AWSAppSyncとSpring Bootについて説明します。 AWS AppSyncは、リアルタイムのデータ同期とオフラインプログラミング機能を備えたフルマネージドのエンタープライズレベルのGraphQLサービスです

2. AWSAppSyncをセットアップする

まず、アクティブなAWSアカウントが必要です。 それが処理されたら、AWSコンソールからAppSyncを検索できます。 次に、AppSync入門リンクをクリックします。

2.1. AppSyncAPIを作成する

クイックスタート手順に従ってAPIを作成し、 EventAppサンプルプロジェクトを使用します。 次に、 Start をクリックして、アプリに名前を付けて作成します。

これにより、AppSyncアプリコンソールが表示されます。 それでは、GraphQLモデルを見てみましょう。

2.2. GraphQLイベントモデル

GraphQLはスキーマを使用して、クライアントが利用できるデータとGraphQLサーバーとの対話方法を定義します。 スキーマには、クエリ、ミューテーション、および宣言されたさまざまなタイプが含まれています。

簡単にするために、デフォルトのAWSAppSyncGraphQLスキーマの一部であるイベントモデルを見てみましょう。

type Event {
  id: ID!
  name: String
  where: String
  when: String
  description: String
  # Paginate through all comments belonging to an individual post.
  comments(limit: Int, nextToken: String): CommentConnection
}

イベントは、いくつかのStringフィールドとCommentConnectionタイプを持つ宣言されたタイプです。 IDフィールドの感嘆符に注意してください。 これは、必須/非nullフィールドであることを意味します。

これは、スキーマの基本を理解するのに十分なはずです。 ただし、詳細については、GraphQLサイトにアクセスしてください。

3. スプリングブーツ

AWS側ですべてをセットアップしたので、Spring Bootクライアントアプリケーションを見てみましょう。

3.1. Mavenの依存関係

APIにアクセスするには、Spring BootスターターWebFluxライブラリを使用して WebClientにアクセスします。これは、RestTemplateの新しい代替手段であるSpringです。

    <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-webflux</artifactId> 
    </dependency>

詳細については、 WebClientに関するの記事をご覧ください。

3.2. GraphQLクライアント

APIにリクエストを送信するには、まず WebClientビルダーを使用してRequestBodySpecを作成し、 AWS AppSyncAPIURLとAPIキーを提供します。

WebClient.RequestBodySpec requestBodySpec = WebClient
    .builder()
    .baseUrl(apiUrl)
    .defaultHeader("x-api-key", apiKey)
    .build()
    .method(HttpMethod.POST)
    .uri("/graphql");

APIキーヘッダーx-api-keyを忘れないでください。 APIキーは、AppSyncアプリに対して認証されます。

4. GraphQLタイプの操作

4.1. クエリ

クエリを設定するには、メッセージ本文のquery要素にクエリを追加する必要があります。

Map<String, Object> requestBody = new HashMap<>();
requestBody.put("query", "query ListEvents {" 
  + " listEvents {"
  + "   items {"
  + "     id"
  + "     name"
  + "     where"
  + "     when"
  + "     description"
  + "   }"
  + " }"
  + "}");

requestBodyを使用して、 WebClient を呼び出して、応答本文を取得します。

WebClient.ResponseSpec response = requestBodySpec
    .body(BodyInserters.fromValue(requestBody))
    .accept(MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML)
    .acceptCharset(StandardCharsets.UTF_8)
    .retrieve();

最後に、本体をStringとして取得できます。

String bodyString = response.bodyToMono(String.class).block();
assertNotNull(bodyString);
assertTrue(bodyString.contains("My First Event"));

4.2. 突然変異

GraphQLを使用すると、ミューテーションを使用してデータを更新および削除できます。 変更は、必要に応じてサーバー側のデータを変更し、クエリと同様の構文に従います。

addミューテーションクエリを使用して新しいイベントを追加しましょう。

String queryString = "mutation add {"
  + "    createEvent("
  + "        name:\"My added GraphQL event\""
  + "        where:\"Day 2\""
  + "        when:\"Saturday night\""
  + "        description:\"Studying GraphQL\""
  + "    ){"
  + "        id"
  + "        name"
  + "        description"
  + "    }"
  + "}";
 
requestBody.put("query", queryString);

AppSyncおよび一般的なGraphQLの最大の利点の1つは、1つのエンドポイントURLがスキーマ全体ですべてのCRUD機能を提供することです。

同じWebClientを再利用して、データを追加、更新、および削除できます。  クエリまたはミューテーションのコールバックに基づいて、新しい応答を取得するだけです。

assertNotNull(bodyString);
assertTrue(bodyString.contains("My added GraphQL event"));
assertFalse(bodyString.contains("where"));

5. 結論

この記事では、AWS AppSyncを使用してGraphQLアプリをセットアップし、SpringBootクライアントを使用してそれにアクセスする方法について説明しました。

AppSyncは、単一のエンドポイントを介して強力なGraphQLAPIを開発者に提供します。 詳細については、 GraphQLSpringBootサーバーの作成に関するチュートリアルをご覧ください。

そして、いつものように、コードはGitHub利用できます。