Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
レイヤードアーキテクチャ(改) とDDD
Search
Tech Leverages
June 30, 2023
Technology
1
5.7k
レイヤードアーキテクチャ(改) とDDD
レイヤードアーキテクチャ(改) とDDD
Tech Leverages
June 30, 2023
Tweet
Share
More Decks by Tech Leverages
See All by Tech Leverages
レバテック開発部 技術広報 これまでとこれから
leveragestech
0
75
改めて「型」について考えてみよう
leveragestech
1
50
苦しいTiDBへの移行を乗り越えて快適な運用を目指す
leveragestech
0
630
Biome で Format と Lint のストレスをゼロに
leveragestech
0
54
10倍スケールを見越した データモデリングのリアーキテクチャ
leveragestech
1
150
理想のパスワードは?
leveragestech
1
93
データエンジニアとしてのキャリア戦略 〜これからの挑戦〜
leveragestech
0
100
ドメインロジックで考えるテスタビリティ
leveragestech
1
330
専門領域に特化したチームの挑戦
leveragestech
0
460
Other Decks in Technology
See All in Technology
【Developers Summit 2025】プロダクトエンジニアから学ぶ、 ユーザーにより高い価値を届ける技術
niwatakeru
2
1.4k
Developer Summit 2025 [14-D-1] Yuki Hattori
yuhattor
19
6.2k
Classmethod AI Talks(CATs) #16 司会進行スライド(2025.02.12) / classmethod-ai-talks-aka-cats_moderator-slides_vol16_2025-02-12
shinyaa31
0
110
自動テストの世界に、この5年間で起きたこと
autifyhq
10
8.6k
RSNA2024振り返り
nanachi
0
590
開発スピードは上がっている…品質はどうする? スピードと品質を両立させるためのプロダクト開発の進め方とは #DevSumi #DevSumiB / Agile And Quality
nihonbuson
2
3k
Classmethod AI Talks(CATs) #17 司会進行スライド(2025.02.19) / classmethod-ai-talks-aka-cats_moderator-slides_vol17_2025-02-19
shinyaa31
0
120
AndroidXR 開発ツールごとの できることできないこと
donabe3
0
130
Helm , Kustomize に代わる !? 次世代 k8s パッケージマネージャー Glasskube 入門 / glasskube-entry
parupappa2929
0
250
転生CISOサバイバル・ガイド / CISO Career Transition Survival Guide
kanny
3
1k
一度 Expo の採用を断念したけど、 再度 Expo の導入を検討している話
ichiki1023
1
170
インフラをつくるとはどういうことなのか、 あるいはPlatform Engineeringについて
nwiizo
5
2.6k
Featured
See All Featured
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
175
51k
Fontdeck: Realign not Redesign
paulrobertlloyd
83
5.4k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
507
140k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
133
33k
Code Reviewing Like a Champion
maltzj
521
39k
A designer walks into a library…
pauljervisheath
205
24k
Bash Introduction
62gerente
611
210k
Principles of Awesome APIs and How to Build Them.
keavy
126
17k
BBQ
matthewcrist
87
9.5k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
27
1.9k
Unsuck your backbone
ammeep
669
57k
VelocityConf: Rendering Performance Case Studies
addyosmani
328
24k
Transcript
レイヤードアーキテクチャ (とDDD) テックフェス2023春 松浪 亮
Profile 松浪 亮(まつなみ りょう) Matsunami Ryo 出⾝:⼤阪府 ⼊社:2022/01 所属:レバテックID開発チーム 最近のお気に⼊り
今回お話しする内容は... レイヤードアーキテクチャ
10か⽉くらい前にも話してたけど... ※ アーキテクチャスキルアッププロジェクト
発表して半年経ってから いちゃもん コメントが...
要約すると、 「内容薄いからもっと詳しく書け」 発表して半年経ってから いちゃもん コメントが...
レイヤードアーキテクチャ(改) (とDDD) テックフェス2023春 松浪 亮
今回お話しする内容は... [1] レイヤードアーキテクチャについて、おさらい
今回お話しする内容は... [1] レイヤードアーキテクチャについて、おさらい [2] コードを元にレイヤードアーキテクチャを解説
今回お話しする内容は... [1] レイヤードアーキテクチャについて、おさらい [2] コードを元にレイヤードアーキテクチャを解説 [3] DI(依存性の注⼊)でコードをドメイン中⼼に作り変える
⽬次 1. レイヤードアーキテクチャについて 2. コードでレイヤードアーキテクチャを理解する 3. DIでドメイン中⼼に作り変える 4. まとめ
⽬次 1. レイヤードアーキテクチャについて 2. コードでレイヤードアーキテクチャを理解する 3. DIでドメイン中⼼に作り変える 4. まとめ
レイヤードアーキテクチャ エリック・エヴァンスのドメイン駆動設計(翔泳社)
4つのレイヤーに分けてモジュールを配置 ▪Infrastructure層 データストアへの永続化や外部APIとの通信など技術 的な機能を実装する ▪Domain層 ドメイン(ソフトウェアで解決したい対象領域のこ と)モデルのルール/制約を実装する ▪Application層 ドメイン層を組み合わせてユースケースを実装する ▪Presentation層
UIやユニットテストなど、アプリケーション(ユース ケース)層を呼び出すコードを実装する
ルールは1つだけ エリック・エヴァンスのドメイン駆動設計(翔泳社) 依存OK 依存NG
依存関係について 依存する側 依存される側 依存⽅向
依存関係について 依存する側 依存される側 依存⽅向 変更 依存関係について
依存関係について 依存する側 依存される側 依存⽅向 変更 影響あり 依存関係について
依存関係について 依存する側 依存される側 依存⽅向 変更 影響あり 変更 依存関係について
依存関係について 依存する側 依存される側 依存⽅向 変更 影響あり 変更 影響なし 依存関係について
依存関係について 依存する側は影響を与えないので改修・変更が容易になり、 依存される側は変更の影響を受けないので依存する側よりも安定する。 依存関係について 依存する側 依存される側 依存⽅向 変更 影響あり 変更
影響なし
依存関係について 変更頻度が⾼い機能は依存する側(上位の層)に、 変更の影響を受けたくない機能は依存される側(下位の層)に設計すべき。 依存する側は影響を与えないので改修・変更が容易になり、 依存される側は変更の影響を受けないので依存する側よりも安定する。 依存関係について 依存する側 依存される側 依存⽅向 変更
影響あり 変更 影響なし
レイヤードアーキテクチャの問題点 エリック・エヴァンスのドメイン駆動設計(翔泳社) DomainがInfrastructureに依存してよいことになっている → 変更の影響を受けたくないはずのDomainが依存する側にある
レイヤードアーキテクチャの問題点2 エリック・エヴァンスのドメイン駆動設計(翔泳社) 理論上はPresentationもInfrastructureに依存してよい → Presentationからデータを更新できてしまう
ドメインルールがDomain層から漏れ出てしまう エリック・エヴァンスのドメイン駆動設計(翔泳社) 理論上はPresentationもInfrastructureに依存してよい → Presentationからデータを更新できてしまう → 本来、Domainにあるべき実装を Presentationに実装できてしまう ドメイン
ロジック
全体を⾒ないと仕様を把握できなくなる エリック・エヴァンスのドメイン駆動設計(翔泳社) 理論上はPresentationもInfrastructureに依存してよい → Presentationからデータを更新できてしまう → 本来、Domainにあるべき実装を Presentationに実装できてしまう →
修正箇所が分散する → 達成したいことは全体を⾒ないとわからない ドメイン ロジック ドメイン ロジック
解決策 エリック・エヴァンスのドメイン駆動設計(翔泳社) Infrastructureからの依存の向きを変える → 依存性を逆転させる
つまり... ドメイン駆動設計 モデリング/実装ガイド(松岡 幸一郎さん:著) ドメインを中⼼に置く → ドメイン駆動設計
つまり... ドメイン駆動設計 モデリング/実装ガイド(松岡 幸一郎さん:著) 詳しくは...
⽬次 1. レイヤードアーキテクチャについて 2. コードでレイヤードアーキテクチャを理解する 3. DIでドメイン中⼼に作り変える 4. まとめ
例(コードサンプル) • ユーザ情報を登録する超シンプルなWebアプリケーションを想定 ◦ ⼊⼒として、name(⽒名)とemail(メールアドレス)を受け取る ◦ バリデーションチェックを実施する ◦ バリデーションに問題なければRDBに登録する •
レイヤードアーキテクチャに則って実装してみる ◦ Presentation層 ▪ → Application層 • → Domain層 ◦ → Infrastructure層
Presentation層
Presentation層 Presentation層
Presentation層 Presentation層
Application層
Application層
Application層
Domain層
Domain層 新規ユーザを⽣成時のドメイン知識(ルール/制約)を実装 →バリデーションチェックや初期設定など →常に正しいインスタンスしか存在させなくする
Infrastructure層
結果... EndPoint("/users/create") UseCase Entity Repository
⽬次 1. レイヤードアーキテクチャについて 2. コードでレイヤードアーキテクチャを理解する 3. DIでドメイン中⼼に作り変える 4. まとめ
ドメインを中⼼にするには... EndPoint("/users/create") UseCase Entity Repository ← Repositoryを...
EndPoint("/users/create") UseCase Repository Repository Entity ↑ DI(依存性の注⼊)する こうする...!!
こうする...?? EndPoint("/users/create") UseCase Repository Repository Entity ↑ DI(依存性の注⼊)する
DI(依存性の注⼊)とは 依存性の注⼊(いぞんせいのちゅうにゅう、英: Dependency injection)とは、あるオブジェ クトや関数が、依存する他のオブジェクトや関数を受け取るデザインパターンである。 DIは制御の反転の⼀種で、オブジェクトの作成と利⽤について関⼼の分離を⾏い、疎結合な プログラムを実現することを⽬的としている。 by Wikipedia
DI(依存性の注⼊)とは?? 依存性の注⼊(いぞんせいのちゅうにゅう、英: Dependency injection)とは、あるオブジェ クトや関数が、依存する他のオブジェクトや関数を受け取るデザインパターンである。 DIは制御の反転の⼀種で、オブジェクトの作成と利⽤について関⼼の分離を⾏い、疎結合な プログラムを実現することを⽬的としている。 by Wikipedia
Presentation層
Presentation層
Presentation層
Application層
ドメインを中⼼にするために... ・Repositoryのインタフェースを⽤意する ・Infrastructureの実態をコンストラクタで渡す
ドメインを中⼼にするために... ・Repositoryのインタフェースを⽤意する ・Infrastructureの実態をコンストラクタで渡す → DI(依存性の注⼊)
Application層
Application層 Applicationからインタフェースを参照(依存)する形に なった → Repositoryのコードの詳細が⾒えなくなった → Infrastructureの実装に依存しなくなった!
Q.依存しなくなると何が嬉しいのか?
Q.依存しなくなると何が嬉しいのか? A.ユニットテストしやすくなる Q.依存しなくなると何が嬉しいのか?
ユニットテストでモックに差し替える ①インタフェースを実装したMockを⽤意する → 適当な値を返す ③RDBに接続しないでユニットテストができる ②コンストラクタでMockを渡す
例外のパターンもテストしやすい ①インタフェースを実装したMockを⽤意する → 例外を返す ③例外のパターンもユニットテストができる ②コンストラクタでMockを渡す
⽬次 1. レイヤードアーキテクチャについて 2. コードでレイヤードアーキテクチャを理解する 3. DIでドメイン中⼼に作り変える 4. まとめ
まとめ • レイヤードアーキテクチャは下記の概念に沿って設計する ◦ 4つのレイヤーで責務を分割する ◦ 常に上位から下位の⽅向に依存させる • ⽋点としてInfrastructure層に依存する設計となる ◦
依存関係を逆転させるためにDI(依存性の注⼊)を利⽤する ◦ DIによってドメインを中⼼とした設計にすることができる ▪ オニオンアーキテクチャが実現できる • Infrastructure層に依存させないことでテストしやすくなる ◦ Infrastructure層のコードの実態をMockに差し替えやすい
ご清聴ありがとうございました