プロジェクト開始から2年も経たないうちに、Spring for GraphQL 1.0がリリースされた。
このプロジェクトでは2つのチームがコラボレーションして、SpringとGraphQL Javaを統合した。
GraphQLは、API用のオープンソースのデータクエリ・操作言語であり、そして、既存のデータに対してクエリを実行するためのランタイムである。Facebookによって開発され、2015年に一般にリリースされた。
GraphQLを使うと、クライアントは必要なデータの構造を定義でき、同じ構造のデータがサーバから返されるため、過度に大量のデータが返されるのを防ぐことができる。
Spring for GraphQLは、Spring Initalizrを使って設定できる。最近リリースされたSpring Boot 2.7に依存関係graphql-spring-boot-starterを追加するだけである。InfoQはSpring Boot 2.7.0に関する詳細なニュース記事を追っていく予定である。
Spring for GraphQLは、クライアント側とサーバ側の両方で、HTTP、WebSocket、RSocketを介したGraphQLリクエストの処理をサポートする。
Spring for GraphQLにより、次の理由でGraphQLプロジェクトの開発が簡素化される。ロケーションを設定でき、そこからスキーマファイルを自動ロードできる。アノテーションベースのプログラミングモデルが提供される。例外を管理するためにDataFetcherExceptionHandlerを登録できる。 GraphQLのメトリックを設定できる。
以下に示す例では、Springによりメソッドがクエリにバインドされ、RuntimeWiring.Builderクラスを使って、上記のハンドラーメソッドが「hello」という名前のクエリ向けのDataFetcherとして登録される。
@Controller
public class GreetingController {
@QueryMapping
public String hello() {
return "Hello, world!";
}
}
以下に示す例のように、@SchemaMapping(typeName="Book", field="author")を使うだけで、親のタイプ名とフィールド名を指定することもできる。
@Controller
public class BookController {
@SchemaMapping(typeName="Book", field="author")
public Author getAuthor(Book book) {
// ...
}
}
バッチロードは、DataLoaderを使って個々のエンティティインスタンスのロードを先送りすることで提供される。
Spring for GraphQLは、既存のSpringテクノロジーを活用して、GraphQLを通してベースとなるデータソースを公開する。これは、QuerydslリポジトリーとQuery by Exampleリポジトリーの使用をサポートしており、データをDataFetcherにリカバリーできるようになる。
以下に示すコードを使ってDataFetcherを作成することができる。RuntimeWiringConfigurerを使って登録できる。
// For single result queries
DataFetcher<Account> dataFetcher = QuerydslDataFetcher.builder(repository).single();
// For multi-result queries
DataFetcher<Iterable<Account>> dataFetcher = QuerydslDataFetcher.builder(repository).many();
DataFetcherは、GraphQLリクエストパラメーターからQuerydsl述語を構築し、それを使ってデータをフェッチする。
@PreAuthorizeや@SecuredなどのSpring Securityアノテーションを追加すると、きめ細かいセキュリティを適用でき、GraphQL応答の特定箇所のデータを取得するメソッドに対する権限をチェックすることができる。
クライアント側では、InterceptionとSubscriptionのリクエストがサポートされている。現在、WebSocketトランスポートのみがGraphQLストリームをサポートしている。
Spring for GraphQLはまだ初期段階にあり、新機能とバグ修正によって進化する可能性が高い。過去3年間にNetflixで開発された人気のあるDGSフレームワークに代わるものになる可能性がある。