Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
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: 3 months ago
JSON representation
DDD sample implementation by Scala.
- Host: GitHub
- URL: https://github.com/crossroad0201/ddd-on-scala
- Owner: crossroad0201
- License: mit
- Created: 2017-07-31T14:18:23.000Z (over 7 years ago)
- Default Branch: master
- Last Pushed: 2020-12-12T11:38:40.000Z (about 4 years ago)
- Last Synced: 2024-08-02T17:40:00.835Z (6 months ago)
- Topics: clean-architecture, ddd, functional-programming, hexagonal-architecture, object-oriented, onion-architecture, scala
- Language: Scala
- Homepage:
- Size: 875 KB
- Stars: 139
- Watchers: 7
- Forks: 15
- Open Issues: 0
-
Metadata Files:
- Readme: README.asciidoc
- License: LICENSE
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 よりも表現力が強力。