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

cqrs_ts_index

CQRS(読み/書き分離)教育アウトライン:全37章 🎓✨(TypeScript / Windows / VS Code / AI拡張前提🤖)

第1章 CQRSってなに?最短でわかる入口🚪✨

  • ねらい:CQRSの“雰囲気”をつかむ😊
  • 学ぶ:Command(更新)/ Query(参照)の分け方の意味
  • ミニ演習:身近な例で Command と Query を分類してみる🗂️
  • AI活用🤖:例を10個出して分類させる(間違いもツッコミ入れる)😆

第2章 題材紹介「学食モバイル注文」🍙📱

  • ねらい:何を作るかを先に固定して迷子防止🧭
  • 学ぶ:画面(注文・支払い・一覧・集計)の全体像
  • ミニ演習:機能を「更新系」「参照系」に分けて付箋化📝✨

第3章 まずは“分けない版”を作る①(最小の動く形)😅🔧

  • ねらい:CQRSなしの典型を体験する
  • 学ぶ:1つのサービスに全部入れるとどうなるか
  • ハンズオン:OrderService に create/list を雑に入れて動かす💨

第4章 まずは“分けない版”を作る②(増やして苦しむ)😵‍💫📌

  • ねらい:「あ、これ辛い」が体感できるようにする
  • 学ぶ:条件分岐・責務混在・テストしにくさの芽🌱
  • ハンズオン:支払い・状態遷移・検索条件を追加して破綻を観察👀

第5章 辛さの正体を言語化する(設計の目👓)🧠✨

  • ねらい:ただ苦しいで終わらせない😆
  • 学ぶ:変更理由の混在(SoC)、影響範囲、I/O混入
  • ミニ演習:「この変更はどこまで波及?」を3パターンで当てる🎯

第6章 CQSの基本(更新と参照は混ぜない)🔀✅

  • ねらい:まずは“同じクラス内で分ける”でOK😊
  • 学ぶ:副作用の有無、命名のコツ(Command/Queryの見分け)
  • ハンズオン:同一クラスでもメソッドを分けて整理🧹

第7章 CQRSの最小形(CommandHandler / QueryService)🧩✨

  • ねらい:CQRSの“骨格”をつかむ
  • 学ぶ:Command側の入口、Query側の入口
  • ハンズオン:PlaceOrderHandlerGetOrderListQuery を作る✍️

第8章 Windows+VS Code+TSのプロジェクト土台づくり🪟🧰

  • ねらい:迷わない開発の型を作る
  • 学ぶ:フォルダ構成(commands/queries/domain/infrastructure)📁
  • AI活用🤖:フォルダ構成レビューをAIに頼む(責務が混ざってない?)

第9章 ドメイン超入門(Orderって何を持つ?)📦🙂

  • ねらい:モデルを“言葉”で揃える
  • 学ぶ:Order / OrderItem / Money(軽く)
  • 演習:プロパティを増やしすぎない(KISS)🧊

第10章 コマンド設計①(PlaceOrder:注文する)🧾✅

  • ねらい:Commandは「やりたいこと」を表す
  • 学ぶ:入力DTO、必須項目、型で表す
  • ハンズオン:PlaceOrder の入力と最小バリデーション

第11章 不変条件(Invariants)を入口で守る🚪🛡️

  • ねらい:途中で壊れないようにする
  • 学ぶ:無効状態を作らないチェック
  • ハンズオン:数量>0、合計金額>=0、メニューID必須など🍽️

第12章 コマンド設計②(PayOrder:支払う)💳✨

  • ねらい:状態遷移を伴う更新を扱う
  • 学ぶ:ORDERED→PAID のルール
  • ハンズオン:PayOrder コマンドと禁止条件(未注文は払えない🙅‍♀️)

第13章 CommandHandlerの責務(薄く・強く)🧠🧩

  • ねらい:Handlerに詰め込みすぎない
  • 学ぶ:Handlerは「流れ」、ドメインは「ルール」
  • AI活用🤖:Handlerが太いか診断してもらう(“やりすぎ警報”🚨)

第14章 Write側の永続化を抽象化(Repository入門)🗄️🔁

  • ねらい:DB都合から業務を守る(DIP)
  • 学ぶ:OrderRepository interface の意味
  • ハンズオン:in-memory実装から開始(まずは軽く)🪶

第15章 トランザクション境界の考え方(集約の肌感)🔒📦

  • ねらい:「一回の更新で守る範囲」を意識する
  • 学ぶ:Orderを一貫性の単位にする
  • ミニ演習:どこまで同時更新すべき?を判断🎯

第16章 クエリ設計①(GetOrderList:一覧)🔎📋

  • ねらい:Queryは“画面が欲しい形”が正義
  • 学ぶ:表示用項目の選び方
  • ハンズオン:一覧DTOを設計(ドメインをそのまま返さない)🙆‍♀️

第17章 クエリ設計②(GetSalesSummary:集計)📊✨

  • ねらい:CQRSが気持ちよくなる例
  • 学ぶ:集計はRead側で作る発想
  • ハンズオン:日別売上、人気メニューTOP3など🍙🏆

第18章 Read DTOの割り切り(ビュー専用でOK)🎁🙂

  • ねらい:Readは“使いやすさ”優先
  • 学ぶ:DTOの命名、整形、欠損値の扱い
  • AI活用🤖:DTOが「画面の言葉」になってるかレビュー

第19章 QueryServiceの責務(副作用ゼロ!)🧼🚫

  • ねらい:Queryは読み取り専用で徹底
  • 学ぶ:QueryServiceが更新しないルール
  • ハンズオン:QueryService + ReadRepository で実装

第20章 Readモデルの置き場(最初はシンプルでOK)📦🪶

  • ねらい:難しい基盤の話で詰まらない
  • 学ぶ:in-memory / SQLite / API など選択肢の考え方
  • ミニ演習:「今は何を選ぶ?」を要件で決める🧭

第21章 エラー設計①(エラーの種類を分ける)⚠️🧠

  • ねらい:エラーを“仕様”として整理する
  • 学ぶ:ドメインエラー / インフラエラー / 予期せぬバグ
  • 演習:PayOrder で起こるエラーを列挙する📝

第22章 エラー設計②(境界でどう返す?Result/例外)🎯🧰

  • ねらい:UIに返す形を揃える
  • 学ぶ:境界で変換、メッセージ方針
  • AI活用🤖:エラー分類の漏れチェック✅

第23章 テスト① CommandHandlerをユニットテスト🧪✅

  • ねらい:更新の正しさを固める
  • 学ぶ:Arrange/Act/Assert、モック差し替え
  • ハンズオン:PlaceOrder / PayOrder のテストを書く✍️

第24章 テスト② QueryServiceをテスト(返り値の形)👀🧪

  • ねらい:表示の期待値を守る
  • 学ぶ:固定データでの検証、スナップショット的発想
  • ハンズオン:一覧・集計のDTOを検証📋✅

第25章 投影(Projection)① 同期投影(まずはこれ)🪞⚡

  • ねらい:Readモデル更新の最短ルート
  • 学ぶ:Write更新の後にReadも更新する
  • ハンズオン:注文作成時にRead一覧も更新

第26章 投影(Projection)② 非同期投影の全体像⏳📨

  • ねらい:CQRSの“それっぽさ”を理解
  • 学ぶ:更新→イベント→投影の流れ
  • 演習:図を描いて説明できるようにする🖊️✨

第27章 ドメインイベント入門(OrderPaid みたいな過去形)📣📦

  • ねらい:“起きた事実”を表せるようになる
  • 学ぶ:イベント命名、必要データ、粒度
  • ハンズオン:OrderPlaced / OrderPaid を作る

第28章 イベントハンドラ(Readモデルを育てる係)🌱🔧

  • ねらい:副作用をここに閉じ込める
  • 学ぶ:イベント→投影の責務分離
  • AI活用🤖:イベントの粒度が細かすぎないか相談

第29章 最終的整合性の肌感覚(“ズレ”と友達になる)🕒🙂

  • ねらい:初見で不安になりがちな所を解消
  • 学ぶ:どこは即時必須?どこは遅れてOK?
  • 演習:UXで補う(更新中表示・再取得)🔄✨

第30章 冪等性(同じイベントが2回来ても大丈夫)🔁🛡️

  • ねらい:現実のリトライ前提に強くなる
  • 学ぶ:重複排除、二重適用防止
  • ハンズオン:イベントIDで処理済み判定✅

第31章 Outbox入門(落とさないための基本)📮✅

  • ねらい:DB更新とイベント発行のズレを防ぐ
  • 学ぶ:Outboxの考え方(最小)
  • 演習:Outboxに「後で送る」を記録する設計を書く📝

第32章 Read最適化① 検索を速くする発想🔎🚀

  • ねらい:Read側を“表示向け”に育てる
  • 学ぶ:検索条件に合う形で持つ(並び替え、絞り込み)
  • ミニ演習:一覧に必要な項目だけ持つ✂️

第33章 Read最適化② 集計を速くする発想📊🚀

  • ねらい:集計はRead側の得意分野
  • 学ぶ:集計用ビュー、キャッシュの軽い考え方
  • AI活用🤖:集計指標案を出してもらう(過剰なら削る😆)

第34章 API設計(CommandとQueryの出入口)🌐🚪

  • ねらい:ルーティングで迷わない
  • 学ぶ:POST=Command、GET=Query の基本
  • ハンズオン:エンドポイントを一覧化して設計する🧾

第35章 フロント視点(Command後にどう画面更新する?)🖥️🔄

  • ねらい:UIが詰まらないようにする
  • 学ぶ:再取得 / 楽観更新 / 通知(3択)
  • 演習:学食アプリにどれが合うか選ぶ🎯

第36章 観測と復旧(ログ・相関ID・再投影)🧭🧰

  • ねらい:動かしたあと困らない設計
  • 学ぶ:相関ID、重要ログ、Read再構築の手順テンプレ
  • AI活用🤖:ログ項目の過不足チェック✅

第37章 ADR+卒業制作(完成条件3つでゴール!)🎉🏁

  • ねらい:やり切って“自分の型”にする

  • 完成条件✅

    1. Command 2本(注文/支払い)
    2. Query 2本(一覧/集計)
    3. 投影 1本(同期 or 非同期どちらか)
  • ADR:なぜこの方式にしたかを短文で残す📝✨

  • 次の一歩:Saga/イベントソーシングは「興味が出たら」でOK😊🚪