UGA Boxxx

つぶやきの延長のつもりで、知ったこと思ったこと書いてます

【Spring Boot】Spring Boot でGraphQL Apolloクライアントを使う

Spring Boot でGraphQLで構築された外部のAPIを利用するため、GraphQLクライアントを用意する

GraphQLクライアントには Apollo や Relay が思いつくが、RelayはどちらかというとReact特化でApolloのようにさまざまな言語で使えるようになっていないとのこと

参考記事
最高のGraphQLクライアントを求めて Apollo vs Relay - nakamoriのblog

そのため Apollo でGraphQLクライアントをセットアップすることにした

セットアップ

Spring Boot のバージョンは 2.5.12(理由があって上げられない)、Apollo クライアントは v2系を使う(理由は別記事に書く)

以下の公式ドキュメントと
4. Execute your first query - Apollo GraphQL Docs

以下の記事が大変参考になったのでこれらを見ながら進める
Java × Spring Boot × Apollo で GraphQL クライアントを実装する #Java - Qiita

pom.xml に記載

まず、pom.xml に必要とするライブラリ記載する

この時、同期通信を簡単に書くために RxJava で書けるライブラリも記載する

    <dependency>
      <groupId>com.apollographql.apollo</groupId>
      <artifactId>apollo-runtime</artifactId>
      <version>2.5.14</version>
    </dependency>

    <dependency>
      <groupId>com.apollographql.apollo</groupId>
      <artifactId>apollo-rx3-support</artifactId>
      <version>2.5.14</version>
    </dependency>

また、Apollo による Query モデルクラスの自動生成を行うため、以下のプラグインも記載する

GitHub - aoudiamoncef/apollo-client-maven-plugin at support/apollo-2

<plugins>
    <plugin>
        <groupId>com.github.aoudiamoncef</groupId>
        <artifactId>apollo-client-maven-plugin</artifactId>
        <version>4.0.6</version>
        <executions>
            <execution>
                <goals>
                    <goal>generate</goal>
                </goals>
                <configuration>
                    <services>
                        <example-api>
                            <compilationUnit>
                                <name>example</name>
                                <compilerParams>
                                    <rootPackageName>com.example.graphql.client</rootPackageName>
                                </compilerParams>
                            </compilationUnit>
                        </example-api>
                    </services>
                </configuration>
            </execution>
        </executions>
    </plugin>
</plugins>

Query モデルクラスの自動生成

先ほど入れたpluginのintrospectionの箇所に、利用する外部APIの情報や出力先を記載する

mvn コマンドで generate-sourcesを実行すると、src/main/graphql/exampleに schema.json が生成されている

さらに、その同フォルダに GraphQLクエリファイルを置き、再度プラグインを実行すると target 配下に Query モデルクラスが自動生成されているので、このフォルダにクラスパスを通しておく

クライアントインスタンスの生成

以下のようにApolloクライアントのインスタンスを生成する

final ApolloClient apolloClient = ApolloClient.builder()
        .serverUrl("http://localhost:5000/graphql/endpoint")
        .build();

このクライアントと先ほど生成したクエリを使って実行する

        MyQuery query = MyQuery.builder().build();

         ApolloQueryCall<Data> apolloQueryCall = apolloClient.query(query);

        return Rx3Apollo.from(apolloQueryCall)
                .map(Response::getData)
                .map(MyQuery.Data::getOffers)
                .blockingFirst();

これで一旦、単純なセットアップは完了した

リクエスト時にヘッダーにAuth情報を含めたい場合はどうするかなど、詰まったところは別記事にする

ApolloクライアントをつかないGraphQLクライアントのセットアップ

試していないが spring-boot-starter-graphqlでGraphQLクライアントをセットアップすることも可能みたい

www.danvega.dev

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

簡単に始められそうだが、スキーマ情報はない中でクエリを書くみたいで後々苦労しそう?