Introduction to Sangria

はじめに

この記事は、GraphQL Advent Calendar 2017の17日目の記事です。

Sangriaとは

概要

graphql.orgでも紹介されている通り、GraphQLのサーバーサイド実装です。

Sangriaは、幾つかのモジュールによって構成されていますが、おおよそ以下のような分類が可能です。

  • コア
  • JSONパーサー向けのライブラリ
  • Relay用ライブラリ

JSONパーサーに関してなんでこんなにあるんだと他の言語の人は驚くかもしれませんが、 Scalaでは歴史的経緯により様々なJSONパーサーにまつわるライブラリが作られ、そして現在に至っています。

歴史的経緯については、eed3si9n_jaさんのスライドを参考にしてください。

JSONパーサー自体もバックグラウンドで利用する関数型プログラミング向けのライブラリを選択できるようになっているため、バリエーションは様々です。 なので自分たちの好み、チーム事情に応じたライブラリを使うことが多いです。

初め方

2017-12-17時点でのリリースバージョンは、v1.3.3です。

http://sangria-graphql.org/getting-started/

Sangriaを使ってGraphQLを実装する手順は、以下のとおりです。

  • Schemaの定義
  • Schemaのチェック
  • Akka HTTPPlayを使ってGraphQLのエンドポイントを用意すること

Define a GraphQL Schema

Sangriaでは、Schemaの定義にmacroを用います。

とはいっても、ボイラープレートになりがちな箇所をSangriaがサポートするような形なので、そこまで複雑なことをやっているわけではありません。

Schema Execution

Sangriaは、Schemaと、エンドポイントで受け取ったGraphQLのクエリを用いて、 Repository(Schemaにて取得の仕方を記載しておく)から目的に応じてExecutorが処理をします。 その際に、文字列からオブジェクトへ変換するInputUnmarshallerやオブジェクトからJSONへ変換するResultMarshallerを暗黙的に渡して、 必要なオブジェクトをJSONにして返すようにしてくれます。

GraphQLの操作(Query, Mutation, Subscription)に応じて、予めそれぞれSchemaに定義しておきます。

GraphQLのクエリは、QueryParserがASTへ変換します。 ここでは、Scalaのパーサコンビネータではなく、parboiledが使われています。

エンドポイントには、Akka HTTPPlayを用いる方法が紹介されています。

他のフレームワークでも、応用は出来ると思いますので、導入も簡単だと思います。

サンプルについて

sangria-playgroundsangria-relay-playgroundにて公開されています。

どちらもベースとなるフレームワークは、Playが使われています。

ソースコードは、sangria-graphql/sangria-playgroundsangria-graphql/sangria-relay-playgroundで公開されているので、 サクッとローカルでも立ち上げることが可能です。

どちらも、graphiqlが導入されているので、簡単に試すことが出来ます。

触ってみて

サンプルに出てくるProductRepo等のオブジェクトの集まりであるコンテキストをどうやって実装するか、 サーバーサイドが注力すべき場所になるように、Sangriaがある程度お膳立てをしてくれているように感じました。

特にグラフ構造を持つようなコンテキストでは、グラフ構造が得意ではないRDBMSを操作するのは、正直厳しいように思えます。 他の言語のサーバーサイド実装の事情がよく分かっていないので、このような問題をどうやって解決しているのか気になるところではあります。

個人的には、InfinispanApache GeodeApache IgniteHazelcastといった、 In-Memory Data Gridのようなものと組み合わせて、オブジェクトをそのままメモリで扱いながら、CQRS(Command Query Responsibility Segregation)と上手く組み合わせて行くのが現状なのではないかと考えています。

Akkaの文脈であれば、sangria-graphql/sangria-subscriptions-exampleのようにStreamで解決できたり、 オブジェクトの永続化もAkka persistence等のAkkaのエコシステムに乗ることで、解決策も出てくると思います。

もっとSangriaについて知りたい人は、Learnにより詳細に載っていますので、ぜひ参考にしてください。

おわりに

GraphQLのBaasであるGraphcoolが実装をgraphcool/frameworkへ公開したため、 以前は、Scalaの実装となるとSangria一択だったのが、graphcoolがScalaで実装されていることがわかりました。

こちらも、気になるので別の機会に触って試してみたいと思います。