Skip to main content

「集約(Aggregate)とトランザクション境界」32章・詳細アウトライン📚✨

前提:TypeScript初級〜中級/設計は超入門/集約は初めて😊 環境:Windows🪟+VS Code💻+TypeScript(2026最新版)+AI支援(Copilot/Codex等)🤖✨ 題材:ミニEC(注文🛒・在庫📦・支払い💳)


第1章:この教材のゴール(まず安心する回)😊🎯

  • ねらい:集約とトランザクション境界が「何を守る道具か」だけ掴む
  • キーワード:一貫性✅/不変条件🔒/境界🧱
  • 手を動かす:事故例(在庫マイナス、二重決済)を「あるあるメモ」化📝
  • AI活用🤖:事故パターンを10個出してもらい、守るべきルール候補を抽出

第2章:DDD超ミニ入門(集約に必要な分だけ)🧠✨

  • ねらい:DDD全部はやらない、集約理解に必要な最小だけ
  • キーワード:ドメインモデル🧩/ユビキタス言語🗣️
  • 手を動かす:題材の用語辞書(言葉の定義表)を作る📘
  • AI活用🤖:用語辞書の叩き台を作らせて、ズレを人間が修正✅

第3章:題材ドメイン(ミニEC)の全体像🛒📦💳

  • ねらい:登場人物・データ・流れを絵にできる
  • キーワード:注文状態🧾/在庫引当📦/決済完了💳
  • 手を動かす:フロー図(注文→支払い→出荷)を手書きでもOKで作る🖊️
  • AI活用🤖:フローの「例外ケース(失敗)」を追加提案させる

第4章:VS Code + TypeScript(2026)環境準備🔧💻

  • ねらい:迷わない最低セットを整える(Windows前提🪟)
  • キーワード:TS設定⚙️/テスト🧪/フォーマット🧼
  • 手を動かす:プロジェクト作成+テスト1本通す✅
  • AI活用🤖:設定ファイル雛形の生成→自分で目視チェック👀

第5章:フォルダ構成と“依存の向き”ルール🧱➡️

  • ねらい:ドメインが外部都合に汚染されない形を先に作る
  • キーワード:依存関係ルール🧭/SoC✂️
  • 手を動かす:domain / application / infrastructure / tests の骨組み作成📁
  • AI活用🤖:「このファイルはどの層?」仕分けクイズを作らせる🎮

第6章:型で守る①(ID・金額・数量)🧱🔒

  • ねらい:stringのまま事故らない感覚を作る
  • キーワード:Value Object💎/型安全🛡️
  • 手を動かす:OrderId / Money / Quantity を“薄い型”で作る🧪
  • AI活用🤖:VO候補の洗い出し(住所・期間など)を手伝わせる

第7章:型で守る②(Entity と Value Object)👤💎

  • ねらい:同一性(ID)と値(不変)を分けられる
  • キーワード:Entity👤/VO💎
  • 手を動かす:OrderはEntity、MoneyはVO、みたいに分類表を作る📋
  • AI活用🤖:分類案を3通り出させて「なぜ?」を比較🪄

第8章:不変条件(Invariants)って結局なに?🔒🧠

  • ねらい:「絶対に壊れちゃダメなルール」を言語化できる
  • キーワード:不変条件🔒/無効状態を作らない🚫
  • 手を動かす:注文の不変条件リスト(例:合計金額はマイナス不可)📝
  • AI活用🤖:「不変条件が破れると何が困る?」を具体例で出させる

第9章:集約(Aggregate)とは?“まとまり”の正体🧺✨

  • ねらい:集約=不変条件を守る単位、を腑に落とす
  • キーワード:一貫性✅/境界🧱
  • 手を動かす:Order集約の“守るもの”を1枚にまとめる🗂️
  • AI活用🤖:集約候補を複数提案→却下理由も出させる

第10章:集約ルート(Aggregate Root)=入口は1つ🚪👑

  • ねらい:外から触っていい窓口を1つにする意味が分かる
  • キーワード:ルート👑/カプセル化📦
  • 手を動かす:OrderRootだけが行える操作一覧(addItem / pay 等)を書く📝
  • AI活用🤖:メソッド名の候補を「動詞+目的語」で整えてもらう

第11章:境界の決め方①(判断軸)🧭✨

  • ねらい:境界を“センス”じゃなく“理由”で決める
  • キーワード:同時更新🔁/不変条件🔒/凝集🧲
  • 手を動かす:判断軸チェックリストを作る✅
  • AI活用🤖:判断軸を「YES/NO質問」にしてもらう(使いやすい🎯)

第12章:境界の決め方②(ミニECで境界案を比較)🛒📊

  • ねらい:実データで境界を決める練習
  • キーワード:小さめの集約🧺/大きすぎ注意⚠️
  • 手を動かす:案A(注文+支払い同居)案B(分離)をメリデメ比較表にする📋
  • AI活用🤖:比較表の観点(性能・整合性・実装コスト)を補助してもらう

第13章:トランザクション境界 超入門(1回で整合する範囲)🧪📦

  • ねらい:「まとめて成功/全部やめる」の感覚をつかむ
  • キーワード:ACIDの肌感覚🧪/原子性⚛️
  • 手を動かす:成功/失敗のシナリオを文章で書く✍️
  • AI活用🤖:シナリオを「Given-When-Then」で整形させる

第14章:集約とトランザクションの関係(基本ルール)🧠🧱

  • ねらい:「基本は1集約=1トランザクション」を理解する
  • キーワード:境界一致🔁/例外の扱い⚠️
  • 手を動かす:Order集約で“1回の更新”に含める操作を決める✅
  • AI活用🤖:例外ケース(跨ぐ必要が出た時)の候補を出させる

第15章:集約に入れていいもの/ダメなもの(I/O分離)🚫🔌

  • ねらい:集約を“肥大化”させない
  • キーワード:テスタブル設計🧪/境界でI/Oを止める🧱
  • 手を動かす:集約内から「DB/HTTP/日時取得」を追い出す方針を書く📝
  • AI活用🤖:「これは集約に入れてOK?」クイズ形式で学習🎮

第16章:Repository入門(集約の出し入れ係)📥📤

  • ねらい:ドメインがDBを知らない形を作れる
  • キーワード:DIP🧲/interface🧩
  • 手を動かす:OrderRepository(保存/取得)をインターフェースで定義🧾
  • AI活用🤖:メソッド名の粒度(findById / save)の適正を相談

第17章:インメモリRepositoryでまず動かす(理解優先)🚀🧪

  • ねらい:DBなしでも“設計が動く”体験を先にする
  • キーワード:差し替え🔁/テスト容易✅
  • 手を動かす:インメモリ実装でユースケースを1本動かす💨
  • AI活用🤖:テストデータ生成(ダミーOrder)を作らせる

第18章:アプリケーションサービス(ユースケース)基礎🎮🧩

  • ねらい:集約の操作を“手順”として指揮できる
  • キーワード:取得→変更→保存🔁
  • 手を動かす:「注文作成」ユースケースを1本書く🛠️
  • AI活用🤖:ユースケースの責務が肥大化してないかレビュー補助

第19章:CQS(読みと書きを分ける)🔀👀

  • ねらい:副作用が読めるコードになる
  • キーワード:Command✍️/Query🔎
  • 手を動かす:getOrderDetails(Query)と placeOrder(Command)を分ける✅
  • AI活用🤖:API/関数の命名を「更新っぽい/参照っぽい」で判定させる

第20章:エラーを“仕様”にする(Result型と例外境界)🚨📦

  • ねらい:例外が暴れない設計にする
  • キーワード:ドメインエラー🧱/境界で変換🔁
  • 手を動かす:在庫不足・不正状態のエラーを型として表現する📝
  • AI活用🤖:エラー分類(リトライ可否/ユーザー表示)を整理させる

第21章:不変条件の置き場所①(ドメインで絶対守る)🔒👑

  • ねらい:集約が“最後の砦”になる
  • キーワード:無効状態を作らない🚫/生成時チェック✅
  • 手を動かす:Orderの生成/更新メソッドで不変条件を強制する🛡️
  • AI活用🤖:「不変条件が散らばってない?」チェック観点を出させる

第22章:不変条件の置き場所②(UI入力・アプリ層との分担)🪜🧠

  • ねらい:入力チェックとドメインルールの違いが分かる
  • キーワード:UIバリデーション🧼/ドメイン不変条件🔒
  • 手を動かす:分担表(UI/アプリ/ドメイン)を作る📋
  • AI活用🤖:分担の“よくある間違い”例を生成してもらう😇

第23章:テスト戦略①(集約ユニットテスト)🧪✅

  • ねらい:集約の不変条件をテストで守る
  • キーワード:TDDライト🧪/壊れやすい所優先🎯
  • 手を動かす:不変条件テストを3本書く(例:金額マイナス不可)🧷
  • AI活用🤖:テストケースの抜けを列挙させる(境界値が強い💪)

第24章:テスト戦略②(ユースケースのテスト)🎮🧪

  • ねらい:Repository差し替えでユースケースを検証できる
  • キーワード:モック/スタブ🧸/I/O分離🔌
  • 手を動かす:「注文作成→保存」をインメモリでテスト✅
  • AI活用🤖:テストの読みやすさ改善(Given/When/Then化)を補助

第25章:同時更新で起きる事故(ロストアップデート等)😱🔁

  • ねらい:“同時に触られる現実”を知る
  • キーワード:競合💥/上書き事故🧯
  • 手を動かす:擬似的に同時更新シナリオを作って壊す🧨
  • AI活用🤖:事故の再現手順を文章で分かりやすく整形

第26章:楽観ロック(version)で守る🛡️🔢

  • ねらい:versionで「古い更新」を拒否できる
  • キーワード:楽観ロック🙂/version🔢
  • 手を動かす:Orderにversionを持たせ、保存時に整合チェック✅
  • AI活用🤖:実装の落とし穴(更新忘れ・比較場所)をレビューさせる

第27章:冪等性①(なぜ必要?二重送信の世界)🔂🌍

  • ねらい:リトライで壊れない設計が必要だと分かる
  • キーワード:冪等性🔂/二重実行防止🧷
  • 手を動かす:「支払い確定」操作が2回来たら?を整理📝
  • AI活用🤖:冪等性が要る操作リスト(決済・注文確定など)を作らせる

第28章:冪等性②(冪等キーの設計と実装方針)🔑🛠️

  • ねらい:冪等キーをどこで持つか決められる
  • キーワード:Idempotency Key🔑/重複排除🧹
  • 手を動かす:キーの保存場所(注文側/支払い側)を決めて設計メモを書く📘
  • AI活用🤖:複数案の比較(安全性/コスト/実装難度)を出させる

第29章:集約をまたぐ更新が危ない①(悪い例を作って理解)⚠️🧨

  • ねらい:「注文更新ついでに在庫も更新」事故の本質を知る
  • キーワード:境界破り🚫/一貫性破綻💥
  • 手を動かす:わざと跨ぐ実装を書いて、どこが危険か赤ペン添削🟥
  • AI活用🤖:危険ポイントの指摘(責務・整合性・テスト困難)を列挙させる

第30章:集約をまたぐ更新が危ない②(逃がし方:最終的整合性)⏳🧩

  • ねらい:跨ぐときの“設計の逃げ道”を知る
  • キーワード:最終的整合性⏳/非同期📨
  • 手を動かす:即時必須/後でOK を仕分けして方針を決める✅
  • AI活用🤖:ユーザー体験への影響(表示・待ち時間)を一緒に考えさせる

第31章:ドメインイベント+Outboxの発想(取りこぼし対策)📣📮

  • ねらい:集約は“事実”を出す、副作用は外へ、信頼性も意識する
  • キーワード:Domain Event📣/Outbox📮
  • 手を動かす:OrderPaid等のイベントを定義し、ハンドラ案を作る🧾
  • AI活用🤖:イベント名の命名レビュー(過去形・事実)をさせる😊

第32章:Saga+観測性+ADR(総合演習で完成)🎓🏁🔍🧾

  • ねらい:現実の“跨ぐ処理”を補償で成立させ、運用まで見える設計にする

  • キーワード:Saga🧵/補償処理↩️/相関ID🔍/ADR🧾

  • 手を動かす:

    • フロー:注文→支払い→在庫→失敗時は補償(キャンセル/戻す)↩️
    • ログに相関IDを入れて追えるようにする🔍
    • 「なぜこの境界にしたか」をADR1枚で記録🧾
  • AI活用🤖:ADRの叩き台を作らせて、理由の筋を人間が整える✅