メインコンテンツまでスキップ

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が作れる

  • 📌 学ぶこと:

    • “今必要な情報”と“参照で取れる情報”を分ける🔎
    • 個人情報/巨大データを入れすぎない🙅‍♀️
  • 📝 演習:OrderPlaced payloadを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活用:移行計画(いつ何をやめる)を段取りにしてもらう🧠