graphql-javaを理解したい

# この記事の目的
javaでGraphQLを扱えるGraphql-javaについて、いちいちjavadocを日本語に翻訳するのが面倒だった。
クラス間の関係や役割もよく分からなかったので、使ったクラスの役割を一覧できるようにした。

## .graphqlsファイルを元にJavaがスキーマ定義を使える状態にする

### SchemaParser
> This can take a graphql schema definition and parse it into a TypeDefinitionRegistry of definitions ready to be placed into SchemaGenerator say
> これにより、graphqlスキーマ定義を取得し、SchemaGeneratorに配置する準備ができている定義のTypeDefinitionRegistryに解析できます。

.graphqlsファイル(型定義ファイル)を文字列として読み込んだものを.parser()に突っ込むことでTypeDefinitionRegistryを返すことができるクラス。

### [TypeDefinitionRegistry](https://www.javadoc.io/doc/com.graphql-java/graphql-java/2019-07-22T04-17-57-f8658f2/graphql/schema/idl/TypeDefinitionRegistry.html)
> A TypeDefinitionRegistry contains the set of type definitions that come from compiling a graphql schema definition file via SchemaParser.parse(String)
> TypeDefinitionRegistryには、SchemaParser.parse（String）を介してgraphqlスキーマ定義ファイルをコンパイルすることで得られる型定義のセットが含まれています。

.graphqlsファイルをJavaが解釈できる型に変換したものの最終形態。
パースした.graphqlsファイルを.merge()に突っ込むことで定義を追加することができる。
.graphqlsファイルを分割して管理しやすくしようとしたとき、このメソッドを使うことで最終的に一つの型定義オブジェクトが出来上がる。

## ランタイムワイヤリングを生成する

### [RuntimeWiring](https://www.javadoc.io/doc/com.graphql-java/graphql-java/2019-07-13T23-07-14-8c71e18/graphql/schema/idl/RuntimeWiring.html)
> A runtime wiring is a specification of data fetchers, type resolvers and custom scalars that are needed to wire together a functional GraphQLSchema
> ランタイムワイヤリングは、機能的なGraphQLSchemaをワイヤリングするために必要なデータフェッチャー、タイプリゾルバー、およびカスタムスカラーの仕様です。

wiringは配線の意。.graphqlsファイルに指定したクエリとリゾルバー(データフェッチャー)を対応づけることができる。関連づけたものをランタイムワイヤリングと呼ぶ。
また、スカラーを追加することもできるので基本5種のスカラー型以外も使うことができる。
TypeRuntimeWiring(クエリとリゾルバー(データフェッチャー)を対応付けたもの)とスカラーををセットしたら.build();することで、ランタイムワイヤリングが完成する。

### [TypeRuntimeWiring](https://www.javadoc.io/doc/com.graphql-java/graphql-java/12.0/graphql/schema/idl/TypeRuntimeWiring.html)
> A type runtime wiring is a specification of the data fetchers and possible type resolver for a given type name. This is used by RuntimeWiring to wire together a functional GraphQLSchema
> タイプランタイムワイヤリングは、特定のタイプ名のデータフェッチャーと可能なタイプリゾルバーの仕様です。 これは、RuntimeWiringが機能的なGraphQLSchemaを相互に接続するために使用されます

RuntimeWiringのうち、クエリとリゾルバー(データフェッチャー)を対応づけることができる。
RuntimeWiring.newTypeWiring(タイプ名); のタイプ名にQuery, Mutation, Subscriptionを指定する。
クエリ : .graphqlsファイルに指定したスキーマのうち、Query, Mutation, Subscriptionに指定した文字列を指定。
リゾルバー : DataFetcherを実装したクラス。

### [DataFetcher](https://www.graphql-java.com/documentation/v11/data-fetching/)
公式ドキュメントに実装方法が書いてある。

### [SchemaGenerator](https://www.javadoc.io/doc/com.graphql-java/graphql-java/12.0/graphql/schema/idl/SchemaGenerator.html)
> This can generate a working runtime schema from a type registry and runtime wiring
> これにより、タイプレジストリとランタイムワイヤリングから動作するランタイムスキーマを生成できます

.makeExecutableSchema(.graphqlsから読み込んだスキーマ定義, ランタイムワイヤリング)を実行することでGraphQLSchemaを生成する。

### [GraphQLSchema](https://www.javadoc.io/doc/com.graphql-java/graphql-java/2.4.0/graphql/schema/GraphQLSchema.html)
> The schema represents the combined type system of the graphql engine. This is how the engine knows what graphql queries represent what data.
> スキーマは、graphqlエンジンの結合型システムを表します。 これは、エンジンがどのgraphqlクエリがどのデータを表すかを知る方法です。

知る限りはGraphQLオブジェクトを作るための通過点。

### [GraphQL](https://www.javadoc.io/doc/com.graphql-java/graphql-java/12.0/graphql/GraphQL.html)
> This class is where all graphql-java query execution begins. It combines the objects that are needed to make a successful graphql query, with the most important being the schema and the execution strategy Building this object is very cheap and can be done on each execution if necessary. Building the schema is often not as cheap, especially if its parsed from graphql IDL schema format via SchemaParser. The data for a query is returned via ExecutionResult.getData() and any errors encountered as placed in ExecutionResult.getErrors().
> このクラスは、すべてのgraphql-javaクエリの実行が開始される場所です。 これは、graphqlクエリを成功させるために必要なオブジェクトを組み合わせたもので、最も重要なのはスキーマと実行戦略です。このオブジェクトの構築は非常に安価であり、必要に応じて実行ごとに実行できます。 スキーマの構築は、特にSchemaParserを介してgraphql IDLスキーマ形式から解析される場合は、それほど安価ではないことがよくあります。 クエリのデータは、ExecutionResult.getData()を介して返され、発生したエラーは、ExecutionResult.getErrors()に配置されます。

今まで列挙したすべてのクラスはこのオブジェクトを作るための経過点だった。
このオブジェクトが持つ.execute()にExecutionInputオブジェクトを渡すとクエリが実行されて結果が返ってくる。

### [ExecutionInput](https://www.javadoc.io/doc/com.graphql-java/graphql-java/2018-06-04T06-18-26-/graphql/ExecutionInput.html)
> This represents the series of values that can be input on a graphql query execution
> これは、graphqlクエリの実行で入力できる一連の値を表します。

実行するGraphQLクエリを組み立てるオブジェクト。
query, operationName, variables, contextなどをセットできるが、それぞれの意味がなんなのかjavadocからは分からない。
一通りセットして.build();したら完成する。