CRUD図という言葉自体は知っていても、実際に自動生成しようとすると行と列の粒度をどう決めるかで意外と悩まされます。このシリーズでは、フレームワークに依存しない静的解析でCRUD図を作る一連の流れを最初から整理していきます。

CRUD図とは

Java CRUD解析フロー図

図1: Java CRUD解析フロー — ソースからSQL抽出・テーブル解析・マトリクス表生成・HTMLレポート出力まで

CRUD図(CRUD Matrix / CRUD Diagram)とは、システム内の各機能・クラス・モジュールが、どのテーブルに対して Create(挿入)・Read(参照)・Update(更新)・Delete(削除) のどの操作を行うかを一覧化した図です。

縦軸に機能/クラス、横軸にテーブルを並べた行列(マトリクス)形式が最も一般的で、各セルに C / R / U / D を組み合わせた記号を書き入れます。

CRUD図 — Markdownテーブル例
| クラス / テーブル    | users | orders | products | order_items |
|---------------------|-------|--------|----------|-------------|
| UserService         | CR    |        |          |             |
| OrderService        | R     | CRU    | R        | CRD         |
| ProductService      |       |        | CRUD     |             |
| ReportService       | R     | R      | R        | R           |

上表から「OrderServiceorder_items テーブルの Create・Read・Delete を行う」「ReportService はすべてのテーブルに対して Read のみ」といった依存関係が一目でわかります。

なぜCRUD図が必要か

CRUD図は次のような場面で特に力を発揮します。

影響調査
テーブルの列追加・削除・リネームを行うとき、どのクラスに修正が波及するかを即座に把握できる。
引き継ぎ・レビュー
新メンバーへの説明資料として、システムのデータアクセス全体像を短時間で伝えられる。
設計検証
「このテーブルを Delete できるクラスが多すぎる」「参照専用のはずのクラスが Update している」などの設計崩れを発見できる。
移行計画
マイクロサービス分割やDB移行の際、テーブルを参照しているクラスを漏れなく特定できる。

既存ツールの限界

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 動的解析・ツール選定
03SQL抽出の実装JavaParserでASTを走査しSQL文字列を取り出す
04テーブル名・操作種別の判別JSqlParserでCRUD分類
05CRUD行列の構築クラス横断集約とデータ構造設計
06CRUD図の出力Markdownテーブル・Mermaid・PlantUML
07動作デモサンプルプロジェクトで実際に動かす
08まとめ限界と改善点・Gradle/Mavenプラグイン化

使用技術スタック

JavaParser
JavaソースコードをASTに変換するライブラリ。文字列リテラル・フィールド・変数宣言を走査してSQL候補を抽出する。
JSqlParser
SQL文字列を解析してAST(Statement)に変換するライブラリ。SELECT/INSERT/UPDATE/DELETEのテーブル名を安全に取得できる。
Mermaid
Markdown内で図を描くためのDSL。GitHub・Notion・Confluenceで直接レンダリングされ、CRUD図の出力先として最適。
PlantUML
テキストからUMLを生成するツール。より高機能な表現が必要な場合のオプション出力先。

次の章では…

PART 02 では静的解析と動的解析のトレードオフを整理し、なぜ今回静的解析を選ぶのか、そして JavaParser と JSqlParser を選定した理由を詳しく解説します。

→ PART 02 — アプローチの設計へ

Java CRUD図生成でよくある誤り

JavaソースからCRUD図を自動生成する際、シリーズ全体の設計方針を誤解したまま実装を始めると後工程で大きな手戻りが発生します。

誤り/失敗パターン何が起きるか正しい対処/防止策
フレームワーク依存の解析ツールをそのまま使うSpring/MyBatisなど特定FWに依存した設定が必要になりポータビリティが失われるJavaParser+JSqlParserを使ったフレームワーク非依存の静的解析アプローチを採用する
実行環境(DB接続)があることを前提に設計するCI/CD環境や本番隔離環境で動作しなくなるソースコードだけを入力とする静的解析設計にしてDB接続を不要にする
CRUD図の定義を曖昧なまま実装を始める行(機能)と列(テーブル)の粒度が途中でブレて出力が統一されないPART 01でCRUD図の行・列・セル記号の定義を明確に決めてから実装に進む