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

「ddd」タグのついた27記事

全てのタグを見る

CQRS と Event Sourcing: 読み書きを分ける設計と、履歴を正本にする設計

読み取りと書き込みでモデルを分ける CQRS と、状態でなくイベントの列を正本にする Event Sourcing を、実際に組むとテーブルとコードがどうなるかまで降ろします。イベントストアのテーブル設計、複合一意制約による並行制御、集約の再構成とスナップショット、プロジェクションが読んだ位置をどう覚えるかを扱います。

DDD の全体像: 戦略的設計と戦術的設計

DDD には「どこに線を引くか」を決める戦略的設計と、「線の内側をどう作るか」を決める戦術的設計の 2 つの層があります。この 2 つの関係、戦術パターンだけを導入したときに起きること、本ガイドがどの層をどこで扱うかを地図として示します。用語の定義は次章以降が担当します。

DDD の基本概念: ドメインオブジェクト・集約・リポジトリ

DDD の戦術的設計で使う中核用語を整理。ドメイン / ドメインオブジェクト / ドメインモデル / ビジネスルールという 4 語の定義、エンティティと値オブジェクトの違い、整合性の境界としての集約、永続化を抽象化するリポジトリの役割を具体例で解説します。

Laravel × DDD × クリーンアーキテクチャ実践ガイド

Laravel 未経験でも大丈夫。Vue/React など SPA 開発者を対象に、API バックエンドとしての Laravel とドメイン駆動設計 (DDD)・クリーンアーキテクチャをステップバイステップで解説する全 26 章のガイド。境界づけられたコンテキストとイベントストーミングによるモデリングから、値オブジェクト・エンティティ・集約・リポジトリ、Laravel プロジェクトでの実装パターン・トランザクション・テスト・認証、CQRS と Event Sourcing・メッセージングまでを網羅します。

Laravel での DDD アーキテクチャ: 4 層構成と依存性逆転

従来の Laravel MVC とクリーンアーキテクチャを比較し、プレゼンテーション / アプリケーション / ドメイン / インフラの 4 層構成、依存性逆転の原則 (DIP)、ディレクトリ構成、Eloquent Model とドメインエンティティの分離を解説します。

OOP と DDD の戦術パターン: 原則がどこに現れるか

値オブジェクト・集約・ドメインサービスを、オブジェクト指向の原則の側から読み直します。カプセル化・コンポジション・ポリモーフィズムがそれぞれどのパターンに現れ、DDD がそこに何を足しているかを対応づけます。原則そのものの解説は PHP クラス設計ガイドに委ねます。

イベントストーミング: 業務からモデルを見つけるワークショップ

業務の担当者と開発者が同じ壁の前に立ち、付箋で業務の流れを並べてドメインモデルを探すワークショップ手法。付箋の文法、Big Picture から Design-Level までの粒度、進め方の段階、そして出てきた付箋が値オブジェクト・集約・ユースケースのどこに落ちるかの対応を、EC の注文を題材に解説します。あわせて、業務を物語として描く Domain Storytelling にも触れます。

エラーハンドリング: ドメイン例外と HTTP ステータスの対応

DDD アーキテクチャでのエラーハンドリングを解説。集約ごとに整理した例外階層、DomainException の設計、Exception Handler での HTTP ステータス (404/409/422 など) へのマッピング、統一エラーレスポンス、Result 型パターン、ロギング戦略と機密情報の保護をまとめます。

テスト戦略: テストピラミッドと層別テスト

DDD アーキテクチャのテスト戦略を解説。テストピラミッド (Unit / Integration / Feature) の考え方、ドメイン層を DB なしで高速にテストする利点、モックの最小限利用、Arrange-Act-Assert、日本語テストメソッド名、テストデータビルダーパターンをまとめます。

ドメインイベント: 集約間の疎結合な連携

DDD のドメインイベント (Domain Event) を OrderConfirmed などの実装例で解説。イベント駆動による疎結合、記録 (Record) とディスパッチ (Dispatch) の 2 フェーズ実装、Laravel Events との統合、同期 / 非同期 (ShouldQueue)、冪等性と結果整合性の設計をまとめます。

ドメインサービス: エンティティに属さないビジネスロジック

DDD のドメインサービス (Domain Service) を割引計算・在庫引当・送料計算の実装例で解説。複数集約にまたがりインフラ非依存のロジックを配置する判断基準、ユースケース (アプリケーションサービス) との違い、貧血ドメインモデルを避ける設計指針をまとめます。

ドメインモデルとテーブル設計: マッピングとインデックス

ドメインモデル優先で設計する理由と、ドメインモデルとテーブルが 1:1 でない前提でのマッピングパターン (埋め込み / 1 集約複数テーブル / 技術的分割)、リポジトリによる差の吸収、複合インデックスの左端原則やトレードオフを含むインデックス設計をまとめます。

トランザクション管理: 整合性の境界をどこに置くか

Laravel の DB::transaction() を使ったトランザクション管理を解説。ACID 特性、1 集約は Repository 内・複数集約は UseCase 内という置き場所の使い分け、ネストしたトランザクション (Savepoint)、楽観的ロックと悲観的ロックの実装と使い分けをまとめます。

なぜ DDD か: Fat Controller / Fat Model の限界

従来の Laravel MVC で複雑なビジネスロジックを扱うと生じる Fat Controller・Fat Model・ロジック散在の問題を整理し、DDD を採用することで得られる「ビジネスルールの明確化・変更対応力・テスタビリティ・チームコミュニケーション」の 4 つのメリットを解説します。

はじめに: Laravel × DDD × クリーンアーキテクチャ実践ガイド

Vue/React など SPA 開発経験者に向けた Laravel での DDD・クリーンアーキテクチャ入門。本書で学べること、題材にする EC サイトの注文システム、想定する SPA + API アーキテクチャ、DDD とクリーンアーキテクチャの全体像と参照書籍を紹介します。

まとめと次のステップ: DDD の段階的導入

本ガイドの導入と全 6 部 (DDD の戦略的設計 / 戦術的設計 / クリーンアーキテクチャ / 実践テクニック / イベント駆動への発展 / 総合実践) の要点を整理し、値オブジェクト → ユースケース層 → リポジトリ → ドメインイベントという段階的導入のロードマップ、よくある質問、推奨書籍・コミュニティ・学習パスをまとめます。

メッセージングと pub/sub: プロセスをまたいでイベントを届ける

ドメインイベントを別のアプリケーションへ届けるために、あいだに立つメッセージブローカーが何を引き受けているかを、保持・分配・再配送・順序の 4 つに分けて見ます。Kafka・RabbitMQ・SQS で型が違う点、at-least-once を前提にした設計、保存と送信を 1 つのトランザクションに入れる Outbox パターンを扱います。

ユースケース層の設計: Command / Query 分離と DTO

アプリケーション層 (ユースケース層) の設計を解説。ドメインオブジェクトの調整・トランザクション管理・入出力変換の責務、CQS 原則による Command / Query 分離、Command オブジェクトと DTO、Query 専用サービス、単一責任などの設計指針をまとめます。

リポジトリパターン: ドメインと永続化の境界

リポジトリパターンを Laravel + Eloquent で実装。インターフェースをドメイン層に置く理由 (DIP / テスタビリティ)、1 集約 = 1 リポジトリ、エンティティと Eloquent Model のマッピング、N+1 問題と Eager Loading、Mass Assignment 対策、DI コンテナへの登録をまとめます。

実践:注文システムの実装: 全層を貫く実装例

これまで学んだ DDD・クリーンアーキテクチャを統合し、注文作成・確定 API を題材に 4 層 (プレゼンテーション / アプリケーション / ドメイン / インフラ) を実装。各層の責務、データ変換の流れ、層別テスト (ドメイン / UseCase / Repository) を通して全体像をまとめます。

戦略的設計: サブドメイン・ユビキタス言語・コンテキストマップ

ドメインのどこに線を引くかを決める戦略的設計を解説。事業をコア・支援・汎用のサブドメインに分ける見方、チームで同じ言葉を使うユビキタス言語、モデルが通用する範囲を区切る境界づけられたコンテキスト、境界どうしの関係を表すコンテキストマップと腐敗防止層を、Laravel プロジェクトでの線の引き方まで含めて扱います。

認証・認可設計: JWT と層別の責務分担

DDD とクリーンアーキテクチャでの認証 (Authentication) と認可 (Authorization) の設計を解説。認証と認可はプレゼンテーション層、ビジネスルールはドメイン層という責務分担、JWT の構造、Laravel × tymon/jwt-auth の実装、アクセス/リフレッシュトークン、ロールベース認可をまとめます。

集約: 整合性の境界と集約ルート

DDD の集約 (Aggregate) を Order 集約を題材に解説。集約ルートを唯一のアクセス起点とする理由、集約境界の決め方 (ライフサイクル / 整合性 / トランザクション / 参照)、即時整合性と結果整合性の使い分け、集約間は ID 参照、スナップショットの考え方をまとめます。