Skip to main content

第01章:ドメインイベントってなに?🌱✨

🎯 ゴール

  • 「Domain Events(ドメインイベント)」を “業務で起きた事実” として説明できるようになる💡
  • “何をするか”じゃなくて “何が起きたか” で表せるようになる(例:「OrderPaid」)⏳✨

1) ドメインイベント=「大事な出来事のレシート」🧾✨

ドメインイベントは「起きた事実」のレシート

ドメインイベントはひとことで言うと、

  • 「ドメイン(業務)で、もう起きた出来事」
  • 「その出来事を、他の処理が知れるように“かたち”にしたもの」

…です📣

「イベントは過去の出来事」っていうのが超大事ポイントで、 “これからやる命令” じゃなくて “すでに起きた事実” を表します🕰️

Martin Fowler も、ドメインイベントを「(アプリが気にする)外の世界で起きた出来事」として語っています。 (martinfowler.com) また Microsoft の解説でも「ドメインイベントは、起きたこと(過去)で、同じドメイン内の他の部分に知らせたいもの」と説明されています。 (Microsoft Learn)


2) 「命令」と「事実」の違いを一発で理解しよう⚡🧠

🟥 命令(Command)=「やって!」

  • 「メールを送れ」
  • 「支払いを実行しろ」
  • 「発送して」

🟩 事実(Event)=「起きた!」

  • 「メールが送信された」
  • 「支払いが完了した」
  • 「発送された」

ドメインイベントは 🟩側 です🙌✨ だから名前も、だいたい 過去形っぽい雰囲気 になります(英語の命名でも “~ed”/過去分詞っぽさ)📝


3) 例:ミニECだと、どんなイベント?🛒📦💳

「注文→支払い→発送→通知」みたいな流れがあるとき、イベントはこんな感じ👇

  • ✅ OrderPlaced(注文された)🧾
  • ✅ OrderPaid(支払いが完了した)💳
  • ✅ OrderShipped(発送された)📦
  • ✅ ReceiptIssued(領収書が発行された)🧾✨
  • ✅ CustomerNotified(通知された)📩

ポイントは、どれも 「もう起きた」 になってること🌟


4) なんでイベントがあると「後から追加」がラクなの?🔌✨

イベントがない世界だと…

  • 注文処理の中に「メール送信」「ポイント付与」「売上集計」などがどんどん混ざりがち😵‍💫
  • 追加したいことが増えるたびに、注文処理が巨大化💥
  • うっかり既存処理を壊す確率も上がる🧨

イベントがある世界だと…

  • 「注文が支払われた」という事実(OrderPaid)を合図にして📣
  • あとから「ポイント付与」を追加しても、支払い処理にベタ書きしなくて済む🎁✨
  • 「通知」「集計」「連携」を 別の処理として増やしやすい 🔌🧩

つまり、イベントは “あとから増やすための接続口” になってくれます🔌✨


5) ドメインイベントは「ログ」と何が違うの?🪵👀

よく混ざるので、ここで分けちゃうね💡

  • 🧾 ドメインイベント:業務的に意味がある「出来事」

    • 例)「支払いが完了した」「発送された」
  • 🪵 ログ:観測のための記録(デバッグや運用)

    • 例)「支払いAPIにリクエスト送った」「レスポンス200」
  • 🔔 通知:誰かに伝えるためのアクション

    • 例)「メール送信」「Slack投稿」

ドメインイベントは “意味のある出来事そのもの”。 ログや通知は、その出来事の周辺にある別の目的のもの、ってイメージがいちばん安全✅✨


6) TypeScript(2026)で見る「イベントの姿」🔷🧩

TypeScript は 2026年1月時点で 5.9 の情報が公開されています(公式のRelease Notes/ブログ)。 (TypeScript) この教材では「イベントを型で安全に扱える」のが強みになるよ🛡️✨

ここでは “雰囲気” をつかむだけでOK👌(まだ環境セットアップ前でも読める)

// 「ドメインイベントって、だいたいこういう情報を持つよね」の最小イメージ🧾✨
type DomainEvent<TType extends string, TPayload> = {
eventId: string; // そのイベントのID(ユニーク)🆔
occurredAt: string; // 起きた時刻(ISO文字列など)🕰️
type: TType; // イベント名(例: "OrderPaid")🏷️
payload: TPayload; // 内容(必要最小限がコツ)🎒
};

// 例:支払い完了イベント💳
type OrderPaid = DomainEvent<"OrderPaid", {
orderId: string;
paidAmount: number;
}>;

「type と payload を “イベントごとに型で縛れる”」のが TypeScript っぽい美味しさ😋🔷


7) 📝 演習:日常の出来事を「過去形の事実」にして5個書こう📒✨

ルール(超かんたん)✅

  • 「やる」じゃなくて「起きた」にする
  • “業務っぽい/意味がある” 出来事にする(小さすぎるのは避ける)

例(このまま真似してOK)🍀

  • LessonFinished(授業が終わった)🎓
  • LunchOrdered(ランチを注文した)🍙
  • PartTimeShiftStarted(バイトが始まった)🕒
  • ReportSubmitted(レポートを提出した)📄
  • TrainMissed(電車に乗り遅れた)🚃💨

あなたの番✍️

  1. ________
  2. ________
  3. ________
  4. ________
  5. ________

8) 🤖 AI活用:イベント名の候補を10個出してもらって「粒度」を比べよう🔍✨

🎯 やりたいこと

  • 1つの出来事に対して、イベント名候補をたくさん出して
  • 「大きすぎ?」「細かすぎ?」を比べて、ちょうどいいところを見つける⚖️

コピペ用プロンプト(そのまま使ってOK)📋✨

プロンプト①:候補を10個

  • 「『◯◯(出来事)』を表すドメインイベント名を英語で10個ください。過去形の事実になるようにしてください。候補ごとに“粒度が大/中/小”も付けてください。」

プロンプト②:命令→事実に変換

  • 「次の“命令っぽい名前”を、ドメインイベント(過去の事実)になるように言い換えてください:SendEmail, DoPayment, ShipOrder。各3案ずつ。」

プロンプト③:粒度チェック

  • 「このイベント名は粒度が大きすぎますか?小さすぎますか?理由と改善案をください:OrderProcessed」

9) よくあるミスあるある🚧(ここだけ先に回避しよう!)

❌ ミス1:イベント名が命令になってる

  • SendEmail / DoPayment みたいな “やれ” はイベントじゃないことが多い🙅‍♀️
  • ✅ CustomerNotified / PaymentCompleted みたいに “起きた” に寄せよう✨

❌ ミス2:技術の都合が名前に出てる

  • KafkaPublished とか DBUpdated とかは “業務の出来事” じゃない😢
  • ✅ あくまで業務:OrderPaid / AddressChanged みたいにする🧾

❌ ミス3:なんでもイベントにしてカオス

  • 「ボタンが押された」「画面が開いた」みたいなのは、業務上の意味が薄いことが多い📱💦
  • ✅ “ビジネス的に意味がある” を基準にしよう✨

✅ まとめチェック(3つだけ!)🧠✨

  • ✅ ドメインイベントは 「起きた事実」(過去)🕰️
  • ✅ 名前は “何が起きたか” を表す(命令にしない)🧾
  • ✅ イベントがあると あとから機能を足しやすい 🔌✨

🧷 おまけ:2026時点の実行環境の空気感(超ざっくり)🪟✨

(この教材では細かいセットアップは別章でやるよ!ここは安心材料だけ☺️)

  • Node.js は v24 が Active LTS 扱いとして整理されていて、v25 は Current です(公式のリリース一覧)。 (Node.js)
  • 2026-01-13 に v24.13.0(LTS)のセキュリティリリースも出ています。 (Node.js)

「最新を追いつつ、安定版(LTS)も意識する」っていう流れでOKだよ🙆‍♀️✨