はじめに
2021/12/29 - 2022/01/03 の間に GraphQL
を勉強するための題材として Spring for GraphQL
を使ってみた感想です。
GraphQL
の記憶はまったくなかったので、仕様を調べるところからはじめました。
GraphQL の仕様理解
- 参照(Query)と書込(Mutation)で大別される
- レスポンスで必要とするフィールドを指定する
- 呼び出し方次第で、余計なフィールドを取得しないことを可能とする
- 1回のリクエストで複数リソースを参照/書込可能
- 画面を描画する際にRestAPIだと複数回リクエストしていた箇所をGraphQLでは1回ですませられそう
Spring for GraphQL
-
src/main/resources/graphql
ディレクトリ配下のGraphQL定義ファイル.graphqls
を参照する -
application.yml
のspring.graphql
プロパティを参照する-
spring.graphql.graphiql.enabled=true
にするとデバッグツールが利用できる
-
- 以下のアノテーションの付与先がGraphQL定義ファイルと対応する
org.springframework.graphql.data.method.annotation.Argument
org.springframework.graphql.data.method.annotation.MutationMapping
org.springframework.graphql.data.method.annotation.QueryMapping
org.springframework.graphql.data.method.annotation.SchemaMapping
- Gradleで、
com.netflix.dgs.codegen
プラグインを利用するとGraphQL定義ファイルからリソースを自動生成する
RestAPIからGraphQLにリメイクしてみた
種別 | Url | 説明 |
---|---|---|
リメイク元 | https://github.com/mabubu0203/catcafe | OpenAPI Specificationからインターフェース、モデルを自動生成している |
リメイク先 | https://github.com/mabubu0203/catcafe-graph-ql | GraphQL定義からリソース?モデル?を自動生成している |
リメイク元紹介
SpringWebFlux
と SpringR2DBC
を利用している。
OpenAPI Generator
を使って OpenAPI Specification
から Controller
を自動生成している。
Redoc
から OpenAPI Specification
をAPI仕様書として利用できている。
リメイクしての利点
リメイク元の参照系APIは、
- 一覧取得は必要な要素だけ返却する
- 詳細取得は全ての要素を返却する
のように使い分けていた。
これを一覧取得に統合して、呼び出し元でフィールドの制限をかける運用にできそうだなと感じた。
物足りないと感じた箇所
ページング
ページングについてはGraphQL側で明確な仕様は存在しない。
推奨の仕様が存在し、ライブラリにも存在している。
だが、 SpringR2DBC
とは相性がよくなさそうだと感じた。
なので、ページングについては実装していない。
※ com.netflix.dgs.codegen
プラグインでは自動生成の対象になっている
API仕様書について
SpectaQL でGraphQL定義からドキュメントを生成できる。
所感
- 文字数とかGraphQL定義ファイルで定義できないの?
-
com.netflix.dgs.codegen
プラグインからコード自動生成できてよかった- BeanValidationつかえるみたいだけど、GraphQLの仕様にlength長チェックなどはなさそう
-
- ApplicationLayerでしか差分でなさそう。すごい。
-
SpringWebFlux
に対応しててよかった -
レスポンスで必要とするフィールドを指定する
は欲しい機能だった。すごい。
おまけ
2022/01/03 から 2022/06/05 までに追加開発して、スライドにまとめました。