CRUD図という言葉自体は知っていても、実際に自動生成しようとすると行と列の粒度をどう決めるかで意外と悩まされます。このシリーズでは、フレームワークに依存しない静的解析でCRUD図を作る一連の流れを最初から整理していきます。
CRUD図とは
図1: Java CRUD解析フロー — ソースからSQL抽出・テーブル解析・マトリクス表生成・HTMLレポート出力まで
CRUD図(CRUD Matrix / CRUD Diagram)とは、システム内の各機能・クラス・モジュールが、どのテーブルに対して Create(挿入)・Read(参照)・Update(更新)・Delete(削除) のどの操作を行うかを一覧化した図です。
縦軸に機能/クラス、横軸にテーブルを並べた行列(マトリクス)形式が最も一般的で、各セルに
C / R / U / D を組み合わせた記号を書き入れます。
| クラス / テーブル | users | orders | products | order_items |
|---------------------|-------|--------|----------|-------------|
| UserService | CR | | | |
| OrderService | R | CRU | R | CRD |
| ProductService | | | CRUD | |
| ReportService | R | R | R | R |
上表から「OrderService は order_items テーブルの Create・Read・Delete を行う」「ReportService はすべてのテーブルに対して Read のみ」といった依存関係が一目でわかります。
なぜCRUD図が必要か
CRUD図は次のような場面で特に力を発揮します。
既存ツールの限界
CRUD図を自動生成するツールはいくつか存在しますが、多くは特定フレームワークに依存しています。
| ツール / アプローチ | 依存するもの | 問題点 |
|---|---|---|
| MyBatis Generator | MyBatis | JDBCやSpring JdbcTemplateで書かれたコードには対応しない |
| Hibernate SchemaExport | Hibernate / JPA | ネイティブSQLクエリは解析対象外 |
| ER図ツール(DBスキーマ解析) | DB接続 | テーブル構造はわかるが「どのクラスがアクセスするか」は不明 |
| 手動作成 | — | コード変更のたびに陳腐化し、メンテナンスコストが高い |
⚠️ レガシーシステムでは特に困る
古いシステムほど独自ユーティリティやプレーンJDBC、SQL文字列連結が多く、フレームワーク依存ツールが使えないケースが多くあります。このシリーズはそのような環境を主なターゲットにしています。
このシリーズのアプローチ
本シリーズでは Javaソースコードの静的解析 によるアプローチを採ります。 ソースコードをASTに変換して文字列リテラルを走査し、SQL文を取り出してテーブル名と操作種別を判別します。 ORMやフレームワークに関係なく、SQLが文字列として現れるコードであればすべてが対象です。
💡 対応できるSQLパターン
単一文字列リテラル、定数フィールドに格納されたSQL、メソッド内ローカル変数への代入——これらはすべて解析対象です。動的に組み立てるSQL(StringBuilder + 条件分岐)は部分的に対応し、PART 08で限界と対策を解説します。
シリーズ全体構成
| PART | タイトル | 内容 |
|---|---|---|
| 01 | はじめに(本記事) | CRUD図の目的・シリーズ概要 |
| 02 | アプローチの設計 | 静的解析 vs 動的解析・ツール選定 |
| 03 | SQL抽出の実装 | JavaParserでASTを走査しSQL文字列を取り出す |
| 04 | テーブル名・操作種別の判別 | JSqlParserでCRUD分類 |
| 05 | CRUD行列の構築 | クラス横断集約とデータ構造設計 |
| 06 | CRUD図の出力 | Markdownテーブル・Mermaid・PlantUML |
| 07 | 動作デモ | サンプルプロジェクトで実際に動かす |
| 08 | まとめ | 限界と改善点・Gradle/Mavenプラグイン化 |
使用技術スタック
✅ 次の章では…
PART 02 では静的解析と動的解析のトレードオフを整理し、なぜ今回静的解析を選ぶのか、そして JavaParser と JSqlParser を選定した理由を詳しく解説します。
Java CRUD図生成でよくある誤り
JavaソースからCRUD図を自動生成する際、シリーズ全体の設計方針を誤解したまま実装を始めると後工程で大きな手戻りが発生します。
| 誤り/失敗パターン | 何が起きるか | 正しい対処/防止策 |
|---|---|---|
| フレームワーク依存の解析ツールをそのまま使う | Spring/MyBatisなど特定FWに依存した設定が必要になりポータビリティが失われる | JavaParser+JSqlParserを使ったフレームワーク非依存の静的解析アプローチを採用する |
| 実行環境(DB接続)があることを前提に設計する | CI/CD環境や本番隔離環境で動作しなくなる | ソースコードだけを入力とする静的解析設計にしてDB接続を不要にする |
| CRUD図の定義を曖昧なまま実装を始める | 行(機能)と列(テーブル)の粒度が途中でブレて出力が統一されない | PART 01でCRUD図の行・列・セル記号の定義を明確に決めてから実装に進む |