<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>DDD on 設計で、迷わなくなるために | 奥田智紘</title><link>https://design.okuda-studio.com/tags/ddd/</link><description>Recent content in DDD on 設計で、迷わなくなるために | 奥田智紘</description><generator>Hugo -- 0.159.2</generator><language>ja</language><lastBuildDate>Wed, 18 Mar 2026 11:00:00 +0900</lastBuildDate><atom:link href="https://design.okuda-studio.com/tags/ddd/index.xml" rel="self" type="application/rss+xml"/><item><title>ワイヤーフレームからドメイン設計が進んだ話</title><link>https://design.okuda-studio.com/posts/0020-wireframe-with-ddd/</link><pubDate>Wed, 18 Mar 2026 11:00:00 +0900</pubDate><guid>https://design.okuda-studio.com/posts/0020-wireframe-with-ddd/</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB"&gt;はじめに&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E8%A8%AD%E8%A8%88%E3%81%A0%E3%81%91%E3%81%A7%E3%81%AF%E5%9F%8B%E3%81%BE%E3%82%89%E3%81%AA%E3%81%84%E9%81%95%E5%92%8C%E6%84%9F"&gt;ドメイン設計だけでは埋まらない違和感&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%83%AF%E3%82%A4%E3%83%A4%E3%83%BC%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%82%92%E4%BD%9C%E3%81%A3%E3%81%A6%E8%B5%B7%E3%81%8D%E3%81%9F%E5%A4%89%E5%8C%96"&gt;ワイヤーフレームを作って起きた変化&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#1-%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%81%AE%E8%A1%8C%E5%8B%95%E3%81%8C%E5%85%B7%E4%BD%93%E5%8C%96%E3%81%95%E3%82%8C%E3%82%8B"&gt;1. ユーザーの行動が具体化される&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#2-%E5%BF%85%E8%A6%81%E3%81%AA%E3%83%87%E3%83%BC%E3%82%BF%E3%81%A8%E5%88%B6%E7%B4%84%E3%81%8C%E8%A6%8B%E3%81%88%E3%81%A6%E3%81%8F%E3%82%8B"&gt;2. 必要なデータと制約が見えてくる&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#3-%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E8%A8%AD%E8%A8%88%E3%81%AE%E6%8A%9C%E3%81%91%E3%81%8C%E9%9C%B2%E5%87%BA%E3%81%99%E3%82%8B"&gt;3. ドメイン設計の「抜け」が露出する&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%83%AF%E3%82%A4%E3%83%A4%E3%83%BC%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%81%AF%E8%A6%8B%E3%81%9F%E7%9B%AE%E3%81%AE%E3%81%9F%E3%82%81%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%84"&gt;ワイヤーフレームは見た目のためではない&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%81%BE%E3%81%A8%E3%82%81"&gt;まとめ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%81%8A%E3%82%8F%E3%82%8A%E3%81%AB"&gt;おわりに&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;
&lt;p&gt;最近、アプリ開発の中で「ワイヤーフレーム」を使い始めたところ、思いがけずドメイン設計が大きく前進しました。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;ワイヤーフレームとは、 Figma などを使って作る UI デザインの一種です。&lt;br&gt;
ただし、色やフォントサイズなどの細かい UI にはこだわりません。&lt;br&gt;
ボタンや入力欄であることがわかれば良いという程度のラフな UI デザインのことを言います。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;もともとドメイン駆動で設計を進めていたのですが、どうしても「抜け」や「曖昧さ」が残る感覚があり、手応えが弱い状態が続いていました。&lt;/p&gt;
&lt;p&gt;しかし、ワイヤーフレームを作り始めたことで、その状況が一変しました。&lt;/p&gt;
&lt;p&gt;この記事では、
&lt;strong&gt;ワイヤーフレームがどのようにドメイン設計を補完し、加速させたのか&lt;/strong&gt;を整理してみます。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="ドメイン設計だけでは埋まらない違和感"&gt;ドメイン設計だけでは埋まらない違和感&lt;/h2&gt;
&lt;p&gt;ドメイン設計を進めていると、以下のような状態に陥ることがありました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ユースケースはある程度整理されている&lt;/li&gt;
&lt;li&gt;エンティティや値オブジェクトも定義できている&lt;/li&gt;
&lt;li&gt;しかし「本当にこれで使えるのか？」という違和感がある&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;つまり、&lt;strong&gt;構造はあるが、実感がない状態&lt;/strong&gt;です。&lt;/p&gt;
&lt;p&gt;このとき不足していたのは、「ユーザーがどう操作するか」という視点でした。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="ワイヤーフレームを作って起きた変化"&gt;ワイヤーフレームを作って起きた変化&lt;/h2&gt;
&lt;p&gt;試しにワイヤーフレームを作り始めたところ、明確な変化がありました。&lt;/p&gt;
&lt;h3 id="1-ユーザーの行動が具体化される"&gt;1. ユーザーの行動が具体化される&lt;/h3&gt;
&lt;p&gt;ワイヤーフレームでは「画面上で何をするか」を考える必要があります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;どこで入力するのか&lt;/li&gt;
&lt;li&gt;どの順番で操作するのか&lt;/li&gt;
&lt;li&gt;何を確定とみなすのか&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;これにより、ユースケースが単なる文章ではなく、&lt;strong&gt;操作として具体化&lt;/strong&gt;されました。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="2-必要なデータと制約が見えてくる"&gt;2. 必要なデータと制約が見えてくる&lt;/h3&gt;
&lt;p&gt;操作を具体的にすると、自然と以下が見えてきます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;この画面では何のデータが必要か&lt;/li&gt;
&lt;li&gt;この操作はどんな条件で許されるのか&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ここで重要なのが、 &lt;strong&gt;不変条件（インバリアント）&lt;/strong&gt; です。&lt;/p&gt;
&lt;p&gt;例えば、口座振替管理アプリなら、&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;支払い元は必ず 1 つである&lt;/li&gt;
&lt;li&gt;振替は「元 → 先」の関係を持つ&lt;/li&gt;
&lt;li&gt;不正な組み合わせは作れない&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;など、これらはドメイン設計だけでも定義できますが、
ワイヤーフレーム上で「操作」として考えることで、一気に現実味を帯びます。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="3-ドメイン設計の抜けが露出する"&gt;3. ドメイン設計の「抜け」が露出する&lt;/h3&gt;
&lt;p&gt;ワイヤーフレームを作る中で、次のような気づきが頻発しました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;この状態、どうやって作る？&lt;/li&gt;
&lt;li&gt;この操作、どのユースケースに対応する？&lt;/li&gt;
&lt;li&gt;このデータ、どこに属する？&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;つまり、&lt;strong&gt;ドメイン設計で曖昧だった部分が強制的に表に出てくる&lt;/strong&gt;のです。&lt;/p&gt;</description></item><item><title>DDDで「集約はIDで参照する」とはどういう意味か</title><link>https://design.okuda-studio.com/posts/0019-reference-by-id/</link><pubDate>Thu, 12 Mar 2026 19:00:00 +0900</pubDate><guid>https://design.okuda-studio.com/posts/0019-reference-by-id/</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="#%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E5%8F%82%E7%85%A7%E3%81%AE%E5%A0%B4%E5%90%88"&gt;オブジェクト参照の場合&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#order"&gt;Order&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#user"&gt;User&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9"&gt;アプリケーションサービス&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#id%E5%8F%82%E7%85%A7%E3%81%AE%E5%A0%B4%E5%90%88"&gt;ID参照の場合&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#order-1"&gt;Order&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#user-1"&gt;User&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9-1"&gt;アプリケーションサービス&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E9%81%95%E3%81%84%E3%82%92%E6%95%B4%E7%90%86"&gt;違いを整理&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E5%8F%82%E7%85%A7"&gt;オブジェクト参照&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#id%E5%8F%82%E7%85%A7"&gt;ID参照&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%82%82%E3%81%86%E4%B8%80%E3%81%A4%E9%87%8D%E8%A6%81%E3%81%AA%E9%81%95%E3%81%84%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E9%A7%86%E5%8B%95%E3%81%AB%E6%8B%A1%E5%BC%B5%E3%81%A7%E3%81%8D%E3%82%8B"&gt;もう一つ重要な違い：イベント駆動に拡張できる&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#application-service"&gt;Application Service&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E3%81%AE%E5%AE%9A%E7%BE%A9"&gt;イベントの定義&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#eventbus%E3%81%AE%E7%B0%A1%E6%98%93%E5%AE%9F%E8%A3%85"&gt;EventBusの簡易実装&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E3%83%8F%E3%83%B3%E3%83%89%E3%83%A9"&gt;イベントハンドラ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%83%8F%E3%83%B3%E3%83%89%E3%83%A9%E7%99%BB%E9%8C%B2"&gt;ハンドラ登録&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E3%81%AE%E6%B5%81%E3%82%8C"&gt;イベントの流れ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%81%BE%E3%81%A8%E3%82%81"&gt;まとめ&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;ドメイン駆動設計（DDD）では、次のようなルールをよく目にします。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;集約は他の集約を &lt;strong&gt;IDで参照する&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;しかし、初めてこのルールを見たときに疑問が浮かびます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ID参照にしても結局 &lt;code&gt;Repository.find(id)&lt;/code&gt; で取得できるのでは？&lt;/li&gt;
&lt;li&gt;それなら普通のオブジェクト参照とあまり変わらないのでは？&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;この記事では、このルールの意味を &lt;strong&gt;実際のコードで比較しながら&lt;/strong&gt;説明します。&lt;/p&gt;
&lt;hr&gt;
&lt;h1 id="オブジェクト参照の場合"&gt;オブジェクト参照の場合&lt;/h1&gt;
&lt;p&gt;まず、他の集約を &lt;strong&gt;オブジェクトとして直接持つ設計&lt;/strong&gt;を見てみます。&lt;/p&gt;
&lt;h2 id="order"&gt;Order&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-kotlin" data-lang="kotlin"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Order&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;val&lt;/span&gt; id: OrderId,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;val&lt;/span&gt; user: User
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;fun&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;place&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 注文処理
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; user.upgradeToPremium()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;tips : place という単語には、 注文を出す / 発注する という意味があります。&lt;/p&gt;
&lt;h2 id="user"&gt;User&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-kotlin" data-lang="kotlin"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;User&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;val&lt;/span&gt; id: UserId,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; plan: Plan
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;fun&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;upgradeToPremium&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; plan = &lt;span style="color:#a6e22e"&gt;Plan&lt;/span&gt;.PREMIUM
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="アプリケーションサービス"&gt;アプリケーションサービス&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-kotlin" data-lang="kotlin"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;fun&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;placeOrder&lt;/span&gt;(orderId: OrderId) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;val&lt;/span&gt; order = orderRepository.find(orderId)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; order.place()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; orderRepository.save(order)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ここで起きていることを図にすると次のようになります。&lt;/p&gt;</description></item><item><title>一つの集約にまとめるべきか、別の集約に分けるべきかの判断基準（DDD）</title><link>https://design.okuda-studio.com/posts/0018-aggregation-separation/</link><pubDate>Thu, 12 Mar 2026 18:00:00 +0900</pubDate><guid>https://design.okuda-studio.com/posts/0018-aggregation-separation/</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="#1-%E4%B8%8D%E5%A4%89%E6%9D%A1%E4%BB%B6%E3%82%92%E5%90%8C%E6%99%82%E3%81%AB%E5%AE%88%E3%82%8B%E5%BF%85%E8%A6%81%E3%81%8C%E3%81%82%E3%82%8B%E3%81%8B%E6%9C%80%E9%87%8D%E8%A6%81"&gt;1. 不変条件を同時に守る必要があるか（最重要）&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#%E4%BE%8B"&gt;例&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E5%88%A5%E9%9B%86%E7%B4%84%E3%81%AB%E3%81%AA%E3%82%8B%E4%BE%8B"&gt;別集約になる例&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#2-%E3%83%A9%E3%82%A4%E3%83%95%E3%82%B5%E3%82%A4%E3%82%AF%E3%83%AB%E3%81%8C%E4%B8%80%E7%B7%92%E3%81%8B"&gt;2. ライフサイクルが一緒か&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#%E4%BE%8B-1"&gt;例&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E5%88%A5%E9%9B%86%E7%B4%84%E3%81%AE%E4%BE%8B"&gt;別集約の例&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#3-%E9%9B%86%E7%B4%84%E3%81%AF%E4%BB%96%E3%81%AE%E9%9B%86%E7%B4%84%E3%82%92id%E3%81%A7%E5%8F%82%E7%85%A7%E3%81%99%E3%82%8B"&gt;3. 集約は他の集約をIDで参照する&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#4-%E5%90%8C%E6%99%82%E3%81%AB%E6%9B%B4%E6%96%B0%E3%81%95%E3%82%8C%E3%82%8B%E3%81%8B"&gt;4. 同時に更新されるか&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#%E4%BE%8B-2"&gt;例&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#5-%E9%9B%86%E7%B4%84%E3%81%AF%E5%B0%8F%E3%81%95%E3%81%8F%E4%BF%9D%E3%81%A4"&gt;5. 集約は小さく保つ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%81%BE%E3%81%A8%E3%82%81"&gt;まとめ&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;ドメイン駆動設計（DDD）で設計をしていると、次のような疑問に必ずぶつかります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;このエンティティは同じ集約に入れるべきか？&lt;/li&gt;
&lt;li&gt;それとも別の集約として切り離すべきか？&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;集約の境界は、DDDにおいて非常に重要な設計判断です。
この記事では、実務でよく使われる判断基準を整理します。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="1-不変条件を同時に守る必要があるか最重要"&gt;1. 不変条件を同時に守る必要があるか（最重要）&lt;/h2&gt;
&lt;p&gt;最も重要な基準は &lt;strong&gt;不変条件（Invariant）&lt;/strong&gt; です。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;「このルールは常に同時に成立している必要があるか？」&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;YESなら &lt;strong&gt;同じ集約&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;NOなら &lt;strong&gt;別集約&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="例"&gt;例&lt;/h3&gt;
&lt;p&gt;注文と注文明細&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Order
└ OrderItem
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;不変条件&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;注文の合計金額 = 各注文金額の合計&lt;/li&gt;
&lt;li&gt;注文明細の数量 ≥ 1&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;数量が変われば、注文全体の合計金額は変わります。
つまり、これらは &lt;strong&gt;常に同時に成立している必要&lt;/strong&gt;があります。
そのため &lt;code&gt;Order&lt;/code&gt; と &lt;code&gt;OrderItem&lt;/code&gt; は &lt;strong&gt;同じ集約&lt;/strong&gt;になります。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="別集約になる例"&gt;別集約になる例&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Order
Inventory (在庫)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;ルール&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;注文が確定したら在庫を減らす
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;この処理は&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;注文確定&lt;/li&gt;
&lt;li&gt;在庫更新&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;の2つの処理に分かれます。&lt;/p&gt;
&lt;p&gt;これらは &lt;strong&gt;同時トランザクションでなくても問題ない&lt;/strong&gt;ため&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Order集約
Inventory集約
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;と分けます。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="2-ライフサイクルが一緒か"&gt;2. ライフサイクルが一緒か&lt;/h2&gt;
&lt;p&gt;次に考えるのは &lt;strong&gt;ライフサイクル&lt;/strong&gt;です。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;「一緒に生まれて一緒に消えるか？」&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;YES → 同じ集約&lt;/li&gt;
&lt;li&gt;NO → 別集約&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="例-1"&gt;例&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Order
└ OrderItem
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;OrderItem&lt;/code&gt; は&lt;/p&gt;</description></item><item><title>ドメイン設計テンプレート</title><link>https://design.okuda-studio.com/posts/0016-ddd-practice-template/</link><pubDate>Wed, 11 Mar 2026 10:00:00 +0900</pubDate><guid>https://design.okuda-studio.com/posts/0016-ddd-practice-template/</guid><description>&lt;p&gt;このドキュメントは、DDD（ドメイン駆動設計）に基づいて、ソフトウェアを設計するためのテンプレートです。&lt;/p&gt;
&lt;p&gt;上から順番にテンプレートを埋めていくことで、 DDD に基づいたドメイン周りの設計がスムーズに行えるように作っています。&lt;/p&gt;
&lt;hr&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#1-%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E6%A6%82%E8%A6%81"&gt;1. システム概要&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%81%AE%E7%9B%AE%E7%9A%84"&gt;システムの目的&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E5%AF%BE%E8%B1%A1%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC"&gt;対象ユーザー&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E8%A7%A3%E6%B1%BA%E3%81%97%E3%81%9F%E3%81%84%E8%AA%B2%E9%A1%8C"&gt;解決したい課題&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#2-%E3%83%A6%E3%83%BC%E3%82%B9%E3%82%B1%E3%83%BC%E3%82%B9"&gt;2. ユースケース&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#%E3%83%A6%E3%83%BC%E3%82%B9%E3%82%B1%E3%83%BC%E3%82%B9%E4%B8%80%E8%A6%A7"&gt;ユースケース一覧&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%83%A6%E3%83%BC%E3%82%B9%E3%82%B1%E3%83%BC%E3%82%B9%E8%A9%B3%E7%B4%B0"&gt;ユースケース詳細&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E4%BE%8B%E6%8C%AF%E6%9B%BF%E9%96%A2%E4%BF%82%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B"&gt;【例】振替関係を作成する&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#%E5%85%A5%E5%8A%9B"&gt;入力&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E5%87%A6%E7%90%86%E6%A6%82%E8%A6%81"&gt;処理概要&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E5%87%BA%E5%8A%9B"&gt;出力&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#3-%E3%83%A6%E3%83%93%E3%82%AD%E3%82%BF%E3%82%B9%E8%A8%80%E8%AA%9E"&gt;3. ユビキタス言語&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#%E6%A6%82%E5%BF%B5"&gt;概念&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E5%80%99%E8%A3%9C%E3%81%A8%E3%81%9D%E3%81%AE%E8%A8%80%E8%91%89%E3%81%AE%E3%82%A4%E3%83%A1%E3%83%BC%E3%82%B8"&gt;候補とその言葉のイメージ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E8%B3%9B%E5%90%A6%E3%81%AE%E6%84%8F%E8%A6%8B"&gt;賛否の意見&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E8%A8%80%E8%91%89%E3%81%AE%E6%B1%BA%E5%AE%9A%E3%81%A8%E3%81%9D%E3%81%AE%E6%8E%A1%E7%94%A8%E7%90%86%E7%94%B1"&gt;言葉の決定とその採用理由&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%83%A6%E3%83%93%E3%82%AD%E3%82%BF%E3%82%B9%E8%A8%80%E8%AA%9E%E8%BE%9E%E6%9B%B8"&gt;ユビキタス言語辞書&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#4-%E3%82%A8%E3%83%B3%E3%83%86%E3%82%A3%E3%83%86%E3%82%A3%E5%80%99%E8%A3%9C"&gt;4. エンティティ候補&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#5-%E4%B8%8D%E5%A4%89%E6%9D%A1%E4%BB%B6invariant"&gt;5. 不変条件（Invariant）&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#6-%E7%8A%B6%E6%85%8B%E9%81%B7%E7%A7%BB"&gt;6. 状態遷移&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#%E4%BE%8Btransferrelation"&gt;【例】TransferRelation&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#%E7%8A%B6%E6%85%8B"&gt;状態&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E7%8A%B6%E6%85%8B%E9%81%B7%E7%A7%BB"&gt;状態遷移&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#7-%E9%9B%86%E7%B4%84%E8%A8%AD%E8%A8%88"&gt;7. 集約設計&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#%E9%9B%86%E7%B4%84%E4%B8%80%E8%A6%A7"&gt;集約一覧&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E9%9B%86%E7%B4%84%E8%A9%B3%E7%B4%B0"&gt;集約詳細&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E4%BE%8Btransferrelation-1"&gt;【例】TransferRelation&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#%E5%B1%9E%E6%80%A7"&gt;属性&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E4%B8%8D%E5%A4%89%E6%9D%A1%E4%BB%B6"&gt;不変条件&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89"&gt;ドメインメソッド&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#8-%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9"&gt;8. ドメインサービス&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E4%B8%80%E8%A6%A7"&gt;サービス一覧&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E8%A9%B3%E7%B4%B0"&gt;サービス詳細&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E4%BE%8Btransferservice"&gt;【例】TransferService&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#9-%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA"&gt;9. リポジトリ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#10-%E3%83%A6%E3%83%BC%E3%82%B9%E3%82%B1%E3%83%BC%E3%82%B9%E8%A8%AD%E8%A8%88"&gt;10. ユースケース設計&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#usecase%E4%B8%80%E8%A6%A7"&gt;UseCase一覧&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#usecase%E8%A9%B3%E7%B4%B0"&gt;UseCase詳細&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E4%BE%8Bcreatetransferrelationusecase"&gt;【例】CreateTransferRelationUseCase&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#%E5%87%A6%E7%90%86"&gt;処理&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="1-システム概要"&gt;1. システム概要&lt;/h1&gt;
&lt;h2 id="システムの目的"&gt;システムの目的&lt;/h2&gt;
&lt;p&gt;このシステムは何を解決するものか。&lt;/p&gt;
&lt;p&gt;【例】&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;フリーランスの固定費を管理する&lt;/li&gt;
&lt;li&gt;口座振替の関係を可視化する&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="対象ユーザー"&gt;対象ユーザー&lt;/h2&gt;
&lt;p&gt;このシステムのユーザー。&lt;/p&gt;
&lt;p&gt;【例】&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;個人&lt;/li&gt;
&lt;li&gt;フリーランス&lt;/li&gt;
&lt;li&gt;企業&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="解決したい課題"&gt;解決したい課題&lt;/h2&gt;
&lt;p&gt;【例】&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;固定費の支払い関係が分かりにくい&lt;/li&gt;
&lt;li&gt;口座振替の全体構造を把握できない&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h1 id="2-ユースケース"&gt;2. ユースケース&lt;/h1&gt;
&lt;p&gt;ユーザーがシステムで行う操作を列挙する。&lt;/p&gt;</description></item><item><title>ドメイン設計テンプレート（補強版）</title><link>https://design.okuda-studio.com/posts/0017-ddd-practice-template2/</link><pubDate>Wed, 11 Mar 2026 10:00:00 +0900</pubDate><guid>https://design.okuda-studio.com/posts/0017-ddd-practice-template2/</guid><description>&lt;p&gt;このドキュメントは、 &lt;a href="https://design.okuda-studio.com/posts/0016-ddd-practice-template/"&gt;ドメイン設計テンプレート&lt;/a&gt; に以下の項目を加えた補強版となっています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;4.境界コンテキスト&lt;/li&gt;
&lt;li&gt;5.コンテキストマップ&lt;/li&gt;
&lt;li&gt;7.値オブジェクト&lt;/li&gt;
&lt;li&gt;12.ドメインイベント&lt;/li&gt;
&lt;li&gt;15.集約境界図&lt;/li&gt;
&lt;li&gt;16.不変条件の責任&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#1-%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E6%A6%82%E8%A6%81"&gt;1. システム概要&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%81%AE%E7%9B%AE%E7%9A%84"&gt;システムの目的&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E5%AF%BE%E8%B1%A1%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC"&gt;対象ユーザー&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E8%A7%A3%E6%B1%BA%E3%81%97%E3%81%9F%E3%81%84%E8%AA%B2%E9%A1%8C"&gt;解決したい課題&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#2-%E3%83%A6%E3%83%BC%E3%82%B9%E3%82%B1%E3%83%BC%E3%82%B9"&gt;2. ユースケース&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#%E3%83%A6%E3%83%BC%E3%82%B9%E3%82%B1%E3%83%BC%E3%82%B9%E4%B8%80%E8%A6%A7"&gt;ユースケース一覧&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%83%A6%E3%83%BC%E3%82%B9%E3%82%B1%E3%83%BC%E3%82%B9%E8%A9%B3%E7%B4%B0"&gt;ユースケース詳細&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E4%BE%8B%E6%8C%AF%E6%9B%BF%E9%96%A2%E4%BF%82%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B"&gt;【例】振替関係を作成する&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#%E5%85%A5%E5%8A%9B"&gt;入力&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E5%87%A6%E7%90%86%E6%A6%82%E8%A6%81"&gt;処理概要&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E5%87%BA%E5%8A%9B"&gt;出力&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#3-%E3%83%A6%E3%83%93%E3%82%AD%E3%82%BF%E3%82%B9%E8%A8%80%E8%AA%9E"&gt;3. ユビキタス言語&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#%E6%A6%82%E5%BF%B5"&gt;概念&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E5%80%99%E8%A3%9C%E3%81%A8%E3%81%9D%E3%81%AE%E8%A8%80%E8%91%89%E3%81%AE%E3%82%A4%E3%83%A1%E3%83%BC%E3%82%B8"&gt;候補とその言葉のイメージ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E8%B3%9B%E5%90%A6%E3%81%AE%E6%84%8F%E8%A6%8B"&gt;賛否の意見&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E8%A8%80%E8%91%89%E3%81%AE%E6%B1%BA%E5%AE%9A%E3%81%A8%E3%81%9D%E3%81%AE%E6%8E%A1%E7%94%A8%E7%90%86%E7%94%B1"&gt;言葉の決定とその採用理由&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%83%A6%E3%83%93%E3%82%AD%E3%82%BF%E3%82%B9%E8%A8%80%E8%AA%9E%E8%BE%9E%E6%9B%B8"&gt;ユビキタス言語辞書&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#4-%E5%A2%83%E7%95%8C%E3%82%B3%E3%83%B3%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88"&gt;4. 境界コンテキスト&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#5-%E3%82%B3%E3%83%B3%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%83%9E%E3%83%83%E3%83%97"&gt;5. コンテキストマップ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#6-%E3%82%A8%E3%83%B3%E3%83%86%E3%82%A3%E3%83%86%E3%82%A3%E5%80%99%E8%A3%9C"&gt;6. エンティティ候補&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#7-%E5%80%A4%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88"&gt;7. 値オブジェクト&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#8-%E4%B8%8D%E5%A4%89%E6%9D%A1%E4%BB%B6invariant"&gt;8. 不変条件（Invariant）&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#9-%E7%8A%B6%E6%85%8B%E9%81%B7%E7%A7%BB"&gt;9. 状態遷移&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#%E4%BE%8Btransferrelation"&gt;【例】TransferRelation&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#%E7%8A%B6%E6%85%8B"&gt;状態&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E7%8A%B6%E6%85%8B%E9%81%B7%E7%A7%BB"&gt;状態遷移&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#10-%E9%9B%86%E7%B4%84%E8%A8%AD%E8%A8%88"&gt;10. 集約設計&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#%E9%9B%86%E7%B4%84%E4%B8%80%E8%A6%A7"&gt;集約一覧&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E9%9B%86%E7%B4%84%E8%A9%B3%E7%B4%B0"&gt;集約詳細&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E4%BE%8Btransferrelation-1"&gt;【例】TransferRelation&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#%E5%B1%9E%E6%80%A7"&gt;属性&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E4%B8%8D%E5%A4%89%E6%9D%A1%E4%BB%B6"&gt;不変条件&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89"&gt;ドメインメソッド&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#11-%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9"&gt;11. ドメインサービス&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E4%B8%80%E8%A6%A7"&gt;サービス一覧&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E8%A9%B3%E7%B4%B0"&gt;サービス詳細&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E4%BE%8Btransferservice"&gt;【例】TransferService&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#12-%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88"&gt;12. ドメインイベント&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E8%A9%B3%E7%B4%B0"&gt;イベント詳細&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#%E4%BE%8Btransferrelationcreated"&gt;【例】TransferRelationCreated&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#%E7%99%BA%E7%94%9F%E3%82%BF%E3%82%A4%E3%83%9F%E3%83%B3%E3%82%B0"&gt;発生タイミング&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%83%9A%E3%82%A4%E3%83%AD%E3%83%BC%E3%83%89"&gt;ペイロード&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#13-%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA"&gt;13. リポジトリ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#14-%E3%83%A6%E3%83%BC%E3%82%B9%E3%82%B1%E3%83%BC%E3%82%B9%E8%A8%AD%E8%A8%88"&gt;14. ユースケース設計&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#usecase%E4%B8%80%E8%A6%A7"&gt;UseCase一覧&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#usecase%E8%A9%B3%E7%B4%B0"&gt;UseCase詳細&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E4%BE%8Bcreatetransferrelationusecase"&gt;【例】CreateTransferRelationUseCase&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#%E5%87%A6%E7%90%86"&gt;処理&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#15-%E9%9B%86%E7%B4%84%E5%A2%83%E7%95%8C%E5%9B%B3aggregate-boundary"&gt;15. 集約境界図（Aggregate Boundary）&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#%E4%BE%8Btransferrelation-2"&gt;【例】TransferRelation&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#%E9%9B%86%E7%B4%84%E5%90%8D--aggregate-root"&gt;集約名 / Aggregate Root&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E5%86%85%E9%83%A8%E3%82%A8%E3%83%B3%E3%83%86%E3%82%A3%E3%83%86%E3%82%A3"&gt;内部エンティティ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E5%80%A4%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88"&gt;値オブジェクト&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E9%9B%86%E7%B4%84%E5%A2%83%E7%95%8C"&gt;集約境界&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E5%A4%96%E9%83%A8%E5%8F%82%E7%85%A7"&gt;外部参照&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E9%9B%86%E7%B4%84%E3%83%AB%E3%83%BC%E3%83%AB"&gt;集約ルール&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#16-%E4%B8%8D%E5%A4%89%E6%9D%A1%E4%BB%B6%E3%81%AE%E8%B2%AC%E4%BB%BBinvariant-responsibility"&gt;16. 不変条件の責任（Invariant Responsibility）&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#%E4%B8%8D%E5%A4%89%E6%9D%A1%E4%BB%B6%E4%B8%80%E8%A6%A7"&gt;不変条件一覧&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E4%B8%8D%E5%A4%89%E6%9D%A1%E4%BB%B6%E3%81%AE%E8%B2%AC%E4%BB%BB"&gt;不変条件の責任&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#%E6%8C%AF%E6%9B%BF%E6%97%A5%E3%81%AF131"&gt;振替日は1〜31&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E5%90%8C%E3%81%98%E5%8F%A3%E5%BA%A7--%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%81%AE%E6%8C%AF%E6%9B%BF%E9%96%A2%E4%BF%82%E3%81%AF1%E3%81%A4%E3%81%A0%E3%81%91"&gt;同じ口座 + サービスの振替関係は1つだけ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E6%8C%AF%E6%9B%BF%E9%96%A2%E4%BF%82%E3%81%AF%E5%BF%85%E3%81%9A%E5%8F%A3%E5%BA%A7%E3%82%92%E6%8C%81%E3%81%A4"&gt;振替関係は必ず口座を持つ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E6%8C%AF%E6%9B%BF%E9%96%A2%E4%BF%82%E3%81%AF%E5%BF%85%E3%81%9A%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%82%92%E6%8C%81%E3%81%A4"&gt;振替関係は必ずサービスを持つ&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E4%B8%8D%E5%A4%89%E6%9D%A1%E4%BB%B6%E3%81%AE%E9%85%8D%E7%BD%AE%E3%83%AB%E3%83%BC%E3%83%AB"&gt;不変条件の配置ルール&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E4%BE%8B"&gt;例&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="1-システム概要"&gt;1. システム概要&lt;/h1&gt;
&lt;h2 id="システムの目的"&gt;システムの目的&lt;/h2&gt;
&lt;p&gt;このシステムは何を解決するものか。&lt;/p&gt;</description></item><item><title>DDDにおける「集約」「ドメインサービス」「ユースケース」の違い</title><link>https://design.okuda-studio.com/posts/0015-aggregate-domain-service-usecase/</link><pubDate>Tue, 10 Mar 2026 16:00:00 +0900</pubDate><guid>https://design.okuda-studio.com/posts/0015-aggregate-domain-service-usecase/</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="#ddd%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E9%9B%86%E7%B4%84%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%83%A6%E3%83%BC%E3%82%B9%E3%82%B1%E3%83%BC%E3%82%B9%E3%81%AE%E9%81%95%E3%81%84"&gt;DDDにおける「集約」「ドメインサービス」「ユースケース」の違い&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%81%BE%E3%81%9A%E7%B5%90%E8%AB%96"&gt;まず結論&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E9%9B%86%E7%B4%84aggregate"&gt;集約（Aggregate）&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9"&gt;ドメインサービス&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%83%A6%E3%83%BC%E3%82%B9%E3%82%B1%E3%83%BC%E3%82%B9application-service"&gt;ユースケース（Application Service）&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%AD%E3%82%B8%E3%83%83%E3%82%AF%E3%82%92%E3%81%A9%E3%81%93%E3%81%AB%E7%BD%AE%E3%81%8F%E3%81%8B"&gt;ドメインロジックをどこに置くか&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E7%8A%B6%E6%85%8B%E3%82%92%E6%8C%81%E3%81%A4%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%81%AF%E3%81%A9%E3%81%86%E3%81%AA%E3%82%8B%E3%81%8B"&gt;状態を持つドメインサービスはどうなるか&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#%E3%82%B1%E3%83%BC%E3%82%B91%E6%96%B0%E3%81%97%E3%81%84%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E6%A6%82%E5%BF%B5%E3%81%8C%E7%94%9F%E3%81%BE%E3%82%8C%E3%81%9F"&gt;ケース1：新しいドメイン概念が生まれた&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%82%B1%E3%83%BC%E3%82%B92%E4%B8%80%E6%99%82%E7%9A%84%E3%81%AA%E5%87%A6%E7%90%86%E7%8A%B6%E6%85%8B"&gt;ケース2：一時的な処理状態&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E5%88%A4%E6%96%AD%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E8%B3%AA%E5%95%8F"&gt;判断のための質問&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%82%88%E3%81%8F%E3%81%82%E3%82%8B%E5%A4%B1%E6%95%97"&gt;よくある失敗&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%81%BE%E3%81%A8%E3%82%81"&gt;まとめ&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="dddにおける集約ドメインサービスユースケースの違い"&gt;DDDにおける「集約」「ドメインサービス」「ユースケース」の違い&lt;/h2&gt;
&lt;p&gt;DDD（ドメイン駆動設計）を学び始めると、多くの人が次の疑問にぶつかります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;集約とドメインサービスは何が違うのか&lt;/li&gt;
&lt;li&gt;ユースケースはどこまで責任を持つのか&lt;/li&gt;
&lt;li&gt;ドメインロジックはどこに書くべきなのか&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;この記事では、この3つの概念を整理しながら、&lt;strong&gt;ドメインロジックをどこに置くべきかの判断基準&lt;/strong&gt;を解説します。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="まず結論"&gt;まず結論&lt;/h2&gt;
&lt;p&gt;3つの役割は次のように整理できます。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;集約（Aggregate）&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ドメインの状態を持つ&lt;/li&gt;
&lt;li&gt;不変条件を守る&lt;/li&gt;
&lt;li&gt;ドメインモデルの中心&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;ドメインサービス（Domain Service）&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;エンティティに属さないドメインロジック&lt;/li&gt;
&lt;li&gt;複数の集約にまたがる処理&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;ユースケース（Use Case / Application Service）&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ユーザー操作を実現する手順&lt;/li&gt;
&lt;li&gt;ドメインモデルを組み合わせる&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;依存関係は次のようになります。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;UI
↓
UseCase
↓
DomainService
↓
Aggregate
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;重要なルールは &lt;strong&gt;内側の層は外側を知らないこと&lt;/strong&gt; です。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="集約aggregate"&gt;集約（Aggregate）&lt;/h2&gt;
&lt;p&gt;集約は &lt;strong&gt;状態と不変条件を守るドメインモデル&lt;/strong&gt; です。&lt;/p&gt;
&lt;p&gt;例として「口座振替」を考えます。&lt;/p&gt;
&lt;p&gt;振替関係には次のルールがあります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;振替日は 1〜31&lt;/li&gt;
&lt;li&gt;「振替元 + 振替先」が同じ振替関係は 1 つだけ (重複不可)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;このルールを守る主体が &lt;code&gt;TransferRelation&lt;/code&gt; です。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-kotlin" data-lang="kotlin"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;TransferRelation&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;val&lt;/span&gt; accountId: AccountId,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;val&lt;/span&gt; serviceId: ServiceId,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; paymentDay: PaymentDay
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;fun&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;changePaymentDay&lt;/span&gt;(newDay: PaymentDay) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; paymentDay = newDay
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;fun&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;stop&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 状態変更
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;【集約の特徴】&lt;/p&gt;</description></item><item><title>DDDでドメインを設計するときの流れ</title><link>https://design.okuda-studio.com/posts/0014-domain-design-flow/</link><pubDate>Tue, 10 Mar 2026 14:00:00 +0900</pubDate><guid>https://design.okuda-studio.com/posts/0014-domain-design-flow/</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="#ddd%E3%81%A7%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E3%82%92%E8%A8%AD%E8%A8%88%E3%81%99%E3%82%8B%E3%81%A8%E3%81%8D%E3%81%AE%E6%B5%81%E3%82%8C"&gt;DDDでドメインを設計するときの流れ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E8%A8%AD%E8%A8%88%E3%81%AE%E5%85%A8%E4%BD%93%E3%81%AE%E6%B5%81%E3%82%8C"&gt;ドメイン設計の全体の流れ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%81%93%E3%81%AE%E8%A8%98%E4%BA%8B%E3%81%AE%E5%89%8D%E6%8F%90"&gt;この記事の前提&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#1-%E3%83%A6%E3%83%BC%E3%82%B9%E3%82%B1%E3%83%BC%E3%82%B9%E3%82%92%E6%9B%B8%E3%81%8D%E5%87%BA%E3%81%99"&gt;1. ユースケースを書き出す&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#2-%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E7%94%A8%E8%AA%9E%E3%82%92%E6%95%B4%E7%90%86%E3%81%99%E3%82%8B%E3%83%A6%E3%83%93%E3%82%AD%E3%82%BF%E3%82%B9%E8%A8%80%E8%AA%9E"&gt;2. ドメイン用語を整理する（ユビキタス言語）&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#3-%E3%82%A8%E3%83%B3%E3%83%86%E3%82%A3%E3%83%86%E3%82%A3%E5%80%99%E8%A3%9C%E3%82%92%E5%87%BA%E3%81%99"&gt;3. エンティティ候補を出す&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#4-%E4%B8%8D%E5%A4%89%E6%9D%A1%E4%BB%B6%E3%82%92%E6%9B%B8%E3%81%8F"&gt;4. 不変条件を書く&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#5-%E7%8A%B6%E6%85%8B%E9%81%B7%E7%A7%BB%E3%82%92%E6%95%B4%E7%90%86%E3%81%99%E3%82%8B"&gt;5. 状態遷移を整理する&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#6-%E9%9B%86%E7%B4%84aggregate%E3%82%92%E6%B1%BA%E3%82%81%E3%82%8B"&gt;6. 集約（Aggregate）を決める&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#7-%E3%82%A8%E3%83%B3%E3%83%86%E3%82%A3%E3%83%86%E3%82%A3%E3%81%AE%E8%B2%AC%E5%8B%99%E3%82%92%E8%A8%AD%E8%A8%88%E3%81%99%E3%82%8B"&gt;7. エンティティの責務を設計する&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#setter%E3%81%8C%E5%95%8F%E9%A1%8C%E3%81%AB%E3%81%AA%E3%82%8B%E7%90%86%E7%94%B1"&gt;setterが問題になる理由&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89%E3%81%AF%E6%93%8D%E4%BD%9C%E3%82%92%E8%A1%A8%E3%81%99"&gt;ドメインメソッドは「操作」を表す&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E9%87%8D%E8%A6%81%E3%81%AA%E8%80%83%E3%81%88%E6%96%B9"&gt;重要な考え方&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#8-%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%82%92%E5%AE%9A%E7%BE%A9%E3%81%99%E3%82%8B"&gt;8. ドメインサービスを定義する&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#9-%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E3%82%92%E5%AE%9A%E7%BE%A9%E3%81%99%E3%82%8B"&gt;9. リポジトリを定義する&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#10-%E6%9C%80%E5%BE%8C%E3%81%ABui%E3%82%92%E4%BD%9C%E3%82%8B"&gt;10. 最後にUIを作る&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%81%BE%E3%81%A8%E3%82%81"&gt;まとめ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%81%93%E3%81%AE%E6%B5%81%E3%82%8C%E3%81%A7%E8%A8%AD%E8%A8%88%E3%81%99%E3%82%8B%E9%9A%9B%E3%81%AE%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88"&gt;この流れで設計する際のテンプレート&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="dddでドメインを設計するときの流れ"&gt;DDDでドメインを設計するときの流れ&lt;/h2&gt;
&lt;p&gt;― 実践的な設計手順 ―&lt;/p&gt;
&lt;p&gt;ドメイン駆動設計（DDD）を学び始めると、多くの人が次の疑問を持ちます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ドメイン設計は何から始めればいいのか&lt;/li&gt;
&lt;li&gt;実際の開発ではどのような手順で設計するのか&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;DDDの本では概念の説明が多く、「実際の設計手順」がはっきりしないことがあります。&lt;/p&gt;
&lt;p&gt;この記事では、実務で使える &lt;strong&gt;ドメイン設計の具体的な手順&lt;/strong&gt; を整理して紹介します。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="ドメイン設計の全体の流れ"&gt;ドメイン設計の全体の流れ&lt;/h2&gt;
&lt;p&gt;DDDでドメインを設計する場合、次の順序で進めると整理しやすくなります。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;ユースケースを書き出す&lt;/li&gt;
&lt;li&gt;ドメイン用語を整理する（ユビキタス言語）&lt;/li&gt;
&lt;li&gt;エンティティ候補を出す&lt;/li&gt;
&lt;li&gt;不変条件を書く&lt;/li&gt;
&lt;li&gt;状態遷移を整理する&lt;/li&gt;
&lt;li&gt;集約（Aggregate）を決める&lt;/li&gt;
&lt;li&gt;エンティティの責務を設計する&lt;/li&gt;
&lt;li&gt;必要ならドメインサービスを作る&lt;/li&gt;
&lt;li&gt;リポジトリを定義する&lt;/li&gt;
&lt;li&gt;最後にUIを設計する&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;重要なのは &lt;strong&gt;UIから設計を始めないこと&lt;/strong&gt; です。&lt;/p&gt;
&lt;p&gt;DDDでは、基本的には、&lt;/p&gt;
&lt;p&gt;ユースケース → ドメイン → UI&lt;/p&gt;
&lt;p&gt;という順序で設計します。&lt;/p&gt;
&lt;p&gt;実際には、一度でバシッと決められるわけではないため、ドメインを設計しているときに、ユースケースに戻るなど、各プロセス間を何度も行ったり来たりします。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="この記事の前提"&gt;この記事の前提&lt;/h2&gt;
&lt;p&gt;この記事では、口座振替管理アプリの開発を想定して、設計の流れを説明してきます。&lt;/p&gt;
&lt;p&gt;振替元と振替先をユーザーが紐づけるメモアプリを想像してください。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="1-ユースケースを書き出す"&gt;1. ユースケースを書き出す&lt;/h2&gt;
&lt;p&gt;最初に、システムでユーザーが行う操作を書き出します。&lt;/p&gt;
&lt;p&gt;ポイントは &lt;strong&gt;UIではなく行動を書くこと&lt;/strong&gt; です。&lt;/p&gt;</description></item><item><title>Aggregate Root とは</title><link>https://design.okuda-studio.com/posts/0011-what-is-aggregate-root/</link><pubDate>Thu, 12 Feb 2026 10:00:00 +0900</pubDate><guid>https://design.okuda-studio.com/posts/0011-what-is-aggregate-root/</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="#aggregate-root-%E3%81%A8%E3%81%AF"&gt;Aggregate Root とは&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB"&gt;はじめに&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#aggregate%E9%9B%86%E7%B4%84%E3%81%A8%E3%81%AF"&gt;Aggregate（集約）とは&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#aggregate-root%E9%9B%86%E7%B4%84%E3%83%AB%E3%83%BC%E3%83%88%E3%81%A8%E3%81%AF"&gt;Aggregate Root（集約ルート）とは&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E5%85%B7%E4%BD%93%E4%BE%8B%E3%82%A4%E3%83%A1%E3%83%BC%E3%82%B8"&gt;具体例（イメージ）&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#%E6%B3%A8%E6%96%87%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E3%81%AE%E4%BE%8B"&gt;注文ドメインの例&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%81%AA%E3%81%9C-aggregate-root-%E3%81%8C%E5%BF%85%E8%A6%81%E3%81%AA%E3%81%AE%E3%81%8B"&gt;なぜ Aggregate Root が必要なのか&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#-%E6%95%B4%E5%90%88%E6%80%A7%E3%82%92%E5%AE%88%E3%82%8B%E3%81%9F%E3%82%81"&gt;① 整合性を守るため&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#-%E3%83%88%E3%83%A9%E3%83%B3%E3%82%B6%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E5%A2%83%E7%95%8C%E3%82%92%E6%98%8E%E7%A2%BA%E3%81%AB%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81"&gt;② トランザクション境界を明確にするため&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#-%E4%BE%9D%E5%AD%98%E9%96%A2%E4%BF%82%E3%82%92%E3%82%B7%E3%83%B3%E3%83%97%E3%83%AB%E3%81%AB%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81"&gt;③ 依存関係をシンプルにするため&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E8%A8%AD%E8%A8%88%E6%99%82%E3%81%AE%E6%B3%A8%E6%84%8F%E7%82%B9"&gt;設計時の注意点&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#-aggregate-%E3%82%92%E5%A4%A7%E3%81%8D%E3%81%8F%E3%81%97%E3%81%99%E3%81%8E%E3%81%AA%E3%81%84"&gt;① Aggregate を大きくしすぎない&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#-%E4%BB%96-aggregate-%E3%82%92%E7%9B%B4%E6%8E%A5%E5%8F%82%E7%85%A7%E3%81%97%E3%81%AA%E3%81%84"&gt;② 他 Aggregate を直接参照しない&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#-repository-%E3%81%AF-aggregate-root-%E5%8D%98%E4%BD%8D"&gt;③ Repository は Aggregate Root 単位&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%82%88%E3%81%8F%E3%81%82%E3%82%8B%E8%AA%A4%E8%A7%A3"&gt;よくある誤解&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%81%BE%E3%81%A8%E3%82%81"&gt;まとめ&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="aggregate-root-とは"&gt;Aggregate Root とは&lt;/h1&gt;
&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;
&lt;p&gt;DDD（Domain-Driven Design）の文脈で頻繁に登場する &lt;strong&gt;Aggregate Root（集約ルート）&lt;/strong&gt; について解説していきます。&lt;/p&gt;
&lt;p&gt;本記事では、&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Aggregate / Aggregate Root とは何か&lt;/li&gt;
&lt;li&gt;なぜこの概念が必要なのか&lt;/li&gt;
&lt;li&gt;設計時の注意点&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;を整理します。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="aggregate集約とは"&gt;Aggregate（集約）とは&lt;/h2&gt;
&lt;p&gt;Aggregate とは、&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;関連する複数の Entity / Value Object を&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;一つのまとまり（整合性の境界）&lt;/strong&gt; として扱う&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;DDD の設計単位です。&lt;/p&gt;
&lt;p&gt;重要なのは、&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Aggregate は「常に一貫した状態を保つべき単位」&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;という点です。&lt;/p&gt;</description></item></channel></rss>