コードとしてスキーマを記述し、DB設計も自動化
土田氏は以上3点の問題を解決する方法を探し、米Meta Platforms(Facebook)が開発したオープンソース・ソフトウェア「ent」を見つけ出した。entでは、API定義(スキーマ)をOpenAPIファイルではなく、Go言語のソースコードの形で記述する(Schema As Code)。YAMLやJSONに比べれば、開発者にとって読みやすい形式で記述できるわけだ。entにはさらにスキーマ・ファイルからデータベースのテーブルなどを自動的に作成する機能も持つ。データベースのテーブルを作成することなく、APIの設計に取りかかることができるのだ。
そしてentは各種自動生成機能も充実している。まず、Go言語で記述したスキーマ・ファイルから、OpenAPI形式のファイルを生成できる。OpenAPI向けのツールを使いたいときに役立つ機能だ。そして、Go言語に限った話になってしまうが、スキーマからクライアントがデータベースにアクセスする際に使用するORマッパーも生成する。
この結果、entを使用すると定義(スキーマ)と実装のずれが一切無い状態で開発を進めることができる。土田氏は「とにかくスキーマが最優先という形で開発を進めることができる」とメリットを強調する。
entを使用する場合、まずサーバー側の開発者がGo言語でスキーマを記述し、クライアント側など開発チーム全員にファイルをレビューしてもらい、合意が取れたらデータベース・テーブルを自動的に作成するという流れになる。データベースに変更があれば、それも反映させてくれる。さらに、OpenAPIファイルや、ORマッパー、CRUDコードも自動的に生成するので、スキーマで定義した内容と実装がずれるという事態が発生しにくい。
実際に開発でentを使用してきている土田氏は、使ってみて感じたメリットとして、手作業が減るので工数を大幅に削減できるという点を真っ先に挙げた。さらに、スキーマをコードで記述するため、読みやすくレビューもやりやすいともいう。そして、公式ドキュメントが分かりやすいという利点も挙げた。
一方で気になる点も挙げた。まず、開発の途中から導入するのは難しそうだということ。すでにデータベースの設計ができていて、稼働しているような場合は、データベースのテーブル設計からGo言語のスキーマに変換する作業が発生するからだ。
続いて、多機能なツールであり、あまりに頼りすぎると簡単にロックインしてしまいそうだという点を挙げた。土田氏は「ここで紹介したentの機能はごく一部。紹介できていない機能がたくさんある」と言い、entを導入するならentに依存しすぎることなく、部分的に採用するのが良いかもしれないと導入を考える開発者にアドバイスを送った。さらに、ORマッパーの自動生成機能について「Go言語のコードだけでなく、他の言語のコードも生成できるようになると良い」とした。
さらに土田氏は、「entの対抗馬となりそう」だというソフトウェア「Prisma」を紹介した。Prismaでは、「schema.prisma」という名称のファイルに独自フォーマットでスキーマを記述する形を採る。スキーマからのデータベース・テーブルの自動作成や、ORマッパー生成といった機能も持っている。ただし、ORマッパーはJavaScript/TypeScriptのコードで出力する。OpenAPIファイルを出力する機能はないが、その点については「schema.prismaファイル一つですべてを済ませてしまおうという思想があるからではないか」と土田氏は推測している。
土田氏はentやPrismaといったツールについて「この種のツールはまだ成長段階にあり、この先どうなるかは分からない。ロックインしないように上手く活用して開発を進められれば良いのでは」と語り、講演を締めくくった。