Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/crossroad0201/ddd-on-scala

DDD sample implementation by Scala.
https://github.com/crossroad0201/ddd-on-scala

clean-architecture ddd functional-programming hexagonal-architecture object-oriented onion-architecture scala

Last synced: about 2 months ago
JSON representation

DDD sample implementation by Scala.

Awesome Lists containing this project

README

        

: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 よりも表現力が強力。