ai-driven-development legacy-migration blazor

Blazor から DB を直接叩かない、というだけで品質が安定した話

急いでいる移行プロジェクトほど「Blazor のコンポーネントから直接 DB を見ればいいじゃん」という誘惑に駆られます。が、API 境界をきっちり引いておくほうが、結局は速かった。

W
渡邊 賢

なぜ書いたか

Blazor Serverで開発していると、コンポーネントの中から DbContext を直接呼べてしまいます。最初は「画面とDBの距離が近くて速い」と思ったんですが、移行後半で 業務判定が画面側にもAPI側にも散らばって 整合が取れなくなり、結局API経由に統一しました。今回はその話です。

やったこと

ルールはひとつだけです。

Blazor側からはAPI経由でしかDBに触らない。

具体的には:

  • API: 業務判定(権限、状態遷移、整合性)を全部こちらで持つ
  • APIのサービス層: DBアクセス、Oracle関数呼び出し、SQL組み立てもここに集約
  • Blazor側のサービス: APIを叩くHTTPクライアントとして薄く保つ
  • Blazorのコンポーネント: 表示と入力制御に集中。業務判定は持たない

業務判定がAPI側に集約されていれば、UIの見た目を変えても業務同等性が崩れません。これが本当に効きました。

何が変わったか

API境界を守るようにしてから、3つのコストが下がりました。

  • 業務同等性のレビュー: 業務判定がAPI側にあるので、レビュー対象が絞られる
  • テスト: API側を単体テストでカバーしやすい。UIを絡めない
  • 権限制御の二重化: UIとAPIの両方に同じ判定があれば良い、という構造が単純になる(二重防御の話

わかったこと

  • AIに「画面とDBを直結させて」と頼むと、最初は速い。でも5画面10画面と増えると、業務判定が散乱して同等性が崩れます
  • 「API経由で触る」を デフォルトのルール にしておくと、AIもそれに従って書いてくれます。最初に明示的にルール化しないと、近道を選びがち
  • DB直結が許される例外は、ごく狭いほうが良い。例外は「読み取り専用の表示専用クエリで、業務判定が一切絡まないもの」だけ、くらいに絞りました

関連する話

API境界の話は、画面ごとに「同じ業務判定が画面側とAPI側にダブって書かれている」問題ともつながります。私の場合は「業務判定はAPI側」「UIの表示制御はBlazor側」の責務分担を明示することで、ダブり実装を1箇所に寄せました。

次にやること / 未解決の問題

  • API側に集約した業務判定の単体テストカバレッジが、まだ画面ごとにムラがある。最低ラインを決めたい
  • 表示専用クエリの「DB直結を許す例外」をどこに線を引くかは、画面ごとにケースバイケースで判断している。ルール化したい
person

渡邊 賢

等差級数的Commit 運営 / ICD VIETNAM.LLC General Manager

AI駆動開発と段階的なレガシーモダン化をテーマに、日々の試行錯誤をこのブログに記録しています。

プロフィール詳細 arrow_forward

似たような課題に困っている方、一緒に考えませんか。

AI駆動開発・Vibe Coding・レガシーマイグレーションに関するご相談を受け付けています。