ドメイン駆動設計(DDD)は、ソフトウェアシステムの設計アプローチで、ドメインとそのロジックに焦点を当てます。DDDは、複雑なドメインを関連性のある独立したバウンデッドコンテキストに分割します。各コンテキストでは、ドメインエキスパートと合意された独自の言語(ユビキタス言語)が開発されます。DDDの主要な構成要素は以下の通りです:
バウンデッドコンテキストは多くの場合、明示的に定義されたAPIまたはイベントを介して相互作用する独立したマイクロサービスを表します。
Java(Spring)でのコード例:
// バリューオブジェクトの例 @Embeddable public class Address { private String city; private String street; // ... コンストラクタ、equals、hashCode } // アグリゲートルートを持つエンティティの例 @Entity public class Order { @Id private Long id; @Embedded private Address deliveryAddress; // ... ビジネスロジック }
主な特徴:
DDDのすべてのオブジェクトはエンティティですか?
いいえ、バリューオブジェクトも存在します。これらはユニーク性を持たず、その状態がアイデンティティを完全に定義します。
Address a1 = new Address("モスクワ", "アルバート"); Address a2 = new Address("モスクワ", "アルバート"); System.out.println(a1.equals(a2)); // true
マイクロサービスに分割することはDDDの適用を意味しますか?
いいえ、モノリシックアプリケーション内でもDDDを適用し、内部のコンテキストの境界を形成することができます。
各アグリゲートにリポジトリは常に必要ですか?
通常は必要ですが、アグリゲートが別のビジネストランザクションのルートでない場合、他のアグリゲートの一部として完全に保持できることもあります。