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側の入口
- ハンズオン:
PlaceOrderHandlerとGetOrderListQueryを作る✍️
第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)
- 学ぶ:
OrderRepositoryinterface の意味 - ハンズオン: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つでゴール!)🎉🏁
-
ねらい:やり切って“自分の型”にする
-
完成条件✅
- Command 2本(注文/支払い)
- Query 2本(一覧/集計)
- 投影 1本(同期 or 非同期どちらか)
-
ADR:なぜこの方式にしたかを短文で残す📝✨
-
次の一歩:Saga/イベントソーシングは「興味が出たら」でOK😊🚪