Schema-Driven Development における OpenAPI と GraphQL の比較
まず Web API の仕様をかっちりさせる。
その仕様により以下を得る
Document 自動生成
モックサーバー (サーバーの具体的な実装なしにクライアントが実装を始められる)
Request/Response Validation (稼働しているサーバ, Request Spec)
API Responseの自動生成 (ActiveModelSerializerにあたる層)
それを達成するには?
以下の2つが有力だと考えている
OpenAPIについて
得たいもの
◎ Document 自動生成
○ モックサーバー
単純にモックサーバー立てるだけならいろいろある
Rails (Rack app) と統合して、実装がないがドキュメントがあるものだけダミーレスポンスを返す、のようなものは今のところなさそう。
△ Request/Response Validation
△ API Responseの自動生成
現状はOSSで存在しないはず。
DeNAの春山さん (@Spring_MT) が自作している。
OSSにしてもらえると良いが、いずれにしても厚いコミュニティでメンテナンスされるわけではない。
その他の観点
○ クライアントからの扱いやすさ
普通に使う分には広く認識されているRESTful APIなので、特に問題なく使える
クライアント向けにDTOクラスを生成する swagger-codegen が存在
OpenAPI 3.0向けには(2018-10-23現在)まだリリースされていない
○ 技術異質性 (Ruby以外でも実装できるか)
(GraphQLと比較して) RESTful API自体は最悪どんな言語でも実装できる。
Ruby以外言語で committee にあたる実装 (Request/Response Validation)がどれくらいあるのか知らない
qsona.icon (sidecar patternでProxyのようにやれば、言語非依存に出来るなと思ったが、そういう実装があるかは不明。また、あったとしてもサービス単体のテストでは使えない)
GraphQLについて
得たいもの
◎ Document 自動生成
Graphiql, その他色々ある
△ モックサーバー
rubyで書くGraphQLTypeは実装に紐付いている
スキーマだけ先に出すことは出来なくはないが、実装が中途半端なコードがデプロイされることになる
(実はそんなに問題ではないかも)
型定義のみを別途書き、rubyはGraphQLTypeを別途書く
◎ Request/Response Validation
graphql-rubyが完全対応
◎ API Responseの自動生成
Typeを書くだけでAPIが定義される。resolverも書ける。
その他の観点
クライアントからの扱いやすさ
必ずクエリを書かなければいけないという点で、RESTful APIからの飛躍はある
? 技術異質性 (Ruby以外でも実装できるか)
ruby以外の言語にもGraphQLの実装があるが、それがどれくらい安定しているかは qsona.icon は存じていない
graphql-rubyはGitHubを始め厚いサポートがある。Node.jsなども問題ない。
graphql-rubyの実装を見る限り、実装はなかなか難しい。強力なコミュニティでメンテナンスすることが必要に見える。
graphql-batchなど周辺のツールも含め。