TypeScript Compiler APIを利用したデータベースドキュメントの自動生成

notion image
 
💡
この記事は、「NEWT Product Advent Calendar 2024」Day14 および「TypeScript Advent Calendar 2024」Day19の記事となります。
 
こんにちは!「NEWT Product Advent Calendar 2024」14日目は、令和トラベル Backendエンジニアのnocciが、Frontendエンジニア Fukudaからバトンをもらい、TypeScript Compiler APIを利用したデータベースドキュメントの自動生成について紹介します。ぜひ最後までご覧ください!
 

はじめに

こんにちは!バックエンドエンジニアの中野です。
突然ですが皆さん、データベースのドキュメントはどのように運用されてますか?
 
ドキュメントの管理はどの会社でも課題になることがあるかと思います。令和トラベルも例外ではなく、ドキュメントの運用方法で課題がありました。今回は、そんな私たちの抱えていた課題を解決したTypeScript Compiler APIを利用したデータベースドキュメントの自動生成について紹介したいと思います!

データベースドキュメントが必要な背景

令和トラベルでは、データベースの活用が社内の様々な部門に広がっています。
notion image
例えば、マーケティングチームを例にすると、分析メンバーが予約状況を可視化するダッシュボードをRedashで作成するといったことがあります。
もしデータベースドキュメントがない場合、その分析メンバーたちはテーブル名やカラムの情報のみから自分の集計したい目的に応じてクエリを書かないといけないことになります。
テーブル名やカラム名のみでデータベースを理解することはエンジニア以外だけでなく、中途入社でジョインするエンジニアにとってもかなり辛い作業になってしまいます。
 
このようなことからエンジニア以外のメンバーでもデータベースを理解できるようにするために、テーブル定義やテーブル間の関係を理解できる環境が必要とされていました。
 

従来の取り組みと課題

この課題に対して私たちはSchemaSpyを導入し、データベースのエンティティ関係図を含むHTMLドキュメントを生成して公開していました。
テーブルのメタデータを使用した場合、コメントを追加する際に対象オブジェクトに対してメタデータロックがかかるため、データベースの外で管理するようにしました。SchemaSpyの導入により、エンジニア以外のメンバーはデータベースの構造を視覚的に理解できるようになり、必要な情報へのアクセスが容易になりました。
 
しかし、この解決策は新たな課題を生み出すことになります。エンジニア以外のメンバーがデータベースの中身を理解しやすくなった一方、エンジニアはSchemaSpyへのドキュメント反映作業が負担となっていたのです。
従来のドキュメント反映方法は以下のプロセスで行なっていました。
 
notion image
 
  • 説明を記載したマークダウンファイルを作成
  • SchemaSpyのメタ情報の形式に則したXMLファイルに変換する
 
この反映方法でも十分自動化されていて便利だったのですが、課題が1点ありました。それはソースコードとテーブル定義ドキュメントが別ファイルとして管理されている点です。
このように別ファイルとして書かれていることで、ドキュメントの作成を忘れ、反映が漏れてしまうケースが発生していました。
 
notion image
 
上記の課題を解決するために私は、以下2点のゴールを設定しました。
💡
  • コメントとソースファイルを一箇所にまとめる
  • エンジニアにコメントを追加することのメリットを作る
 
コメントとソースファイルを1つのファイルにすることで、コメントを書きやすくし、エンジニアの負荷を減らせます。さらに、エンジニアがコメントを書くことで開発しやすい環境を作ることができるなら、エンジニアがコメントを積極的に書くようになると考えました。
 

JSDocとTypeScript Compiler APIの活用

私は上記の目的を達成するために、JSDocとTypeScript Compiler APIを用いたドキュメント自動生成の仕組みを導入しました。
今まではマークダウンでドキュメントを別ファイルで管理していましたが、ソースファイルにJSDocでコメントを記載する方針に変更しました。
notion image
JSDocは、JavaScriptのソースコードに注釈を追加するために使われるマークアップ言語です。JSDocを使用することで、ソースファイルとドキュメントを1箇所にまとめました。
また、JSDocで記載することで、エディター上でそのコメントをホバー形式で表示可能となり、開発中に簡単にコメントを確認できるようになることで、エンジニアにとってもコメントを書くことの直接的なメリットが生まれました。
 
このJSDocで目的を達成できるのですが、SchemaSpyでコメントを確認できるようになるためには、これらJSDocのコメントをSchemaSpyへ反映させなくてはなりません。
そこで私は、TypeScript Compiler APIを使ってソースファイルからJSDocを抽出し、XMLファイルを作成することにしました。TypeScript Compiler APIはTypeScriptのコードをプログラムで解析・操作できるようにするためのAPIです。ソースコードを変換したASTを元に解析処理が可能です。
TypeScript Compiler APIを使用することで、ソースファイルを解析してJSDocを抽出することが容易に実装可能でした。また、JSDocだけでなく@Entityなどの情報もAPIを通して取得できるのでソースファイルの特定も容易にできました。
 

実装のプロセス

実装は以下2つのフェーズに分けました。
  • 既存のマークダウンファイルからJSDocコメントへの移行
  • JSDocからSchemaSpyにおけるメタデータの形式に則したXMLファイルを作成
これによって既存のマークダウンファイルをJSDocに移行し、そのJSDocからSchemaSpyへ反映する方針への完全移行を進めました。

第1フェーズ 既存のマークダウンファイルからJSDocコメントへの移行

notion image
 
第1フェーズでは、既存のマークダウンファイルからJSDocコメントへの移行を行いました。まず、マークダウンファイルを検出してパースし、テーブルとカラムの定義を抽出します。次に、これらの情報をJSDocコメントに変換し、TypeScript Compiler APIを使用してソースファイルに適用しました。
 
上記コードはTypeScriptのソースファイルにJSDocを適用するコードの一部です。このコードではプロパティについているデコレータを取得し、そのデコレータ名にColumnが含まれているか確認することで、@PrimaryColumn@Columnのついているプロパティの上部にマークダウンから作成したJSDocを挿入しています。
このようにTypeScript Compiler APIを使用することでソースファイルのデコレータを位置を特定する様なコードは簡単に書けました。
 
ただこのコードだと対応できないパターンもありました。例えば@Entityの上に別の デコレータがついているパターンです。
上記のようなイレギュラーケースも対応することもできましたが、マークダウンからの移行が済めば使うことのない実装だったという点と、10コメントと失敗しているパターンが少なかった点から手動で修正しました。
このようなことから、解析観点でもコードの書き方が揃っているという点は大事だと改めて学ぶことができました。
 

第2フェーズ JSDocからSchemaSpyにおけるメタデータの形式に則したXMLファイルを作成

notion image
 
第2フェーズでは、JSDocからSchemaSpyのXMLファイルを生成する処理を実装しました。まずは、ソースファイルを読み込み ts.createSourceFile でASTの構造に変換します。これによってコードの構造を階層的に扱うことが可能になります。
そのASTを走査する形でソースファイルを解析してJSDocを抽出していきます。
 
@Entityがついているクラスを特定するコードは以下のように書きました。TypeScript Compiler APIを利用するだけで簡単に デコレータがあるかを取得することが可能です。
JSDocを取得するコードも以下のようにシンプルに実装できます。(実装段階では気づかなかったのですが、 ts.isJSDocを用いればもっとシンプルに書けそうです。)
 
上記の要素を組み合わせてソースファイルのJSDocを抽出し、SchemaSpyのメタデータ形式に則したXMLファイルへの変換を実装しました。
 

導入の成果と今後の展望

あたらしい仕組みの導入により、全64ファイルに及ぶテーブル定義を全てJSDocのコメントに変換し、そのJSDocを用いてSchemaSpyにコメントを反映できるようになりました。これによって、エンジニアはホバー機能で詳細を確認できるようになり、ソースコードとコメントが一箇所で管理できるようになりました。
しかし、いくつかの課題も残されています。現在、マークダウンのコメント定義にないテーブルやカラムについては、JSDocもSchemaSpyのコメントも反映できていない状態です。 この課題に対応するため、GitHub ActionsでPR時にソースファイルのJSDoc記載をチェックする機能の導入や、モジュールごとのコメント記載率の可視化などをしていきたいと思っています。
 

まとめ

今回の取り組みを通じて、TypeScript Compiler APIを使用することで、tsファイルの解析処理が容易に実現できることが分かりました。
この経験を活かし、今後はライブラリの変更やアップデートで多くのファイルの表記を変更する場合など、より広範な用途への応用を検討していきたいと考えています! JSDocの記載率100%を目指し、より良いドキュメント管理の実現に向けて取り組みを続けていきます。

「NEWT Tech Talk」のお知らせ

令和トラベルでは、技術的な知識や知見・成果を共有するLT会を毎月実施しています。発表テーマや令和トラベルに興味をお持ちいただいた方は、誰でも気軽に参加いただけます。

2025年1月のテーマは、 ” プロダクトマネジメント ”

新年第1弾のNEWT Tech Talkは、「NEWT(ニュート)」のプロダクト開発を牽引するPM 藤沼・Backendエンジニア兼PM 木村の2名が、”カスタマーファーストを実現するプロダクトマネジメントの舞台裏” と題して、LT形式で発表を行います。

令和トラベルでは一緒に働く仲間を募集しています

この記事を読んで会社やプロダクトについて興味をお持ちいただけましたら、ご連絡お待ちしています!フランクに話だけでも聞きたいという方は、カジュアル面談も実施できますので、お気軽にお声がけください。

今年最後の特大セールも開催中!

NEWTでは、12/26 お昼11:59まで、2024年最後のおトクなセールを開催中です!

📣宣伝

最後までお読みいただき、ありがとうございました!
次回の「NEWT Product Advent Calendar 2024」Day15は、EMのmiisanが担当します。令和トラベルでゼロからはじめた技術広報活動について紹介する予定です。次のブログもお楽しみに!
 

# backend

# typescript

# advent calendar