DDDを実践するときのアーキテクチャ

エリックエバンス本や実践ドメイン駆動を読んでも思想的なところは定義されているものの実際のプロジェクトの中でどう落とし込むのかについては、それぞれで考えないといけないです。
DDDと一緒に語られているアーキテクチャについてよくまとまっている記事がQiitaにあったので参考に。


今、進行中の案件ではKotlinでSpringBootを使ってバックエンドのAPIを開発していて、
普通にやるといわゆるMVCの三層アーキテクチャになってしまうのですがここにドメインモデル層を確立してドメインロジックを集約したいなと思っています。
Controller -> Presentation
Service -> Application
思想的なところでのマッピングとしてここまではよくて、
ドメインモデルとORマッパー実装を切り離しドメインモデル層を確立しないといけないです。
ORマッパーはMyBatisを採用しています。
model層にはモデルとMapperのinterfaceを定義しinfrastracture層にMyBatisに特化した実装を逃しています。
以下のようなinterfaceをmoodel層に定義し、

interface CouponRepository {
    fun find(couponCcode: CouponCode): Coupon?

infrastracture層には以下を定義します。

@Repository
@Mapper
interface CouponMapperRepository : CouponRepository {
    @Select("""
        SELECT *
        FROM
          coupon
        WHERE
          coupon_code = #{couponCcode}
    """)
    override fun find(couponCcode: CouponCode): Coupon?

Couponモデルに値オブジェクトとしてCouponCodeを定義していたり、Couponのビジネスロジックを集約するようにします。
こんな感じで三層アーキテクチャ+ドメインモデルを試みておりますがまだまだ色々と試行錯誤を繰り返しています。

コメント

タイトルとURLをコピーしました