境界づけられたコンテキストとは、ある言葉やモデルが一貫した意味を持つ範囲のことです。
一言でいうと
同じ言葉が違う意味で使われる場所には、設計上の境界を引く必要があります。
「顧客」という言葉でも、営業では見込み客、請求では支払い相手、サポートでは問い合わせ元を指すことがあります。これらを1つの巨大なCustomerモデルに押し込むと、意味が混ざります。
なぜ境界が必要か
境界がないと、次の問題が起きます。
- 1つのモデルに無関係なフィールドが増える
- ある部署の仕様変更が別部署の機能を壊す
- 同じ言葉なのに会話が噛み合わない
- マイクロサービスの境界が曖昧になる
- DB共有によって変更できなくなる
境界づけられたコンテキストは、こうした混乱を避けるための設計単位です。
例: ECサイトの「注文」
| コンテキスト | 注文の意味 |
|---|---|
| 販売 | 顧客が購入した商品と金額 |
| 倉庫 | 出荷すべき品目と数量 |
| 請求 | 請求対象と支払い状態 |
| サポート | 問い合わせ対応の履歴 |
同じ「注文」でも、必要な情報とルールが違います。すべてを1つのモデルにすると、どの文脈でも使いにくくなります。
コンテキスト内とコンテキスト間
| 範囲 | 目的 | 設計の焦点 |
|---|---|---|
| コンテキスト内 | モデルの一貫性を守る | エンティティ、値オブジェクト、集約 |
| コンテキスト間 | 意味の変換を管理する | API、イベント、Anti-Corruption Layer |
境界の内側では、言葉の意味を一貫させます。境界を越えるときは、別の言葉や形式へ変換します。
コンテキストマップ
コンテキストマップは、複数のコンテキストの関係を図として整理するものです。
| 関係 | 意味 |
|---|---|
| Customer/Supplier | 一方がAPIや仕様を提供する |
| Conformist | 相手のモデルに合わせる |
| Anti-Corruption Layer | 変換層を挟んで汚染を防ぐ |
| Shared Kernel | 一部のモデルを共有する |
| Separate Ways | 連携せず独立させる |
すべての境界をAPI化すればよいわけではありません。関係性に応じて連携方法を選びます。
マイクロサービスとの関係
境界づけられたコンテキストは、マイクロサービスの候補になります。ただし、コンテキストを見つけたからといって、必ずサービス分割する必要はありません。
| 状況 | 選択 |
|---|---|
| チームもデプロイも分けたい | サービス分割を検討 |
| まだ小さく変更も少ない | モジュラーモノリスでよい |
| DB共有が強すぎる | 先に境界整理 |
| 言葉の意味が混ざっている | コンテキスト分離を優先 |
サービス分割より先に、モデルと言葉の境界を整理することが重要です。
よくある誤解
DBテーブル単位で境界を決める
DB構造は結果であって、境界の出発点ではありません。業務の言葉、変更理由、チームの責任範囲から考えます。
境界を細かくすればよい
細かすぎる境界は連携コストを増やします。モデルの意味が一貫していて、同じ理由で変更される範囲をまとめます。
共通モデルを作れば解決する
全社共通の巨大モデルは、多くの場合うまくいきません。コンテキストごとの意味を保ち、必要なところだけ変換します。
導入チェックリスト
- 同じ単語が複数の意味で使われていないか
- 仕様変更の理由が違う機能を同じモデルに入れていないか
- チームの責任範囲とモデルの境界が極端にずれていないか
- 境界を越えるデータ変換を明示しているか
- DB共有が境界を壊していないか
まとめ
境界づけられたコンテキストは、システム分割の前に言葉の意味を分割する考え方です。
境界は技術都合ではなく、業務上の意味と変更理由に合わせて引きます。
参考リソース
- Martin Fowler: Bounded Context
- Martin Fowler: Context Mapping
- Microsoft: Domain analysis for microservices