Submit Search
Upload
DDDとクリーンアーキテクチャでサーバーアプリケーションを作っている話
•
34 likes
•
22,592 views
JustSystems Corporation
Follow
JJUG CCC 2018 Spring の発表資料です。 #jjug #ccc_a8
Read less
Read more
Software
Report
Share
Report
Share
1 of 46
Download now
Download to read offline
Recommended
強いて言えば「集約どう実装するのかな、を考える」な話
強いて言えば「集約どう実装するのかな、を考える」な話
Yoshitaka Kawashima
ドメイン駆動設計サンプルコードの徹底解説
ドメイン駆動設計サンプルコードの徹底解説
増田 亨
ドメイン駆動で開発する ラフスケッチから実装まで
ドメイン駆動で開発する ラフスケッチから実装まで
増田 亨
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
pospome
イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)
Yoshitaka Kawashima
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
Koichiro Matsuoka
マルチテナント化で知っておきたいデータベースのこと
マルチテナント化で知っておきたいデータベースのこと
Amazon Web Services Japan
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture
Atsushi Nakamura
Recommended
強いて言えば「集約どう実装するのかな、を考える」な話
強いて言えば「集約どう実装するのかな、を考える」な話
Yoshitaka Kawashima
ドメイン駆動設計サンプルコードの徹底解説
ドメイン駆動設計サンプルコードの徹底解説
増田 亨
ドメイン駆動で開発する ラフスケッチから実装まで
ドメイン駆動で開発する ラフスケッチから実装まで
増田 亨
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
pospome
イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)
Yoshitaka Kawashima
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
Koichiro Matsuoka
マルチテナント化で知っておきたいデータベースのこと
マルチテナント化で知っておきたいデータベースのこと
Amazon Web Services Japan
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture
Atsushi Nakamura
世界でいちばんわかりやすいドメイン駆動設計
世界でいちばんわかりやすいドメイン駆動設計
増田 亨
Java ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsug
Masatoshi Tada
ドメイン駆動設計に15年取り組んでわかったこと
ドメイン駆動設計に15年取り組んでわかったこと
増田 亨
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
Koichiro Matsuoka
ドメイン駆動設計 ( DDD ) をやってみよう
ドメイン駆動設計 ( DDD ) をやってみよう
増田 亨
リッチなドメインモデル 名前探し
リッチなドメインモデル 名前探し
増田 亨
マルチテナントのアプリケーション実装〜実践編〜
マルチテナントのアプリケーション実装〜実践編〜
Yoshiki Nakagawa
イミュータブルデータモデルの極意
イミュータブルデータモデルの極意
Yoshitaka Kawashima
ドメインオブジェクトの見つけ方・作り方・育て方
ドメインオブジェクトの見つけ方・作り方・育て方
増田 亨
SQL上級者こそ知って欲しい、なぜO/Rマッパーが重要か?
SQL上級者こそ知って欲しい、なぜO/Rマッパーが重要か?
kwatch
3週連続DDDその3 ドメイン駆動設計 戦略的設計
3週連続DDDその3 ドメイン駆動設計 戦略的設計
増田 亨
例外設計における大罪
例外設計における大罪
Takuto Wada
マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!
mosa siru
ドメイン駆動設計 基本を理解する
ドメイン駆動設計 基本を理解する
増田 亨
トランザクションスクリプトのすすめ
トランザクションスクリプトのすすめ
pospome
ドメイン駆動設計 本格入門
ドメイン駆動設計 本格入門
増田 亨
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)
NTT DATA Technology & Innovation
組織にテストを書く文化を根付かせる戦略と戦術
組織にテストを書く文化を根付かせる戦略と戦術
Takuto Wada
エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織
Takafumi ONAKA
ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門
増田 亨
2021/03/19 パブリッククラウドを活かす運用プロセス自動化
2021/03/19 パブリッククラウドを活かす運用プロセス自動化
Issei Hiraoka
20180723 PFNの研究基盤 / PFN research system infrastructure
20180723 PFNの研究基盤 / PFN research system infrastructure
Preferred Networks
More Related Content
What's hot
世界でいちばんわかりやすいドメイン駆動設計
世界でいちばんわかりやすいドメイン駆動設計
増田 亨
Java ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsug
Masatoshi Tada
ドメイン駆動設計に15年取り組んでわかったこと
ドメイン駆動設計に15年取り組んでわかったこと
増田 亨
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
Koichiro Matsuoka
ドメイン駆動設計 ( DDD ) をやってみよう
ドメイン駆動設計 ( DDD ) をやってみよう
増田 亨
リッチなドメインモデル 名前探し
リッチなドメインモデル 名前探し
増田 亨
マルチテナントのアプリケーション実装〜実践編〜
マルチテナントのアプリケーション実装〜実践編〜
Yoshiki Nakagawa
イミュータブルデータモデルの極意
イミュータブルデータモデルの極意
Yoshitaka Kawashima
ドメインオブジェクトの見つけ方・作り方・育て方
ドメインオブジェクトの見つけ方・作り方・育て方
増田 亨
SQL上級者こそ知って欲しい、なぜO/Rマッパーが重要か?
SQL上級者こそ知って欲しい、なぜO/Rマッパーが重要か?
kwatch
3週連続DDDその3 ドメイン駆動設計 戦略的設計
3週連続DDDその3 ドメイン駆動設計 戦略的設計
増田 亨
例外設計における大罪
例外設計における大罪
Takuto Wada
マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!
mosa siru
ドメイン駆動設計 基本を理解する
ドメイン駆動設計 基本を理解する
増田 亨
トランザクションスクリプトのすすめ
トランザクションスクリプトのすすめ
pospome
ドメイン駆動設計 本格入門
ドメイン駆動設計 本格入門
増田 亨
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)
NTT DATA Technology & Innovation
組織にテストを書く文化を根付かせる戦略と戦術
組織にテストを書く文化を根付かせる戦略と戦術
Takuto Wada
エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織
Takafumi ONAKA
ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門
増田 亨
What's hot
(20)
世界でいちばんわかりやすいドメイン駆動設計
世界でいちばんわかりやすいドメイン駆動設計
Java ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsug
ドメイン駆動設計に15年取り組んでわかったこと
ドメイン駆動設計に15年取り組んでわかったこと
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
ドメイン駆動設計 ( DDD ) をやってみよう
ドメイン駆動設計 ( DDD ) をやってみよう
リッチなドメインモデル 名前探し
リッチなドメインモデル 名前探し
マルチテナントのアプリケーション実装〜実践編〜
マルチテナントのアプリケーション実装〜実践編〜
イミュータブルデータモデルの極意
イミュータブルデータモデルの極意
ドメインオブジェクトの見つけ方・作り方・育て方
ドメインオブジェクトの見つけ方・作り方・育て方
SQL上級者こそ知って欲しい、なぜO/Rマッパーが重要か?
SQL上級者こそ知って欲しい、なぜO/Rマッパーが重要か?
3週連続DDDその3 ドメイン駆動設計 戦略的設計
3週連続DDDその3 ドメイン駆動設計 戦略的設計
例外設計における大罪
例外設計における大罪
マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!
ドメイン駆動設計 基本を理解する
ドメイン駆動設計 基本を理解する
トランザクションスクリプトのすすめ
トランザクションスクリプトのすすめ
ドメイン駆動設計 本格入門
ドメイン駆動設計 本格入門
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)
組織にテストを書く文化を根付かせる戦略と戦術
組織にテストを書く文化を根付かせる戦略と戦術
エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織
ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門
Similar to DDDとクリーンアーキテクチャでサーバーアプリケーションを作っている話
2021/03/19 パブリッククラウドを活かす運用プロセス自動化
2021/03/19 パブリッククラウドを活かす運用プロセス自動化
Issei Hiraoka
20180723 PFNの研究基盤 / PFN research system infrastructure
20180723 PFNの研究基盤 / PFN research system infrastructure
Preferred Networks
SHOWROOMとDeNAで取り組んだライブ配信基盤刷新・超低遅延ライブ配信の裏側【DeNA TechCon 2020 ライブ配信】
SHOWROOMとDeNAで取り組んだライブ配信基盤刷新・超低遅延ライブ配信の裏側【DeNA TechCon 2020 ライブ配信】
DeNA
JavaでWebサービスを作り続けるための戦略と戦術 JJUG-CCC-2018-Spring-g1
JavaでWebサービスを作り続けるための戦略と戦術 JJUG-CCC-2018-Spring-g1
Y Watanabe
Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話
Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話
JustSystems Corporation
Container deployment on Azure
Container deployment on Azure
Tsukasa Kato
Raybarcodeイベント参加者管理でも使い方ガイド
Raybarcodeイベント参加者管理でも使い方ガイド
GrapeCity, inc.
20220409 AWS BLEA 開発にあたって検討したこと
20220409 AWS BLEA 開発にあたって検討したこと
Amazon Web Services Japan
わんくま同盟名古屋勉強会18回目 ASP.NET MVC3を利用したHTML5な画面開発~クラウドも有るよ!~
わんくま同盟名古屋勉強会18回目 ASP.NET MVC3を利用したHTML5な画面開発~クラウドも有るよ!~
normalian
Azure Functions あれこれ
Azure Functions あれこれ
Yasuaki Matsuda
RayBarcode イベント参加者デモ使い方ガイド
RayBarcode イベント参加者デモ使い方ガイド
GrapeCity, inc.
QualityとDeliveryを両立させるために僕らがやったこと
QualityとDeliveryを両立させるために僕らがやったこと
Takeshi Sekiguchi
【de:code 2020】 Azure Kubernetes Service と Azure DevOps による GitOps の実践
【de:code 2020】 Azure Kubernetes Service と Azure DevOps による GitOps の実践
日本マイクロソフト株式会社
プログラミング生放送第7回 比べてみようPaaSクラウド~Azure VS GAE~
プログラミング生放送第7回 比べてみようPaaSクラウド~Azure VS GAE~
normalian
Developer's summit 2021 [19-D-5]なぜ今、ローコードなのか
Developer's summit 2021 [19-D-5]なぜ今、ローコードなのか
Tetsuo Ajima
グリー株式会社『私たちが GCP を使い始めた本当の理由』第 9 回 Google Cloud INSIDE Game & Apps
グリー株式会社『私たちが GCP を使い始めた本当の理由』第 9 回 Google Cloud INSIDE Game & Apps
Google Cloud Platform - Japan
私たちがGCPを使い始めた本当の理由
私たちがGCPを使い始めた本当の理由
gree_tech
GraphQLはどんな時に使うか
GraphQLはどんな時に使うか
Yutaka Tachibana
機械学習 / Deep Learning 大全 (5) Tool編
機械学習 / Deep Learning 大全 (5) Tool編
Daiyu Hatakeyama
Azure DevOps で始めるスタートダッシュ
Azure DevOps で始めるスタートダッシュ
Yasuaki Matsuda
Similar to DDDとクリーンアーキテクチャでサーバーアプリケーションを作っている話
(20)
2021/03/19 パブリッククラウドを活かす運用プロセス自動化
2021/03/19 パブリッククラウドを活かす運用プロセス自動化
20180723 PFNの研究基盤 / PFN research system infrastructure
20180723 PFNの研究基盤 / PFN research system infrastructure
SHOWROOMとDeNAで取り組んだライブ配信基盤刷新・超低遅延ライブ配信の裏側【DeNA TechCon 2020 ライブ配信】
SHOWROOMとDeNAで取り組んだライブ配信基盤刷新・超低遅延ライブ配信の裏側【DeNA TechCon 2020 ライブ配信】
JavaでWebサービスを作り続けるための戦略と戦術 JJUG-CCC-2018-Spring-g1
JavaでWebサービスを作り続けるための戦略と戦術 JJUG-CCC-2018-Spring-g1
Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話
Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話
Container deployment on Azure
Container deployment on Azure
Raybarcodeイベント参加者管理でも使い方ガイド
Raybarcodeイベント参加者管理でも使い方ガイド
20220409 AWS BLEA 開発にあたって検討したこと
20220409 AWS BLEA 開発にあたって検討したこと
わんくま同盟名古屋勉強会18回目 ASP.NET MVC3を利用したHTML5な画面開発~クラウドも有るよ!~
わんくま同盟名古屋勉強会18回目 ASP.NET MVC3を利用したHTML5な画面開発~クラウドも有るよ!~
Azure Functions あれこれ
Azure Functions あれこれ
RayBarcode イベント参加者デモ使い方ガイド
RayBarcode イベント参加者デモ使い方ガイド
QualityとDeliveryを両立させるために僕らがやったこと
QualityとDeliveryを両立させるために僕らがやったこと
【de:code 2020】 Azure Kubernetes Service と Azure DevOps による GitOps の実践
【de:code 2020】 Azure Kubernetes Service と Azure DevOps による GitOps の実践
プログラミング生放送第7回 比べてみようPaaSクラウド~Azure VS GAE~
プログラミング生放送第7回 比べてみようPaaSクラウド~Azure VS GAE~
Developer's summit 2021 [19-D-5]なぜ今、ローコードなのか
Developer's summit 2021 [19-D-5]なぜ今、ローコードなのか
グリー株式会社『私たちが GCP を使い始めた本当の理由』第 9 回 Google Cloud INSIDE Game & Apps
グリー株式会社『私たちが GCP を使い始めた本当の理由』第 9 回 Google Cloud INSIDE Game & Apps
私たちがGCPを使い始めた本当の理由
私たちがGCPを使い始めた本当の理由
GraphQLはどんな時に使うか
GraphQLはどんな時に使うか
機械学習 / Deep Learning 大全 (5) Tool編
機械学習 / Deep Learning 大全 (5) Tool編
Azure DevOps で始めるスタートダッシュ
Azure DevOps で始めるスタートダッシュ
More from JustSystems Corporation
「技術内閣制度」〜2年間やってきて得られた事とこれから〜 #devsumi
「技術内閣制度」〜2年間やってきて得られた事とこれから〜 #devsumi
JustSystems Corporation
事業に貢献する商品開発と その成長の仕組み作り ~これからのエンジニアに必要とされるスキルとは~
事業に貢献する商品開発と その成長の仕組み作り ~これからのエンジニアに必要とされるスキルとは~
JustSystems Corporation
現役23名のPM:タイプ別マネジメントパターン
現役23名のPM:タイプ別マネジメントパターン
JustSystems Corporation
JavaでインメモリSQLエンジンを作ってみた
JavaでインメモリSQLエンジンを作ってみた
JustSystems Corporation
JustTechTalk#11_スマイルゼミ顧客満足度への貢献
JustTechTalk#11_スマイルゼミ顧客満足度への貢献
JustSystems Corporation
ピュアJavaだと思った?残念androidでした~いつからAndroidをJavaだと錯覚していた?~
ピュアJavaだと思った?残念androidでした~いつからAndroidをJavaだと錯覚していた?~
JustSystems Corporation
最新のJava言語仕様で見るモジュールシステム #jjug
最新のJava言語仕様で見るモジュールシステム #jjug
JustSystems Corporation
「書ける」から「できる」になれる! ~Javaメモリ節約ノウハウ話~
「書ける」から「できる」になれる! ~Javaメモリ節約ノウハウ話~
JustSystems Corporation
JustTechTalk#10 React開発における自動テスト実践
JustTechTalk#10 React開発における自動テスト実践
JustSystems Corporation
JustTechTalk#10windowsアプリでのテスト自動化事例
JustTechTalk#10windowsアプリでのテスト自動化事例
JustSystems Corporation
インパス! あのこれダメッス! ~Javaコードレビューの指摘ポイント10選~
インパス! あのこれダメッス! ~Javaコードレビューの指摘ポイント10選~
JustSystems Corporation
AWS運用における最適パターンの徹底活用
AWS運用における最適パターンの徹底活用
JustSystems Corporation
ジャストシステムのDevOps実例 今後の取り組み
ジャストシステムのDevOps実例 今後の取り組み
JustSystems Corporation
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
JustSystems Corporation
Kotlin is charming; The reasons Java engineers should start Kotlin.
Kotlin is charming; The reasons Java engineers should start Kotlin.
JustSystems Corporation
CSSレイアウトでなぜ失敗するか?
CSSレイアウトでなぜ失敗するか?
JustSystems Corporation
Selenium WebDriver + python で E2Eテスト自動化
Selenium WebDriver + python で E2Eテスト自動化
JustSystems Corporation
TypeScriptの大規模開発への適用
TypeScriptの大規模開発への適用
JustSystems Corporation
UX実現に向けた社内の取り組みについて-訴求ファーストによる商品開発-
UX実現に向けた社内の取り組みについて-訴求ファーストによる商品開発-
JustSystems Corporation
「訴求ファースト」と「こだわり駆動開発」~教育、医療、もの書き市場で戦うプロダクトマネージャーの考え方~
「訴求ファースト」と「こだわり駆動開発」~教育、医療、もの書き市場で戦うプロダクトマネージャーの考え方~
JustSystems Corporation
More from JustSystems Corporation
(20)
「技術内閣制度」〜2年間やってきて得られた事とこれから〜 #devsumi
「技術内閣制度」〜2年間やってきて得られた事とこれから〜 #devsumi
事業に貢献する商品開発と その成長の仕組み作り ~これからのエンジニアに必要とされるスキルとは~
事業に貢献する商品開発と その成長の仕組み作り ~これからのエンジニアに必要とされるスキルとは~
現役23名のPM:タイプ別マネジメントパターン
現役23名のPM:タイプ別マネジメントパターン
JavaでインメモリSQLエンジンを作ってみた
JavaでインメモリSQLエンジンを作ってみた
JustTechTalk#11_スマイルゼミ顧客満足度への貢献
JustTechTalk#11_スマイルゼミ顧客満足度への貢献
ピュアJavaだと思った?残念androidでした~いつからAndroidをJavaだと錯覚していた?~
ピュアJavaだと思った?残念androidでした~いつからAndroidをJavaだと錯覚していた?~
最新のJava言語仕様で見るモジュールシステム #jjug
最新のJava言語仕様で見るモジュールシステム #jjug
「書ける」から「できる」になれる! ~Javaメモリ節約ノウハウ話~
「書ける」から「できる」になれる! ~Javaメモリ節約ノウハウ話~
JustTechTalk#10 React開発における自動テスト実践
JustTechTalk#10 React開発における自動テスト実践
JustTechTalk#10windowsアプリでのテスト自動化事例
JustTechTalk#10windowsアプリでのテスト自動化事例
インパス! あのこれダメッス! ~Javaコードレビューの指摘ポイント10選~
インパス! あのこれダメッス! ~Javaコードレビューの指摘ポイント10選~
AWS運用における最適パターンの徹底活用
AWS運用における最適パターンの徹底活用
ジャストシステムのDevOps実例 今後の取り組み
ジャストシステムのDevOps実例 今後の取り組み
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
Kotlin is charming; The reasons Java engineers should start Kotlin.
Kotlin is charming; The reasons Java engineers should start Kotlin.
CSSレイアウトでなぜ失敗するか?
CSSレイアウトでなぜ失敗するか?
Selenium WebDriver + python で E2Eテスト自動化
Selenium WebDriver + python で E2Eテスト自動化
TypeScriptの大規模開発への適用
TypeScriptの大規模開発への適用
UX実現に向けた社内の取り組みについて-訴求ファーストによる商品開発-
UX実現に向けた社内の取り組みについて-訴求ファーストによる商品開発-
「訴求ファースト」と「こだわり駆動開発」~教育、医療、もの書き市場で戦うプロダクトマネージャーの考え方~
「訴求ファースト」と「こだわり駆動開発」~教育、医療、もの書き市場で戦うプロダクトマネージャーの考え方~
DDDとクリーンアーキテクチャでサーバーアプリケーションを作っている話
1.
DDDとクリーンアーキテク チャでサーバーアプリケー ションを作っている話 #jjug_ccc #ccc_a8 JJUG CCC
2018 Spring 2018/05/26
2.
自己紹介 • 株式会社ジャストシステム 福嶋 航 •
Twitter @fukushiw • Java歴約20年、JavaでWebサービス作っています • #Java100 本ノックの人 https://github.com/JustSystems/java-100practices
3.
このセッションについて • 現在進行中の開発プロジェクトでの試行内容を共 有いたします • 未リリースのWebサービスのため、サービス名称や サービスの内容は明らかにしていません •
DDD(ドメイン駆動設計)やクリーンアーキテクチャを 採用しているつもりですが、間違いがあるかもしれま せん • 試行錯誤過程にあるため、ぜひセッション後や懇親 会でぜひ情報交換させてください
4.
セッションの流れ 1.DDDやクリーンアーキテクチャを 採用した理由 2.設計段階で行ったこと 3.実装前に準備したこと 4.実装してみてわかったこと 5.やってよかったことと変えたいこと 6.まとめ
5.
セッションの流れ 1.DDDやクリーンアーキテクチャを 採用した理由 2.設計段階で行ったこと 3.実装前に準備したこと 4.実装してみてわかったこと 5.やってよかったことと変えたいこと 6.まとめ Java っぽい ところ
6.
1 DDDやクリーン アーキテクチャを 採用した理由
7.
突貫工事はうまくいかない • コンセプトは決まった • 主要な機能について、仕様概要は決まった •
コア機能のいくつかはパーツが存在していたので それらを使って動くものが早く見たい • 機能仕様を作りながらプロトタイピングを進めた • いろいろ押し押しになりプロトタイプがいつの間に かプロダクションコードになりそうになった このプログラムはリリースされなかった。 いや、リリースできなかった。
8.
当時のシステム構成図(模式図) THE WEB SERVER コア機能
外部連携 THE RDB キャッシュ キャッシュキャッシュ
9.
もろもろの反省と対策 過去の 失敗 対策 サーバから全データをクライア ントにダウンロードして処理 全コンポーネントが外部連携 先のデータモデルと強く結合 ビジネスロジックの主体となる コンポーネントが不在 • 異常なトラフィック量 • クライアント処理負荷増 •
外部連携先の仕様変更 の反映が全コンポーネント に影響 • 各コンポーネントはコアロ ジックに集中できず変換 処理を負担 必要なデータを必要なだけ 処理する データ統合を廃止し各コン ポーネントで独立してDBアク セスする ビジネスロジックを独立したコ ンポーネントとする ドメイン駆動設計+クリーンアーキテクチャを導入 ※社内での説明資料をほぼコピーしています
10.
2 設計段階で 行ったこと
11.
知識をつける
12.
設計の順番 ドメイン駆動設計の進め方は顧客業務(ドメイン)を分析し、それをどう解決(境界 づけられたコンテキスト)するかを決めることである。これを実践するために以下の順序 で分析・設計を進めた。 (このサービス)とは何であるか(エレベーターピッチ)を定義 機能仕様・利用シナリオを定義 ロバストネス分析 境界づけられたコンテキストの抽出 コンテキストマップの作成 非機能 要件も 定義 ※社内での説明資料をほぼコピーしています
13.
設計の順番 ドメイン駆動設計の進め方は顧客業務(ドメイン)を分析し、それをどう解決(境界 づけられたコンテキスト)するかを決めることである。これを実践するために以下の順序 で分析・設計を進めた。 (このサービス)とは何であるか(エレベーターピッチ)を定義 機能仕様・利用シナリオを定義 ロバストネス分析 境界づけられたコンテキストの抽出 コンテキストマップの作成 非機能 要件も 定義 ※社内での説明資料をほぼコピーしています 次のページから このあたりを説明
14.
ロバストネス分析 • ロバストネス分析は、ユースケースのように文章 で記述された要求から分析レベルのオブジェクト を見つけ、適切な単位にまとめることができるもの です。 https://www.ogis-ri.co.jp/otc/hiroba/technical/RobustnessAnalysis/RA1/ より引用
15.
ロバストネス分析をどう使ったか • あらかじめユースケースシナリオを作成しておく • シナリオを満たす機能をどう作ったらよいか考える •
バウンダリ、エンティティ、コントロールでそれを表 現する バウンダリ・・・ 外部とのインタフェース。○○画面とか、cronなどを割り当てた。 エンティティ・・・ 管理するデータ。RDBなどに保存するものなどを割り当てた。 コントロール・・・ 処理。ユーザー認証とか、値の取得などを割り当てた。
16.
ロバストネス分析の成果物(一部) • ノートに手書き • 書いては消し •
二人で分析し 良さそうな方を 採用
17.
コンテキストマップ • ロバストネス図で出てきた機能について、似たも のを集めて「境界づけられたコンテキスト」を規定 • 書いて→直して→書いて→直して •
コンテキスト間の関係について慎重に判断した • パートナーシップ • 顧客/供給者 • 順応者
18.
(コア) (業務) (メイン1) (業務) (メイン2) (業務) (メイン3) (業務) (メイン4-1) (メイン4-2) (業務) (サブ2) (業務) (サブ3) (業務) (サブ1-1) (サブ1-2) (サブ1-3) (業務) (サブ4-1)
(サブ4-2) (業務) ユーザー 管理 ユーザー管理 ログ 監視 (事業) ↔ : パートナーシップ → → → : 顧客/供給者 → : 順応者(下流側に腐敗防止層を用意) 汎用サブドメイン 支援サブドメイン コアドメイン 境界づけられたコンテキスト
19.
新システム構成(模式図) UI コア機能 外部連携 RDB キャッシュ キャッシュ キャッシュ 主要機能3 RDB 主要機能2
RDB 主要機能1 RDB サブ機能3 サブ機能2 サブ機能1 サブ機能6 サブ機能5 サブ機能4 RDB キャッシュ キャッシュ キャッシュ RDB キャッシュ サブ機能7 RDB 各機能(コンテキスト)は それぞれDockerコンテナとして動作 (複数配置しALBで分散)し、 REST APIでやりとり :
20.
One more thing...
21.
ユビキタス言語 • コンテキストごとに独自の用語を制定 • システムとしてはコンテキスト間で用語を統一し た方がわかりやすく、同じ用語を別コンテキストで 別の意味で使う、ということはしていない •
プログラム上での命名も決めた→これは好評
22.
3 実装前に 準備したこと
23.
ルール • Gitリポジトリの運用ルール • コーディング規約 •
クリーンアーキテクチャでの実装 • パッケージの分け方 • リポジトリの実装 • REST API規約 • REST APIのエラー応答に使用する例外クラス • ログレベル • 利用するサードパーティソフトウェア など
24.
ルール • Gitリポジトリの運用ルール • コーディング規約 •
クリーンアーキテクチャでの実装 • パッケージの分け方 • リポジトリの実装 • REST API規約 • REST APIのエラー応答に使用する例外クラス • ログレベル • 利用するサードパーティソフトウェア など 次のページから このあたりを説明
25.
コーディング規約 • 自社コーディング規約に準ずる • Oracle
のコード規約 http://www.oracle.com/technetwork/art icles/javase/codeconvtoc-136057.html +独自条項いくつか • ソースコードレビュー観点(「テストにここ出ます」) • 特に重要な4つの心構え「別の人が保守できるの か」「今後の拡張性はあるか」「無駄はないか」「影 響範囲が広すぎないか」をベースに言語共通29項 目+Java固有11項目をWikiに記載
26.
ソースコードレビュー観点(抜粋1) • 基本 • APIの使い方が妥当か(目的に即したAPIをAPI の仕様通りに使用しているか) •
数値でよいところを文字列で処理していないか。 • 適切な型を使うべき • 保守性 • 必要十分なコメントが書けているか。 • 実装の理由や背景をコメントに詳しく書く(コードの内容 そのものよりもコードで表現できないものを残す) • クラスやメソッド・関数のドキュメントもきちんと書く(例外 もぬかりなく)
27.
ソースコードレビュー観点(抜粋2) • 安全性 • 渡されてきた引数は使用する前にバリデーションされ ているか。 •
マルチスレッドでアクセスされる変数の値の書き換え はアトミックな代入が保証されているか。 • キャッシュを利用する場合に、作りっぱなしではなくラ イフサイクルが考慮されているか。 • ストリームが閉じられているか。ExceptionやError が起きても大丈夫か。 • メソッドの戻り値が不必要にnullになっていないか? (呼び出し元でnullになりうる意識があるか)
28.
各コンテキスト内のアーキテクチャ
29.
パッケージ構成 com.justsystems.(サービス名) .(コンテキスト名) .interfaces .controller .presenter .gateway .usecases .domains .model .(集約名) .utils Controller, Translator Presenter, Translator Gateway,
Translator Usecase Entity, ValueObject, Service, Repository
30.
特別なパッケージ • com.justsystems.(サービス名).pl • 公開された言語
(Published Language) • このパッケージ配下に (コンテキスト名) のパッケージを 作り、そのコンテキストの入出力データを定義 • 各コンテキストは呼び出し先の pl 配下のクラスを使用 • com.justsystems.(サービス名).library • ビジネスロジックに全く関与しない、複数コンテキスト間 で共有する価値のあるライブラリ
31.
リポジトリの実装 • RDBへはSpring Data
JPA (Hibernate)で アクセス • Domainではインタフェースだけ定義して Gatewayで実処理 Usecase Domain Gateway class Hoge Usecase interface Hoge Repository interface JpaHoge Repository class Hoge Repository Impl
32.
現在 絶賛コーディング・ テスト中
33.
4 実装してみて わかったこと
34.
DDD/クリーンアーキテクチャの恩恵 • 関心事に集中できる • @Transactional
で考えないといけない範囲が狭 くてイイ! • 用語が統一されているので外部仕様からコードまで すっきりとつながる! • 処理の流れがパターン化されているので追いや すい • 道を外れているのも気づきやすく、コードレビューで フィードバック
35.
変換の嵐... • ControllerのTranslator • PL→ドメインオブジェクトの変換 •
GatewayのTranslator • ドメインオブジェクト→PLの変換 • PL→ドメインオブジェクトの変換 • ドメインオブジェクト→RDB用エンティティの変換 • RDB用エンティティ→ドメインオブジェクトの変換 • PresenterのTranslator • ドメインオブジェクト→PLの変換
36.
変換の嵐:図にするとこんな感じ Controller Gateway Presenter Translator
Translator Translator Translator 他のコンテキストやストレージとの間で変換が走る Domain Object PL PL PL Entity
37.
変換の嵐:より正確にはこんな感じ 変換が必要なオブジェクトごとにTranslatorを準備 Controller Gateway Presenter Translator
Translator Translator Translator Domain Object PL PL PL Entity Translator Translator Translator Translator Translator Translator Translator Translator Translator Translator Translator Translator Translator Translator Translator Translator
38.
規約で決めたこと以外はみんなバラバラ • REST API通信の実装 •
RestTemplate を使用することは決めていた • 各コンテキストでそれぞれ RestTemplate を使った 通信ロジックが生まれそうになった(リトライ処理等) →早くできた人のものを共通ライブラリ化 (library) • サービスのビジネスロジックに全く依存しない部分を基底ク ラスで定義 • 各コンテキストでサブクラスを作成し必要なところだけオー バーライド(通信先のコンフィグなど)
39.
nullチェックの方法もバラバラ • @lombok.NonNull • Objects.requireNonNull(argument) •
if (argument == null) { throw new IllegalArgumentException(...); } これは統一をあきらめた (適材適所)
40.
本当にバラバラ • @lombok.RequiredArgsConstructor vs @lombok.Builder •
中にはコンストラクタも @Builder もあるクラスも… • static な Translator vs DI可能なTranslator • Stream API vs `for` • java.text.SimpleDateFormat vs java.time.format.DateTimeFormatter • これはさすがに DateTimeFormatter にそろえた
41.
5 やってみてよかった ことと変えたいこと
42.
よかった:モノリスからの解放 • 各担当者が自分の担当部分のビジネスロジック に集中できる • RDB/キャッシュ分離で責任範囲が明確 •
他コンテキストのRDBには一切アクセスできない • データの重複保持もない
43.
よかった:新技術への挑戦 • Docker • AWS
ECS • AWS Fargate にしたかったがまだ日本に来ておら ずレイテンシの観点から断念 • GitLab CI and more
44.
改善の余地あり:ルールの徹底 • キックオフ時に説明会を開催 • こういうアーキテクチャで~ •
こういうコーディング規約で~ • 質問は控えめ (ゼロではなかった) • そしてテストに出すといったところがアウト • マージリクエストへのコメントに同じことをよく書いているの でATOKが覚える 規約の浸透方法や内容に課題があるのかもしれない
45.
6 まとめ
46.
まとめ • 過去の失敗からDDDやクリーンアーキテクチャを 採用するに至った • シナリオ→ロバストネス分析→コンテキストマップ •
ユビキタス言語でプログラム上の命名も定義 • 規約・レビュー観点などルールを決めた • 決めていないところはバラバラになった • アーキテクチャをパッケージに落とし込んだ • 新しいことに挑戦できたことはよかった • ルールの徹底方法は改善の余地あり
Download now