ddd-on-scala icon indicating copy to clipboard operation
ddd-on-scala copied to clipboard

DDD sample implementation by Scala.

: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: で テキスト検索] するなどして参照してください。

== セットアップ

=== 前提

  • JDK 1.8 以上
  • http://www.scala-sbt.org/index.html[sbt]

=== 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

  • https://dwango.github.io/scala_text/[ドワンゴさんのScala研修用テキスト] + Scalaの入門テキスト。

  • http://www.ne.jp/asahi/hishidama/home/tech/scala/index.html[HishidamaさんのScalaリファレンス] + Scalaのよく使う言語機能やAPIのリファレンス。

  • http://www.scalatest.org/user_guide[ScalaTest] + Scalaの代表的なテスティングライブラリ。

  • http://scalikejdbc.org[ScalikeJDBC] + ScalaでRDBにアクセスするライブラリ。

  • https://tpolecat.github.io/2015/04/29/f-bounds.html[Returning the "Current" Type in Scala] + スーパータイプのメソッドの戻り値の型として、サブタイプを使用する方法の解説。

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

  • https://www.amazon.co.jp/dp/4798121967[書籍:エリック・エヴァンスのドメイン駆動設計]

  • https://www.amazon.co.jp/dp/479813161X[書籍:実践ドメイン駆動設計]

  • http://labs.gree.jp/blog/2013/12/9354/[Scalaコードでわかった気になるDDD] + Scalaを使ったDDDの解説。

  • http://www.qcontokyo.com/data_2016/pdf/B-2_2_JunichiKato.pdf[DDD実践(ベスト)プラクティス{ドメインイベントとマイクロサービスと組織の関係}] + CQRSパターンとドメインイベント/イベントソーシングの解説。

=== アーキテクチャ

  • http://jeffreypalermo.com/blog/the-onion-architecture-part-1/[The Onion Architecture : part 1]
  • https://qiita.com/little_hand_s/items/2040fba15d90b93fc124[ドメイン駆動 + オニオンアーキテクチャ概略]
  • http://qiita.com/gki/items/91386b082c57123f1ba0[Clean Architectureで分からなかったところを整理する]

=== その他

  • http://powerman.name/doc/asciidoc[AsciiDoc cheatsheet] + AsciiDoc(このREADMEでも使用しているマークダウン言語)の書き方。一般的な Markdown よりも表現力が強力。