crossroad0201 / Ddd On Scala
Programming Languages
Projects that are alternatives of or similar to Ddd On 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[書籍:エリック・エヴァンスのドメイン駆動設計]
-
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 よりも表現力が強力。