20151110 ドメイン駆動設計によるサービス開発
TRANSCRIPT
![Page 1: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/1.jpg)
ドメイン駆動設計によるサービス開発DDD ALLIANCE! ドメイン駆動設計をやってみた 6つの現場からの報告
![Page 2: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/2.jpg)
自己紹介名前:大西 真央(@mmmmao0530)
組織としての役割:DDD布教活動
チームとしての役割:リードエンジニア
(技術リーダー)
最近の関心ごと:効果的なドメインモデルの作成
チームビルディング
![Page 3: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/3.jpg)
概要ビッグローブでDDDを導入して早2年。この2年間、 ISP事業における主要なサービスをDDDで開発してきて、試行錯誤の連続でした。
今回は、試行錯誤の過程を経て生まれた、実際に実践している
・設計・実装の考え方(ドメインモデルやコード例やDB設計など)
・チーム環境の考え方(開発プロセスやチームビルディングなど)
の2つを軸に現場でのリアルな体験を紹介します。
また、最後に、試行錯誤における失敗談も紹介します。
![Page 4: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/4.jpg)
アジェンダ
1. 導入• Biglobe × DDD
2. チーム環境の考え方• スクラム開発• チームビルディング
3. 設計・実装の考え方• アプリケーションコード• DB設計
4. 失敗談5. まとめ
![Page 5: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/5.jpg)
導入 Biglobe × DDD
![Page 6: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/6.jpg)
DDDの歴史と組織
![Page 7: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/7.jpg)
DDD 適用サービスの歴史
2013年 2014年 2015年
Wi-Fiスポット
LTE/3G音声
Biglobe電話
Biglobe光
MVNO支援サービス
リニューアル ドコモ光
LTE/3G全部
新規サービス
LTE/3G帯域制御
NINJA SIM
※初回 S-inのみ記載。各サービスは現在も開発中。
![Page 8: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/8.jpg)
5チーム /30人規模でDDD実践中!全開発者の30%
![Page 9: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/9.jpg)
100名規模でDDDを実践できる組織にしたい!
![Page 10: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/10.jpg)
組織として大事にしていること全開発者でDDDの価値を共有。
現状の課題分析と課題解決に向けての行動。
人材育成計画。
新たな技術にチャレンジ。
開発環境基盤の高度化もちゃんとやる。
![Page 11: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/11.jpg)
DDDを採用する価値
![Page 12: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/12.jpg)
開発現場の取り巻く環境
サービス
関心事が何か?明確化
誰の関心事なのか?価値の最大化
![Page 13: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/13.jpg)
開発現場の取り巻く環境
サービス
関心事が何か?明確化
サービスを継続することが前提
誰の関心事なのか?価値の最大化
![Page 14: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/14.jpg)
開発現場の取り巻く環境
サービス
関心事が何か?明確化
サービスを継続することが前提
誰の関心事なのか?
使われ続ける
変更し続ける
成長し続ける
価値の最大化
![Page 15: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/15.jpg)
開発現場の取り巻く環境
サービス
関心事が何か?明確化
サービスを継続することが前提
誰の関心事なのか?
使われ続ける
変更し続ける
成長し続ける
関わる人も変わっていく
価値が変わる可能性大
価値の最大化
![Page 16: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/16.jpg)
開発現場の取り巻く環境
サービス
関心事が何か?明確化
サービスを継続することが前提
誰の関心事なのか?
使われ続ける
変更し続ける
成長し続ける
関わる人も変わっていく
価値が変わる可能性大
価値の最大化
課題
![Page 17: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/17.jpg)
独自言語だとつぎはぎで機能強化していくのでサービスの維持で
精一杯
![Page 18: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/18.jpg)
機能強化に莫大な費用がかかる
![Page 19: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/19.jpg)
サービス終了までの
トータルコストの削減が大事
![Page 20: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/20.jpg)
DDDを採用する価値
トータルコスト削減
![Page 21: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/21.jpg)
DDDを採用する価値
トータルコスト削減
変更コストを下げる
属人性を下げる
![Page 22: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/22.jpg)
DDDを採用する価値
トータルコスト削減
変更コストを下げる
属人性を下げる
業務をコードで表現
![Page 23: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/23.jpg)
チーム環境の考え方 スクラム開発
![Page 24: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/24.jpg)
スクラムの概要
![Page 25: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/25.jpg)
DDD目線でのスクラム
立ち上げ
初期ドメインモデルな
ど
スプリント ドメインモデル
1W~3W
1W
24 H
コード
リリース
2M~3M
プロダクトバックログ
スプリントバックログ
プロダクト
![Page 26: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/26.jpg)
立ち上げ
![Page 27: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/27.jpg)
初期ドメインモデル
業務フロー図
ユースケースフロー図
スケルトンコード
DB設計
状態遷移図
コンテキストマップ
①
②
③
④ ③
③
③
![Page 28: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/28.jpg)
初期ドメインモデル
業務フロー図
ユースケースフロー図
スケルトンコード
DB設計
状態遷移図
コンテキストマップ
①
②
③
④ ③
③
③
ドメインモデルを成長させる
![Page 29: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/29.jpg)
例:ユースケースフロー図
アクター
処理の流れ
ユースケース単位にどのエンティティが
何の業務をするのか設計。
主にアプリケーション層の設計。
![Page 30: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/30.jpg)
立ち上げ時の心構え
![Page 31: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/31.jpg)
開発初期はわからない事だらけ
![Page 32: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/32.jpg)
開発初期はわからない事だらけ方向付けレベルの設計に留める
![Page 33: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/33.jpg)
コアドメインを議論することはサービスを理解する第一歩
![Page 34: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/34.jpg)
サービスの複雑性と向き合う
![Page 35: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/35.jpg)
スプリント
![Page 36: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/36.jpg)
ドメインモデル
ユースケースフロー図
コード
スプリントバックログ
各メンバーがスプリントバックログに着手。
![Page 37: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/37.jpg)
ドメインモデルとコードを結びつける ↓
モデルの持つ意図をコードに引き継ぎ コードを通してモデルにフィードバック
![Page 38: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/38.jpg)
設計者と実装者を分離しない
![Page 39: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/39.jpg)
スプリント時の心構え
![Page 40: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/40.jpg)
コアドメインの設計・実装は
重点的に
![Page 41: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/41.jpg)
プルリクエストのWIPを活用して効率的にレビューを!
WIP:Work In Progress(作業中)の略。
![Page 42: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/42.jpg)
スプリントごとにドメインモデルから重要な概念を追加不要な概念を削除
![Page 43: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/43.jpg)
普段の会話の
ぎこちなさに敏感になる
![Page 44: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/44.jpg)
書き言葉と話し言葉が
ズレたら警告サイン
![Page 45: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/45.jpg)
初期のドメインモデルや実装では重要と思わなかった問題が見つかる可能性がある
![Page 46: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/46.jpg)
見つけた問題を放置するといつか困ったことになる
![Page 47: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/47.jpg)
ドメインモデルと実装を
改善するプロセスが大事
![Page 48: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/48.jpg)
スクラム開発 まとめ
ドメインモデルは時間と共に進化。
立ち上げ時は方向付けレベルの設計。
スプリント内の設計活動が重要。
![Page 49: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/49.jpg)
チーム環境の考え方 チームビルディング
![Page 50: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/50.jpg)
SW開発におけるチームビルディングの
必要性
![Page 51: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/51.jpg)
SW開発はチームスポーツであり技術的要因と同じだけ人的要因が
パフォーマンスに影響
![Page 52: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/52.jpg)
チームメンバーが相乗効果を発揮
![Page 53: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/53.jpg)
知識(要求)が絶えず変化するので知識の共有が大事
![Page 54: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/54.jpg)
DDDにおけるチームビルディングの
必要性
![Page 55: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/55.jpg)
本の紹介
![Page 56: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/56.jpg)
チーミング素直に意見を言う 試みる 協働する 省察する
学習するための組織づくり境界を越えて通じ合う 失敗から学ぶ 心理的安全を生み出す 学習するための骨組みを作る
学習しながら実行する診断する デザインする 行動する 省察する
学習しながら実行するための土台
![Page 57: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/57.jpg)
チーミング
素直に意見を言う 試みる 協働する 省察する
学習するための組織づくり境界を越えて通じ合う 失敗から学ぶ 心理的安全を生み出す 学習するための骨組みを作る
学習しながら実行する診断する デザインする 行動する 省察する
学習しながら実行するための土台
DDDで必須の考え方
![Page 58: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/58.jpg)
効率を追求しながら実行する 学習しながら実行する
リーダーは答えを持っている リーダーは方向性を定める
決まったプロセスが導入される 出発点として意図的に仮の作業プロセスが設けられる
変わることは大変な労力を伴う仕事だと考えられる
絶えず少しずつ変化することが日常的になる
一方通行のフィードバックがなされる
双方向のフィードバックがなされる
社員の判断は阻止される 社員の判断は不可欠である
上司を恐れるのは普通のことである 不安があると試みや分析や問題解決が妨げられる
目標:今日にも利益を勝ち取ること 目標:長期的な価値を生み出すこと
![Page 59: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/59.jpg)
効率を追求しながら実行する 学習しながら実行する
リーダーは答えを持っている リーダーは方向性を定める
決まったプロセスが導入される 出発点として意図的に仮の作業プロセスが設けられる
変わることは大変な労力を伴う仕事だと考えられる
絶えず少しずつ変化することが日常的になる
一方通行のフィードバックがなされる
双方向のフィードバックがなされる
社員の判断は阻止される 社員の判断は不可欠である
上司を恐れるのは普通のことである 不安があると試みや分析や問題解決が妨げられる
目標:今日にも利益を勝ち取ること 目標:長期的な価値を生み出すこと
当てはまる箇
所が多い
![Page 60: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/60.jpg)
DDDに関連するチームビルディングの
内容
![Page 61: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/61.jpg)
1つ目
![Page 62: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/62.jpg)
全員で設計
![Page 63: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/63.jpg)
メンバー全員が考える場を作る。メンバーの意見を引き出す。
メンバー間のギャップをなくす。
ファシリテーション重要
![Page 64: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/64.jpg)
メンバー全員が
同じ地図(ドメインモデル)を理解するため
全員で設計する目的
![Page 65: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/65.jpg)
設計の目的と効果をメンバー全員が理解して実装するため
全員で設計する目的
![Page 66: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/66.jpg)
熟練者のノウハウを
経験が浅いメンバーに
伝授するため
全員で設計する目的
![Page 67: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/67.jpg)
2つ目
![Page 68: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/68.jpg)
モデリング済みの部分も積極的にモデリング
![Page 69: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/69.jpg)
実施タイミング
大規模な機能強化時 プランニング時 バックログの着手時 コードレビュー時 朝会後に 行き詰った時
ホワイトボードがあれば
いつでもモデリングできる
![Page 70: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/70.jpg)
経験が浅いメンバーはモデリングする機会を増やすこ
とが成長につながる
既存部分をモデリングする目的
![Page 71: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/71.jpg)
新規加入メンバーはドメインを理解する
チャンス
既存部分をモデリングする目的
![Page 72: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/72.jpg)
モデリングは
メンバー自身に実施させる
大事なこと
![Page 73: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/73.jpg)
チームビルディングの結果
![Page 74: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/74.jpg)
チームの設計力が強化
![Page 75: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/75.jpg)
変更コスト /属人性が下がる
設計力が強化すると
![Page 76: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/76.jpg)
DDDを採用する価値
トータルコスト削減
変更コストを下げる
属人性を下げる
業務をコードで表現
DDDを採用する価値につながる。
![Page 77: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/77.jpg)
チームビルディング まとめ
DDDはチームビルディングが必須。
全員で設計することが大事。
既存部分も積極的にモデリングすることが大事。
![Page 78: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/78.jpg)
設計・実装の考え方 アプリケーションコード
![Page 79: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/79.jpg)
組織で行ったDDD勉強会のコードを紹介
![Page 80: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/80.jpg)
動作環境言語 : Java8
フレームワーク : SpringFramework
O/Rマッピング : MyBatis
DB : Oracle(ローカルはH2)
ビルドツール : Gradle
![Page 81: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/81.jpg)
ユースケース
![Page 82: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/82.jpg)
コンテキストマップ
![Page 83: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/83.jpg)
ドメインモデル
![Page 84: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/84.jpg)
![Page 85: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/85.jpg)
入会仕様入会可能条件20歳以上である。利用可能なクレジットカードを保持している。
接続コースは「ベーシック」または「ニコニコ」で申し込む。
入会の際、会員登録情報として申込者の個人情報を必要とする。
![Page 86: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/86.jpg)
レイヤー構造
ドメイン層
API層 アプリケーション層
インフラストラクチャ層
ドメイン層を独立させる
ドメイン層に依存させる
![Page 87: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/87.jpg)
ここからコードで
![Page 88: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/88.jpg)
アプリケーション層入会サービス
![Page 89: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/89.jpg)
アプリケーション層入会審査サービス
![Page 90: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/90.jpg)
ドメイン層会員エンティティ
![Page 91: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/91.jpg)
ドメイン層リアルタイム審査
![Page 92: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/92.jpg)
データソース層会員リポジトリ
![Page 93: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/93.jpg)
データアクセス層会員リポジトリのMapper
![Page 94: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/94.jpg)
設計・実装の考え方 DB設計
![Page 95: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/95.jpg)
イミュータブルデータモデル
![Page 96: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/96.jpg)
業務が発生すると、業務履歴をひたすら記録
( insert)
これだけ
![Page 97: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/97.jpg)
とある業務に対する変更業務も
当たり前のように記録( insert)
![Page 98: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/98.jpg)
変更業務でUpdateすると記録の改ざん
これは、極論です(笑)
![Page 99: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/99.jpg)
業務を中心に捉えると業務ごとにデータが残る方が自然
![Page 100: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/100.jpg)
現実はInsertオンリーなDB設計は難しい
![Page 101: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/101.jpg)
テーブルの種類
Eventテーブル業務が発生するとひたすら insertしていくテーブル。
Stateテーブル業務が発生すると必要に応じて updateしていくテーブル。ステータスなど最新の情報を管理。
![Page 102: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/102.jpg)
Eventテーブルが中心。
Stateテーブルは補助。
![Page 103: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/103.jpg)
Stateテーブルの使いどころパフォーマンス改善が図れる場合。
DB側で業務イベントの発生ルールを完璧にコントロールしたい場合。(詳細は後程。)
![Page 104: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/104.jpg)
Stateテーブルはデータアクセス層
の関心ごとで利用
![Page 105: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/105.jpg)
イミュータブルデータモデルを徹底すると
副次効果としてNULL項目が減る!
![Page 106: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/106.jpg)
具体的な話
![Page 107: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/107.jpg)
DDD勉強会のDB設計
![Page 108: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/108.jpg)
biglobeID入会日
biglobeID(FK)退会日
入会 退会
会員に関連するテーブル
![Page 109: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/109.jpg)
abc123452015/10/10
abc123452016/10/10
退会イベント入会イベント
入会 退会
業務が発生すると、関連するテーブルに業務履歴を記録( insert)
![Page 110: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/110.jpg)
biglobeID入会日退会日
会員
ミュータブルデータモデル
だけ
![Page 111: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/111.jpg)
abc123452015/10/10null
abc123452015/10/102016/10/10
会員 会員
update
退会イベント入会イベント
![Page 112: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/112.jpg)
もう少し難しく
![Page 113: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/113.jpg)
契約エンティティに対するDB設計の場合
申込中
契約中
解約予約中
解約済
申込キャンセル
![Page 114: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/114.jpg)
申込 ID申込 ID(FK)
申込契約
申込 ID(FK)
キャンセル
解約 ID申込 ID(FK)解約日
解約
解約 ID(FK)解約キャンセル
![Page 115: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/115.jpg)
申込 ID申込 ID(FK)
申込契約
申込 ID(FK)
キャンセル
解約 ID申込 ID(FK)解約日
解約
解約 ID(FK)解約キャンセル各テーブルの外部キーにより
業務イベントの流れをコントロール
![Page 116: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/116.jpg)
これにStateテーブルを足すなら
![Page 117: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/117.jpg)
申込 ID申込 ID(FK)
申込契約
申込 ID(FK)
キャンセル解約 ID申込 ID(FK)
解約
解約 ID(FK)解約キャンセル
申込 ID(FK)
ステータス
![Page 118: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/118.jpg)
申込 ID申込 ID(FK)
申込契約
申込 ID(FK)
キャンセル解約 ID申込 ID(FK)
解約
解約 ID(FK)解約キャンセル
申込 ID(FK)
ステータス
契約とキャンセルは排他な関係。
![Page 119: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/119.jpg)
契約とキャンセルが同時に発生した場合、アプリケーションコードと Eventテーブルだけで、この制約を実現できない。
Stateテーブル更新時のWhere句でステータスも条件(ステータス=申込中)に入れることにより、この制約を維持できる。
![Page 120: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/120.jpg)
申込 ID申込 ID(FK)
申込契約
申込 ID(FK)
キャンセル解約 ID申込 ID(FK)
解約
解約 ID(FK)解約キャンセル
申込 ID(FK)
ステータス
解約キャンセルするユーザが少ないと判断して、 Stateテーブルは導入しない。最新の解約レコードから判断。
![Page 121: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/121.jpg)
失敗談
![Page 122: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/122.jpg)
ドメインモデル関連ドメインモデルが古い
ドメイン層関連Policyクラスの乱立
![Page 123: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/123.jpg)
データアクセス層関連Repositoryの saveメソッド
他集約の Repositoryを操作
SQLに業務ロジックが混在
![Page 124: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/124.jpg)
失敗談 ドメインモデルが古い
![Page 125: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/125.jpg)
ドメインモデルが古い内容日々変化するドメインモデルが最新化されない。
問題点値オブジェクトを全部管理していたので、更新が追い付かない。最新のドメインモデルが把握できない。
対策最初に作成するドメインモデルと Keepするドメインモデルを分離。Keepのドメインモデルは重要な概念や本質のみ。
![Page 126: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/126.jpg)
ドメインモデルが古い
最初に作成するドメインモデル
![Page 127: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/127.jpg)
ドメインモデルが古い
Keepするドメインモデル
![Page 128: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/128.jpg)
失敗談 Policyクラスの乱立
![Page 129: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/129.jpg)
Policyクラスの乱立内容業務チェックのために、ドメイン層に Policyクラスを用意。
問題点エンティティから業務ロジックが抜けていく(エンティティ貧血症)。
対策基本的には、エンティティに業務チェックを記述。明示的にクラス化したい業務チェックのみ、専用のクラスを用意。
![Page 130: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/130.jpg)
Policyクラスの乱立
Policyパッケージを作った時点で負け
![Page 131: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/131.jpg)
失敗談 Repositoryの saveメソッド
![Page 132: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/132.jpg)
Repositoryの saveメソッド内容永続化のメソッドを saveメソッドのみで対応。
問題点テーブル構成がドメイン層に浸食。saveメソッドでどのテーブルが登録・更新されるか不明。saveメソッドをメンテナンスできるメンバーが限定。
対策業務イベントごとに専用のメソッドを用意。
![Page 133: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/133.jpg)
失敗談 他集約の Repositoryを操作
![Page 134: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/134.jpg)
他集約の Repositoryを操作内容他集約の Repositoryをデータアクセス層で操作。
問題点アプリケーション層のコードだけでは関連する集約が把握できず、全てのコードを読む必要がある。
影響範囲の特定に時間がかかる。ミスする。
対策他集約の Repositoryは操作しない。
![Page 135: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/135.jpg)
失敗談 SQLに業務ロジックが混在
![Page 136: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/136.jpg)
SQLに業務ロジックが混在内容SelectのWhere句に業務ロジックが記述。
問題点業務ロジックがドメイン層から流出。いつかの仕様変更でバグの温床に。
対策可能な限り業務ロジックはドメイン層に集約。
![Page 137: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/137.jpg)
検索条件は主キーのみにしてステータスの絞り込み条件はド
メイン層で記述
![Page 138: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/138.jpg)
まとめ
![Page 139: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/139.jpg)
DDD本と現場での実践を行ったり来たりして
理解を深めていくことが重要
![Page 140: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/140.jpg)
サービスが存在する限り
変化し続け成長し続け
価値を届け続けるソフトウェアを作ることが重要
![Page 141: 20151110 ドメイン駆動設計によるサービス開発](https://reader033.vdocuments.site/reader033/viewer/2022042605/5871365e1a28abf0568b5cfd/html5/thumbnails/141.jpg)
ご静聴ありがとうございました。