TL;DR
アーキテクチャは抽象的な概念でしかなく、コードと直接結びつかない、という乖離のこと。モデル対コード間ギャップとも呼ぶ。
なぜ必要か
パッケージ構成がアーキテクチャを反映しなくなると、時間がたつにつれて、コードベースはアーキテクチャからかけ離れたものになる。どんなパッケージ構成でも、維持するにはプロジェクトに規律を課す必要があり、それができないとこのギャップが生じる。
仕組み
手を動かしてわかるクリーンアーキテクチャでは、アーキテクチャの構成要素を意識したパッケージ構成にすることで、このギャップを解消できるとしている。ヘキサゴナルアーキテクチャなら、エンティティ、ユースケース、ポートとアダプタをそれぞれパッケージに落とし込む。
buckpal/
adapter/
in/web/SendMoneyController
out/persistence/AccountPersistenceAdapter
application/
domain/
model/Account
service/SendMoneyService
port/
in/SendMoneyUseCase
out/UpdateAccountStatePort
common/パッケージの数が増えると、いま書いているコードをどのパッケージに入れるべきかを考える必要が出てくる。そのため、開発者がアーキテクチャについて能動的に考えるようになる。