TypeScript版「ドメインイベント(Domain Events)」32章アウトライン(Windows / VS Code / AIあり)💉🧩🪟
第1章 ドメインイベントってなに?🌱✨
-
🎯 ゴール:Domain Events(ドメインイベント)を「業務で起きた事実」として説明できる
-
📌 学ぶこと:
- “何をするか”じゃなくて“何が起きたか”で表す(例:
OrderPaid)⏳ - イベントがあると「後から機能追加」がラクになる理由🔌
- “何をするか”じゃなくて“何が起きたか”で表す(例:
-
📝 演習:日常の出来事を「過去形の事実」にして5個書く(例:
LessonFinished)📒 -
🤖 AI活用:イベント名の候補を10個出してもらい、粒度を比べる🔍
第2章 学習題材を決めよう🎁🛒(ミニEC)
- 🎯 ゴール:イベントが活きる題材を“業務フロー”で描ける
- 📌 学ぶこと:注文→支払い→発送→通知の流れ📦💳📩
- 📝 演習:題材のイベント候補を3〜6個書く(
OrderPlacedなど)🧾 - 🤖 AI活用:フロー図(文章でもOK)からイベント候補を抽出してもらう🧠
第3章 2026年版 環境セットアップ(Windows + VS Code)🪄🖥️
-
🎯 ゴール:TypeScriptプロジェクトを作って実行できる
-
📌 学ぶこと:
- VS CodeでTypeScript/Nodeの基本動作を確認✅
- フォーマット/リンター/テストの“最小セット”を用意🧹
-
📝 演習:最小プロジェクトを作り
npm testまで通す🧪 -
🤖 AI活用:設定ファイルの意味を「やさしい言葉」で説明してもらう💬
第4章 TypeScript基礎おさらい(イベント用)🔷🧩
- 🎯 ゴール:イベントを“型”で安全に扱えるようになる
- 📌 学ぶこと:リテラル型、
readonly、ユニオン型、型ガード🛡️ - 📝 演習:
type EventType = "OrderPlaced" | "OrderPaid"を作る📌 - 🤖 AI活用:型ガードの例を3パターン作ってもらう👀
第5章 設計の超入門(SoCと境界)🧱✨
-
🎯 ゴール:「混ぜない」だけで設計が良くなる感覚を掴む
-
📌 学ぶこと:
- UI/業務/DB/外部APIは変更理由が違う(SoC)🚪
- “境界”をまたぐときは形を整える(変換)🔁
-
📝 演習:題材の関心を3つに分けて書く(例:業務・通知・永続化)📝
-
🤖 AI活用:今のコードの“混ざりポイント”を指摘してもらう🔍
第6章 ドメインモデル超入門(Entity/VO)🏠📚
- 🎯 ゴール:イベントの発生源になるモデルを理解する
- 📌 学ぶこと:EntityとValue Objectの違い(ID/値)🆔💎
- 📝 演習:「金額」「住所」をVOにすると何が嬉しいか書く🧠
- 🤖 AI活用:VO候補の洗い出しを手伝ってもらう📝
第7章 不変条件(Invariants)を先に決めよう🔒✅
-
🎯 ゴール:“守るべきルール”を入口で保証できる
-
📌 学ぶこと:
- 無効な状態を作らない
- 生成/更新メソッドにチェックを寄せる
-
📝 演習:「注文合計は0円以上」などを3つ決める🧾
-
🤖 AI活用:自然文ルール→チェック条件に変換してもらう🔁
第8章 ドメインイベントの基本ルール🧠📏
-
🎯 ゴール:良いイベント名・悪いイベント名を見分ける
-
📌 学ぶこと:
- 過去形の“事実”で命名⏳
- 命令(Send/Do)は避けがち📮❌
- 粒度:大きすぎ/小さすぎ問題⚖️
-
📝 演習:命令っぽい名前を“事実”に直す練習✍️
-
🤖 AI活用:粒度レビュー(「大きすぎる?」)をしてもらう🔍
第9章 イベントの“型”を設計する(共通フォーマット)🧾🛡️
- 🎯 ゴール:イベントを統一フォーマットで扱える
- 📌 学ぶこと:
eventId,occurredAt,aggregateId,type,payload📦 - 📝 演習:共通の
DomainEvent<TType, TPayload>を考える🔷 - 🤖 AI活用:payloadが「詰め込みすぎ」かチェックしてもらう🎒
第10章 イベントpayload設計のコツ(必要最小限)🎒✨
-
🎯 ゴール:依存を増やさないpayloadが作れる
-
📌 学ぶこと:
- “今必要な情報”と“参照で取れる情報”を分ける🔎
- 個人情報/巨大データを入れすぎない🙅♀️
-
📝 演習:
OrderPlacedpayloadを2案作って比較する⚖️ -
🤖 AI活用:「利用側が欲しがりそう」を想像してもらい、最小案を作る🧠
第11章 イベントはどこで発火する?(集約ルート)🔥🏛️
- 🎯 ゴール:イベントを“正しい場所”から出せる
- 📌 学ぶこと:状態変更が起きた瞬間にイベントを生む💥
- 📝 演習:注文の状態遷移(作成→支払い→発送)を箇条書きにする🧾
- 🤖 AI活用:集約の責務か、ハンドラの責務かを判定してもらう🧭
第12章 イベントを“ためる”設計(ドメイン内バッファ)🫙🧩
-
🎯 ゴール:ドメインがイベントを生成して保持できる
-
📌 学ぶこと:
- ドメインは外部I/Oしない(通知は後で)📩❌
- イベント一覧を取り出せるようにする📤
-
📝 演習:操作後に
pullDomainEvents()できる設計を考える🧠 -
🤖 AI活用:設計案をレビューしてもらう(責務が混ざってない?)🔍
第13章 イベントを“配る”流れ(アプリ層ディスパッチ)📣🚚
-
🎯 ゴール:保存→ディスパッチの基本フローを理解する
-
📌 学ぶこと:
- Repository保存後にディスパッチする理由💾➡️📤
- 失敗時の扱い(ここではまず概要)⚠️
-
📝 演習:1ユースケースの処理順を番号付きで書く①②③📝
-
🤖 AI活用:処理順の“落とし穴”を指摘してもらう🧯
第14章 イベントハンドラ入門(副作用を外へ)🔔🧩
-
🎯 ゴール:ハンドラで通知や連携を実装できる
-
📌 学ぶこと:
- 1ハンドラ=1関心(SoC)🎯
- 外部I/Oはハンドラ側でやる🌍
-
📝 演習:
OrderPaidから「通知」「ポイント付与」を別ハンドラに分ける📩🪙 -
🤖 AI活用:責務の切り方を提案してもらう✂️
第15章 ハンドラ分割の設計(増えても破綻しない)🍱➡️🧩
-
🎯 ゴール:ハンドラが増えても整理できる
-
📌 学ぶこと:
- 「通知系」「集計系」「連携系」みたいに分類📚
- 命名と配置(フォルダ設計)🗂️
-
📝 演習:ハンドラ一覧をカテゴリ別に整理する📝
-
🤖 AI活用:分類ルールを作ってもらい、ぶれを減らす📏
第16章 同期/非同期と順序(どれを今やる?)⚡🕰️
-
🎯 ゴール:順序が必要かどうか判断できる
-
📌 学ぶこと:
- “同期必須”と“非同期OK”の見分け方⚖️
- 順序が要る処理(例:決済→出荷)⏱️
-
📝 演習:題材の処理を同期/非同期に分類する📌
-
🤖 AI活用:判断理由を言語化するのを手伝ってもらう💬
第17章 集約とトランザクション境界(守る範囲)🔒🧱
-
🎯 ゴール:一貫性を守る“範囲”を決められる
-
📌 学ぶこと:
- 集約ルート経由で更新する🚪
- 集約を跨ぐ更新はイベントでつなぐのが自然🔗
-
📝 演習:「注文」と「在庫」は同一トランザクション?理由を書く📦🧾
-
🤖 AI活用:境界が大きすぎないかチェックしてもらう🔍
第18章 最終的整合性の肌感覚(遅れて一致)🌊🕰️
- 🎯 ゴール:“すぐ一致しない”を前提に設計できる
- 📌 学ぶこと:UXで伝える(処理中/反映待ち)💬
- 📝 演習:反映遅延があるときの画面メッセージ案を3つ作る🧾
- 🤖 AI活用:ユーザー向け文言をやさしく整える✨
第19章 冪等性入門(同じイベントが来ても平気)🔁🧷
-
🎯 ゴール:二重実行でも壊れない設計ができる
-
📌 学ぶこと:
eventIdで重複排除🧾- 二重付与・二重送信を防ぐ🛑
-
📝 演習:「ポイント付与」二重実行対策を2案書く🪙
-
🤖 AI活用:冪等性パターンの比較表を作ってもらう🧠
第20章 Outboxが解決する問題(取りこぼし地獄)⚠️📤
- 🎯 ゴール:なぜOutboxが必要か説明できる
- 📌 学ぶこと:DB更新とイベント発行がズレる事故💥
- 📝 演習:「DB成功・発行失敗」時の困りごとを3つ書く🧯
- 🤖 AI活用:事故シナリオを増やしてもらい、対策の必要性を体感する😵💫
第21章 Outboxの仕組み(記録して後で配る)🗃️👷
-
🎯 ゴール:Outboxの流れ(書く→配る)を描ける
-
📌 学ぶこと:
- Outboxテーブル/キューのイメージ🗂️
- 配信ワーカー(ポーリング/バッチ)🔁
-
📝 演習:Outboxのカラム案を作る(id, type, payload, status…)🧾
-
🤖 AI活用:テーブル設計のレビューをしてもらう🔍
第22章 エラー分類(ドメイン vs インフラ)🚧🌐
-
🎯 ゴール:エラーを“種類”で整理できる
-
📌 学ぶこと:
- ルール違反=ドメインエラー
- 通信/DB=インフラエラー
- 境界で変換する🔁
-
📝 演習:失敗例を5つ出して分類する📝
-
🤖 AI活用:分類がブレてないか添削してもらう✅
第23章 失敗時の方針(リトライ/諦める/通知)🔁🧯
-
🎯 ゴール:ハンドラ失敗時の“運用方針”を持てる
-
📌 学ぶこと:
- リトライ可否(外部APIは一時失敗多い)📡
- デッドレター(失敗保管)📮
- どこでアラートする?🔔
-
📝 演習:失敗ごとに「リトライOK/NG」を決める📌
-
🤖 AI活用:運用フローを文章で整えてもらう🧠
第24章 ログと相関ID(追跡できる設計)👀🔗
- 🎯 ゴール:「この注文どうなった?」に答えられるログを作る
- 📌 学ぶこと:correlationId / requestId の考え方🧾
- 📝 演習:ログの最低限フィールドを5つ決める📌
- 🤖 AI活用:ログ文言を読みやすく整える✨
第25章 メトリクスとトレースのイメージ📈🕵️♀️
-
🎯 ゴール:運用の“数字”と“流れ”を意識できる
-
📌 学ぶこと:
- 失敗率・遅延・件数などのメトリクス📊
- 処理のつながり(トレース)の雰囲気🧵
-
📝 演習:監視したい指標を3つ選ぶ(例:失敗率)✅
-
🤖 AI活用:指標候補の洗い出しを手伝ってもらう🧠
第26章 テスト:ドメイン(イベントが出たか?)🧪💖
- 🎯 ゴール:ドメインロジックを単体でテストできる
- 📌 学ぶこと:入力→状態→イベントの確認✅
- 📝 演習:「支払い済みは再支払い不可」のテストを書く💳❌
- 🤖 AI活用:テストケースの抜けをレビューしてもらう🔍
第27章 テスト:ハンドラ(副作用が呼ばれたか?)📞🧪
- 🎯 ゴール:外部I/Oをモックして安全に検証できる
- 📌 学ぶこと:DI/インターフェースで差し替え🎭
- 📝 演習:
EmailSenderをモックして送信回数を検証📩 - 🤖 AI活用:モック設計の例を複数出してもらう🧠
第28章 TDDっぽくイベントを育てる🌱🧪
- 🎯 ゴール:小さく作って壊さず進める
- 📌 学ぶこと:テスト→実装→整理(リファクタ)🔧
- 📝 演習:
OrderPlacedを3ステップで完成させる(最小→拡張)👣 - 🤖 AI活用:次の一手(最小ステップ)を提案してもらう🧭
第29章 DI入門(差し替え可能にする)🔄🧩
- 🎯 ゴール:外部サービス依存をゆるめる
- 📌 学ぶこと:コンストラクタ注入が基本🧰
- 📝 演習:
PaymentGatewayをinterface化する💳 - 🤖 AI活用:interfaceが太りすぎてないかチェックしてもらう📏
第30章 Ports & Adaptersで整理する(置き場所のルール)🔌🗂️
- 🎯 ゴール:ドメインを外の都合から守る
- 📌 学ぶこと:Inbound/Outboundの分離🚪
- 📝 演習:フォルダ構成(domain/application/infrastructure)を決める🗂️
- 🤖 AI活用:構成案を複数出してもらい、最小を選ぶ⚖️
第31章 イベントは契約(壊さず育てる)🤝📜
-
🎯 ゴール:イベント変更が“破壊変更”にならないようにする
-
📌 学ぶこと:
- 追加は比較的安全、削除/変更は危険⚠️
- 利用側を想像する(未来の自分も利用者)🪞
-
📝 演習:payload変更案を「安全/危険」で分類する📌
-
🤖 AI活用:互換性レビューの観点リストを作ってもらう✅
第32章 イベントのバージョニング戦略(どう進化させる?)🔖🔢
-
🎯 ゴール:バージョンの持ち方を選べる
-
📌 学ぶこと:
versionフィールド方式typeにバージョンを含める方式- 段階的廃止(古いイベントも一定期間受ける)🕰️
-
📝 演習:自分の題材で「バージョン方針」を1つ決めて文章化する📝
-
🤖 AI活用:移行計画(いつ何をやめる)を段取りにしてもらう🧠