「集約(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の叩き台を作らせて、理由の筋を人間が整える✅