GraphQLのAPIをNode.jsで開発する時に、スキーマ駆動開発をやってみたものの、途中でしんどくなってやめて最終的にはGraphQL Nexusに乗り換えた。
スキーマ駆動開発とは
ここでいうGraphQLのスキーマ駆動開発というのは大まかに言うと、次のようなワークフローを指す。
- GraphQLのスキーマを記述する
- GraphQLスキーマを元に、サーバ側の実装とクライアント側を実装する
実際に自分がGraphQLのAPIをNode.js+TypeScript+Apollo Serverで構築したときには、GraphQLのAPIを追加する際の具体的なワークフローとしては次のようになった。
- GraphQLのスキーマを記述する
- graphql-code-generatorを使ってスキーマからリゾルバのTypeScript型定義を自動生成する
- リゾルバの型定義にしたがって、サーバ側のAPIの実装を変更する
- クライアント側を修正する
やめた理由
このワークフローでしばらく開発を続けてみて、だんだんAPIの規模が大きくなっていくにつれてうまくいかなくなってきた。
- 手書きでGraphQLのスキーマを記述するのが大変
- ワークフローそのものが実は煩雑
GraphQLスキーマはどうやら手書きで書くものではないみたいだ。APIの規模が小さければ手書きするのはまあ悪くないんだけど、規模が大きくなると手書きするのが苦痛になってくる。
スキーマを修正した後にサーバ側の型定義を生成してリゾルバの実装を修正するというワークフローが実は結構曲者で、オブジェクトはもちろんenum
やinput
タイプなんかもGraphQLスキーマに記述したことをリゾルバ側にも手で書き写すような形になってしまって煩雑だということがわかった。
GraphQL Nexusに切り替え
最終的には、GraphQL NuxusというGraphQLサーバのリゾルバを記述するためのフレームワークに切り替えた。
GraphQL Nexusはスキーマ駆動開発ではなくコードファーストなワークフローをサポートしている。まずサーバサイドのリゾルバを記述するとついでにGraphQLのスキーマや型を生成してくれる。つまり次のようなワークフローになる。
- Nexusを使ってGraphQLのリゾルバを記述する
- Nexusによって自動的にGraphQLのスキーマとリゾルバの型が生成される
- クライアント側を修正する
コードを元にGraphQLスキーマを生成してくれるのでものすごく楽になった。TypeScriptも完全にサポートしているので型安全のままである。
Nexusに切り替える際には、GraphQLのSDLをコードに変換してくれるコンバータが用意されてたので既存のGraphQLスキーマをこれに食わせてコードを生成した。NexusはApollo Serverと組み合わせて使うことができるので切り替えはそんなにめんどくさくなかった。
Nexusのコードファーストなワークフローに切り替えてからやることが非常に単純になり、GraphQL APIを実装するのが快適になった。終わり。