Modular Monolithは単一Deployableの中に検証可能なModule境界を持つ
Modular Monolithは、processやdeploymentを分割せずにApplication内部へ明示的なModule境界を設ける構成である。重要なのは「ディレクトリを機能別に分ける」ことではなく、Public API、Internal implementation、Allowed Dependencies を持つことである。
Spring Modulithはこの考え方を具体的に実装している。Application Moduleのbase packageをAPIとして扱い、internal packageへの外部Moduleからの参照を検証で拒否できる。また allowedDependencies で許可するModule依存を明示し、Named Interfaceで公開面をさらに細分化できる。ApplicationModules.verify() はModule間cycle、internal access、宣言外dependencyなどを検査する。
中規模Web Applicationにとっての利点は、microservicesへ分散する前にownership boundaryを得られることにある。HTTP/MCP/JobなどTransportが増えても、どのOperationをどのModuleが所有するかをprocess境界とは別に決められる。
Single deployable
├─ project module
│ ├─ public API
│ └─ internal
├─ document module
└─ billing module
ただしModuleを細かくしすぎると、1つの変更が多数のinterfaceを横断し、Localization CostはLayerと抽象化を増やすほど無視できなくなる を増やす。Modular Monolithは「最大限分割する」方式ではなく、変更・語彙・ownershipがまとまる単位に境界を置く方法と考えた方がよい。
また、Runtimeが単一である以上、resource contentionやfailure isolationはmicroservicesと同じにはならない。目的はdeployment isolationではなく、Application内部のdependency governanceである。
Module BoundaryはPublic API・Internal・Allowed Dependenciesで実体化する と Modular Monolith + Vertical SliceはOwnership境界と変更単位を別スケールで持つ で粒度を掘り下げる。