[NOTE]

October 20, 2017 · View on GitHub

:toc:

= DDD on Scala

== はじめに

https://www.scala-lang.org[Scala] による https://www.amazon.co.jp/dp/4798121967[DDD(ドメイン駆動設計)] の実装サンプルです。

Scalaの関数型言語の特徴を活かして、 イミュータブル副作用のない(副作用を局所化した) DDDの実装を目指しています。

当サンプルの解説は、 https://speakerdeck.com/crossroad0201/scala-on-ddd[こちらのスライド] を参照してください。

[NOTE]

実装上のポイントを、コード中に NOTE: でコメントしています。 + https://github.com/crossroad0201/ddd-on-scala/search?utf8=%E2%9C%93&q=NOTE%3A&type=[NOTE: で テキスト検索] するなどして参照してください。

== セットアップ

=== 前提

=== DBの準備

このサンプルでは、一部で http://www.h2database.com/html/main.html[組み込みのH2データベース] を使用したコード例があります。

サンプルの実行前にDBを作成します。

  • sbt でDBにテーブルを作成します。 ====

$ sbt "project rdb" flywayMigrate ====

== ビルドと実行

このサンプルはアプリケーションとしてのエンドポイントはありません。 + 動作は sbt からユニットテストを実行して確認してください。

====

$ sbt test ====

== 構成

=== レイヤ・モジュール構成

このサンプルでは、 http://jeffreypalermo.com/blog/the-onion-architecture-part-1/[オニオンアーキテクチャ] をもとにした レイヤ・モジュール構成を採用しています。

image:doc/Layer.png[レイヤ構成図]

[format="csv",options=["header"]] |=== レイヤ,責務,依存するレイヤ ドメイン,ドメイン(業務)の関心事と仕様をモデル化します。,なし アプリケーション,ドメインを使用して、ユースケースを実現します。,ドメイン クエリ,CQRS のクエリモデルです。ドメインの読み取り専用ビューを提供します。,なし インフラストラクチャ,アプリケーションの実行結果を永続化します。,アプリケーション / ドメイン / クエリ インターフェース,利用者へのユーザーインターフェースを提供します。,インフラストラクチャ / アプリケーション / ドメイン / クエリ |===

  • ドメインレイヤアプリケーションレイヤ は特定のインフラストラクチャに依存しないので、 インフラストラクチャの変更が容易になります。 + また、インフラストラクチャをモック化することも容易なので、ユニットテストを簡単かつ軽量に実施することができます。

  • インフラストラクチャレイヤ は、採用するミドルウェア・サービスごとにモジュールを分割します。 + こうすることで、インターフェースレイヤ でインフラストラクチャモジュールを実行に必要なものだけに限定することができ、 使用しないライブラリ(JDBCドライバやクライアントライブラリなど)のために実行モジュールが肥大化することを回避できます + 特に AWS Lambda などのサーバレスプラットフォームでは、実行モジュールが大きくなると実行時のスピンアップ時間が長くなるため、 実行モジュールを小さくすることに価値があります。

  • インターフェースレイヤ は、提供するインターフェース(Web画面、REST API、CLIなど)ごとにモジュールを分割します。 +

=== コンポーネント構成

このサンプルのコンポーネント構成は下図の通りです。

link:modules/application/src/main/scala/crossroad0201/dddonscala/application/task/TaskService.scala[アプリケーションサービス] からコードを追っていくと、全体が把握しやすいと思います。

image:doc/Components.png[コンポーネント図]

=== 概念モデル

このサンプルのドメインでは、シンプルなタスク管理を扱います。 + ドメインの概念モデルは下図の通りです。

image:doc/DomainModel.png[概念モデル図]

== 参考文献

=== Scala

=== DDD(ドメイン駆動設計)

=== アーキテクチャ

=== その他