{"id":13599946,"url":"https://github.com/crossroad0201/ddd-on-scala","last_synced_at":"2025-04-10T17:33:06.520Z","repository":{"id":201706563,"uuid":"98897000","full_name":"crossroad0201/ddd-on-scala","owner":"crossroad0201","description":"DDD sample implementation by Scala. ","archived":false,"fork":false,"pushed_at":"2020-12-12T11:38:40.000Z","size":896,"stargazers_count":139,"open_issues_count":0,"forks_count":15,"subscribers_count":7,"default_branch":"master","last_synced_at":"2024-08-02T17:40:00.835Z","etag":null,"topics":["clean-architecture","ddd","functional-programming","hexagonal-architecture","object-oriented","onion-architecture","scala"],"latest_commit_sha":null,"homepage":"","language":"Scala","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/crossroad0201.png","metadata":{"files":{"readme":"README.asciidoc","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null}},"created_at":"2017-07-31T14:18:23.000Z","updated_at":"2024-06-09T05:37:07.000Z","dependencies_parsed_at":"2024-06-19T18:02:38.268Z","dependency_job_id":null,"html_url":"https://github.com/crossroad0201/ddd-on-scala","commit_stats":null,"previous_names":["crossroad0201/ddd-on-scala"],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/crossroad0201%2Fddd-on-scala","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/crossroad0201%2Fddd-on-scala/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/crossroad0201%2Fddd-on-scala/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/crossroad0201%2Fddd-on-scala/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/crossroad0201","download_url":"https://codeload.github.com/crossroad0201/ddd-on-scala/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":223442774,"owners_count":17145831,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["clean-architecture","ddd","functional-programming","hexagonal-architecture","object-oriented","onion-architecture","scala"],"created_at":"2024-08-01T17:01:20.683Z","updated_at":"2024-11-07T01:31:31.180Z","avatar_url":"https://github.com/crossroad0201.png","language":"Scala","funding_links":[],"categories":["Scala"],"sub_categories":[],"readme":":toc:\n\n= DDD on Scala\n\n== はじめに\n\nhttps://www.scala-lang.org[Scala] による https://www.amazon.co.jp/dp/4798121967[DDD（ドメイン駆動設計）] の実装サンプルです。\n\nScalaの関数型言語の特徴を活かして、 *イミュータブル* で *副作用のない（副作用を局所化した）* DDDの実装を目指しています。\n\n当サンプルの解説は、 https://speakerdeck.com/crossroad0201/scala-on-ddd[こちらのスライド] を参照してください。\n\n[NOTE]\n====\n実装上のポイントを、コード中に `NOTE:` でコメントしています。 +\nhttps://github.com/crossroad0201/ddd-on-scala/search?utf8=%E2%9C%93\u0026q=NOTE%3A\u0026type=[NOTE: で テキスト検索] するなどして参照してください。\n====\n\n== セットアップ\n\n=== 前提\n\n* JDK 1.8 以上\n* http://www.scala-sbt.org/index.html[sbt]\n\n=== DBの準備\n\nこのサンプルでは、一部で http://www.h2database.com/html/main.html[組み込みのH2データベース] を使用したコード例があります。\n\nサンプルの実行前にDBを作成します。\n\n* **sbt** でDBにテーブルを作成します。\n====\n\u003e $ sbt \"project rdb\" flywayMigrate\n====\n\n== ビルドと実行\n\nこのサンプルはアプリケーションとしてのエンドポイントはありません。 +\n動作は **sbt** からユニットテストを実行して確認してください。\n\n====\n\u003e $ sbt test\n====\n\n== 構成\n\n=== レイヤ・モジュール構成\n\nこのサンプルでは、 http://jeffreypalermo.com/blog/the-onion-architecture-part-1/[オニオンアーキテクチャ] をもとにした\nレイヤ・モジュール構成を採用しています。\n\nimage:doc/Layer.png[レイヤ構成図]\n\n[format=\"csv\",options=[\"header\"]]\n|===\nレイヤ,責務,依存するレイヤ\nドメイン,ドメイン（業務）の関心事と仕様をモデル化します。,なし\nアプリケーション,ドメインを使用して、ユースケースを実現します。,ドメイン\nクエリ,`CQRS` のクエリモデルです。ドメインの読み取り専用ビューを提供します。,なし\nインフラストラクチャ,アプリケーションの実行結果を永続化します。,アプリケーション / ドメイン / クエリ\nインターフェース,利用者へのユーザーインターフェースを提供します。,インフラストラクチャ / アプリケーション / ドメイン / クエリ\n|===\n\n* `ドメインレイヤ` と `アプリケーションレイヤ` は特定のインフラストラクチャに依存しないので、\nインフラストラクチャの変更が容易になります。 +\nまた、インフラストラクチャをモック化することも容易なので、ユニットテストを簡単かつ軽量に実施することができます。\n\n* `インフラストラクチャレイヤ` は、採用するミドルウェア・サービスごとにモジュールを分割します。 +\nこうすることで、`インターフェースレイヤ` でインフラストラクチャモジュールを実行に必要なものだけに限定することができ、\n使用しないライブラリ（JDBCドライバやクライアントライブラリなど）のために実行モジュールが肥大化することを回避できます +\n特に `AWS Lambda` などのサーバレスプラットフォームでは、実行モジュールが大きくなると実行時のスピンアップ時間が長くなるため、\n実行モジュールを小さくすることに価値があります。\n\n* `インターフェースレイヤ` は、提供するインターフェース（Web画面、REST API、CLIなど）ごとにモジュールを分割します。  +\n\n=== コンポーネント構成\n\nこのサンプルのコンポーネント構成は下図の通りです。\n\nlink:modules/application/src/main/scala/crossroad0201/dddonscala/application/task/TaskService.scala[アプリケーションサービス] からコードを追っていくと、全体が把握しやすいと思います。\n\nimage:doc/Components.png[コンポーネント図]\n\n=== 概念モデル\n\nこのサンプルのドメインでは、シンプルなタスク管理を扱います。 +\nドメインの概念モデルは下図の通りです。\n\nimage:doc/DomainModel.png[概念モデル図]\n\n== 参考文献\n\n=== Scala\n\n* https://dwango.github.io/scala_text/[ドワンゴさんのScala研修用テキスト] +\nScalaの入門テキスト。\n* http://www.ne.jp/asahi/hishidama/home/tech/scala/index.html[HishidamaさんのScalaリファレンス] +\nScalaのよく使う言語機能やAPIのリファレンス。\n\n* http://www.scalatest.org/user_guide[ScalaTest] +\nScalaの代表的なテスティングライブラリ。\n* http://scalikejdbc.org[ScalikeJDBC] +\nScalaでRDBにアクセスするライブラリ。\n\n* https://tpolecat.github.io/2015/04/29/f-bounds.html[Returning the \"Current\" Type in Scala] +\nスーパータイプのメソッドの戻り値の型として、サブタイプを使用する方法の解説。\n\n=== DDD（ドメイン駆動設計）\n\n* https://www.amazon.co.jp/dp/4798121967[書籍：エリック・エヴァンスのドメイン駆動設計]\n* https://www.amazon.co.jp/dp/479813161X[書籍：実践ドメイン駆動設計]\n\n* http://labs.gree.jp/blog/2013/12/9354/[Scalaコードでわかった気になるDDD] +\nScalaを使ったDDDの解説。\n* http://www.qcontokyo.com/data_2016/pdf/B-2_2_JunichiKato.pdf[DDD実践(ベスト)プラクティス｛ドメインイベントとマイクロサービスと組織の関係｝] +\nCQRSパターンとドメインイベント／イベントソーシングの解説。\n\n=== アーキテクチャ\n\n* http://jeffreypalermo.com/blog/the-onion-architecture-part-1/[The Onion Architecture : part 1]\n* https://qiita.com/little_hand_s/items/2040fba15d90b93fc124[ドメイン駆動 + オニオンアーキテクチャ概略]\n* http://qiita.com/gki/items/91386b082c57123f1ba0[Clean Architectureで分からなかったところを整理する]\n\n=== その他\n\n* http://powerman.name/doc/asciidoc[AsciiDoc cheatsheet] +\nAsciiDoc（このREADMEでも使用しているマークダウン言語）の書き方。一般的な Markdown よりも表現力が強力。\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcrossroad0201%2Fddd-on-scala","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcrossroad0201%2Fddd-on-scala","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcrossroad0201%2Fddd-on-scala/lists"}