Javaのパッケージ構成色々

これまで働いてきた現場でのJavaパッケージ構成はおおよそ以下のような感じが主で、大体ControllerからServiceを呼び出し、Serviceから様々なパッケージを参照していることが多かった。

シンプルではあったが大抵serviceから呼び出されるクラスのパッケージ構成がカオスになりがちで、時々内容が重複することもあった。

これに対して最近あった現場でのパッケージ構成はおおよそ以下のような感じになっていた。

メインのパッケージは大きく分けてpresentation, domain, repositoryに分かれており、それぞれ以下のような分類になっている。

  • presentation: 外部から呼び出しされるクラス等のパッケージ
  • domain: ビジネスロジックを扱うクラス等のパッケージ
  • repository: 外部APIを呼び出したりDB接続等を行うクラスのパッケージ

基本的にpresentation内からdomainを呼び出し、domainからはrepositoryを呼び出したりしている(当然各パッケージ内でさらに細かいパッケージ分け等は行われている)。

最初はなぜこういった分類をする必要があるのかよく分かっていなかったが、いざ分けてみるとどこにどういったクラスがあるのか理解しやすくなっており、これはこれで意味があるというのがよく分かった。

また、別の現場ではもう少し細かく以下のような構成になっていた。

新たにusecaseのパッケージが追加されており、ここからserviceを呼び出す構成になっていた。presentation, domain, repositoryの構成だとdomain内のserviceクラスが大きくなりがちでトランザクションの張り方がやや面倒だったので、serviceを小さくしてusecaseからそれを呼び出す(トランザクションはserviceまたはusecase側で張る)というのは意味のある構成だと思う。個人的にはややこの構成のほうが好みではある。

これまでプログラミングについての本は読んでもパッケージ構成に関するような本はあまり読んでこなかったので、これからはもうちょっとこの辺りについてもよく勉強しておこうと思う。以下は買ったはいいがまだ読んでない本なので、手始めにこの辺りから機会を見て読んでみたい。