• Stars
    star
    140
  • Rank 260,623 (Top 6 %)
  • Language
    Scala
  • License
    MIT License
  • Created about 7 years ago
  • Updated almost 4 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

DDD sample implementation by Scala.

DDD on Scala

はじめに

Scala による DDD(ドメイン駆動設計) の実装サンプルです。

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

当サンプルの解説は、 こちらのスライド を参照してください。

Note

実装上のポイントを、コード中に NOTE: でコメントしています。
NOTE: で テキスト検索 するなどして参照してください。

セットアップ

前提

  • JDK 1.8 以上

  • sbt

DBの準備

このサンプルでは、一部で 組み込みのH2データベース を使用したコード例があります。

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

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

$ sbt "project rdb" flywayMigrate

ビルドと実行

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

$ sbt test

構成

レイヤ・モジュール構成

このサンプルでは、 オニオンアーキテクチャ をもとにした レイヤ・モジュール構成を採用しています。

レイヤ構成図

レイヤ

責務

依存するレイヤ

ドメイン

ドメイン(業務)の関心事と仕様をモデル化します。

なし

アプリケーション

ドメインを使用して、ユースケースを実現します。

ドメイン

クエリ

CQRS のクエリモデルです。ドメインの読み取り専用ビューを提供します。

なし

インフラストラクチャ

アプリケーションの実行結果を永続化します。

アプリケーション / ドメイン / クエリ

インターフェース

利用者へのユーザーインターフェースを提供します。

インフラストラクチャ / アプリケーション / ドメイン / クエリ

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

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

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

コンポーネント構成

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

アプリケーションサービス からコードを追っていくと、全体が把握しやすいと思います。

コンポーネント図

概念モデル

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

概念モデル図

参考文献

Scala

その他

  • AsciiDoc cheatsheet
    AsciiDoc(このREADMEでも使用しているマークダウン言語)の書き方。一般的な Markdown よりも表現力が強力。