Slide 1

Slide 1 text

ドメインロジックで 考えるテスタビリティ レバテック開発部 内藤 翔太

Slide 2

Slide 2 text

| © 2024 Levtech Co., Ltd. 2 レバテック開発部 / ITSプロダクト開発グループ / 契約請求ドメインチーム 内藤 翔太 SHOTA NAITO ・2023年04月 レバレジーズ株式会社に新卒入社 ・2023年11月 レバテック開発部に異動 ・直近は、システムのリプレースに取り組んでいます!

Slide 3

Slide 3 text

| © 2024 Levtech Co., Ltd. 3 ● はじめに ● ドメイン / ドメインロジックとは? ● ドメインロジックを SQL に含めると? ● ドメインロジックをドメインモデルに閉じる ● まとめ アジェンダ

Slide 4

Slide 4 text

| © 2024 Levtech Co., Ltd. 4 ● はじめに ● ドメイン / ドメインロジックとは? ● ドメインロジックを SQL に含めると? ● ドメインロジックをドメインモデルに閉じる ● まとめ アジェンダ

Slide 5

Slide 5 text

| © 2024 Levtech Co., Ltd. 5 今日伝えたいこと 1. ドメインロジックをドメインモデルに閉じて   自動テストしやすい設計を目指しましょう。 2. とはいえ、必ずしもそれが正解になるわけでは   ないので注意しましょう。

Slide 6

Slide 6 text

| © 2024 Levtech Co., Ltd. 6 ● はじめに ● ドメイン / ドメインロジックとは? ● ドメインロジックを SQL に含めると? ● ドメインロジックをドメインモデルに閉じる ● まとめ アジェンダ

Slide 7

Slide 7 text

| © 2024 Levtech Co., Ltd. 7 ドメインとは? ドメイン / ドメインロジックとは? ドメインとは、ソフトウェアが解決しようとする問題領域 のこと (例: ECサイトなら「注文」「顧客」「商品」など)

Slide 8

Slide 8 text

| © 2024 Levtech Co., Ltd. 8 ドメインロジックとは? ドメイン / ドメインロジックとは? 例: 「顧客のロイヤルティポイントに応じて割引率を変える」など ● ロイヤルティポイントが 1,000 以上 の場合、注文金額の 10 %割引 ● ロイヤルティポイントが 500 以上 1,000 未満 の場合、注文金額の 5 %割引 ● ロイヤルティポイントが 500未満 の場合、割引なし ドメインに存在するルールや制約、業務内容を反映した処理

Slide 9

Slide 9 text

| © 2024 Levtech Co., Ltd. 9 ● はじめに ● ドメイン / ドメインロジックとは? ● ドメインロジックを SQL に含めると? ● ドメインロジックをドメインモデルに閉じる ● まとめ アジェンダ

Slide 10

Slide 10 text

| © 2024 Levtech Co., Ltd. 10 ドメインロジックを SQL に含めると? 想定するアーキテクチャ プレゼンテーション ユースケース ドメイン インフラストラクチャ レイヤードアーキテクチャ with DIP バックエンド

Slide 11

Slide 11 text

| © 2024 Levtech Co., Ltd. 11 ドメインロジックを SQL に含めると? 実装のイメージ プレゼンテーション ユースケース ドメイン インフラストラクチャ ドメインロジック ※ わかりやすさのため $queryRaw を使用

Slide 12

Slide 12 text

| © 2024 Levtech Co., Ltd. 12 ドメインロジックを SQL に含めると? 実装のイメージ プレゼンテーション ユースケース ドメイン インフラストラクチャ

Slide 13

Slide 13 text

| © 2024 Levtech Co., Ltd. 13 ドメインロジックを SQL に含めると? 単体テストとして書くと...(インフラ層で書くことを想定) ● データベース環境のセットアップ ● 必要なデータ挿入 ● クエリ実行と結果検証

Slide 14

Slide 14 text

| © 2024 Levtech Co., Ltd. 14 ドメインロジックを SQL に含めると? 単体テストとして書くと...(インフラ層で書くことを想定) ● データベース環境のセットアップ ● 必要なデータ挿入 ● クエリ実行と結果検証 単体テストでやるにもあまりにフィードバックが遅すぎる... 単体テストの定義 ● 1単位の振る舞いを検証すること ● 実行時間が短いこと ● 他のテスト・ケースから隔離された状態で実行されること 出典: 単体テストの考え方/使い方 p.28

Slide 15

Slide 15 text

| © 2024 Levtech Co., Ltd. 15 ドメインロジックを SQL に含めると? 単体テストとして書くと...(インフラ層で書くことを想定) ● データベース環境のセットアップ ● 必要なデータ挿入 ● クエリ実行と結果検証 単体テストでやるにもあまりにフィードバックが遅すぎる... 単体テストの定義 ● 1単位の振る舞いを検証すること ● 実行時間が短いこと ● 他のテスト・ケースから隔離された状態で実行されること 出典: 単体テストの考え方/使い方 p.28

Slide 16

Slide 16 text

| © 2024 Levtech Co., Ltd. 16 ドメインロジックを SQL に含めると? 統合テストとして書くと...(ユースケース層で書くことを想定) 注文ユースケースがこうなっていた場合... ・割引計算ロジック(3 パターン) ・ポイント付与ロジック(4 パターン) ・送料計算ロジック(3 パターン) ・....

Slide 17

Slide 17 text

| © 2024 Levtech Co., Ltd. 17 ドメインロジックを SQL に含めると? 統合テストとして書くと...(ユースケース層で書くことを想定) 注文ユースケースがこうなっていた場合... ・割引計算ロジック(3 パターン) ・ポイント付与ロジック(4 パターン) ・送料計算ロジック(3 パターン) ・.... 1. データ準備が膨大になる 条件が掛け算的に増えるため、すべてのパターン を網羅するには膨大なデータセットが必要になる 2. テストの保守コストが上がる 他の処理との結合部分も含めてテストする必要が あるため、修正や原因特定に時間と労力がかかる 3. フィードバックループが長くなる データベースに依存するため、テスト実行時間が 長くなり、効率が低下する ※ DB は、管理下にある依存を想定し、モックしない

Slide 18

Slide 18 text

| © 2024 Levtech Co., Ltd. 18 ドメインロジックを SQL に含めると? 統合テストとして書くと...(ユースケース層で書くことを想定) 注文ユースケースがこうなっていた場合... ・割引計算ロジック(3 パターン) ・ポイント付与ロジック(4 パターン) ・送料計算ロジック(3 パターン) ・.... 1. データ準備が膨大になる 条件が掛け算的に増えるため、すべてのパターン を網羅するには膨大なデータセットが必要になる 2. テストの保守コストが上がる 他の処理との結合部分も含めてテストする必要が あるため、修正や原因特定に時間と労力がかかる 3. フィードバックループが長くなる データベースに依存するため、テスト実行時間が 長くなり、効率が低下する ※ DB は、管理下にある依存を想定し、モックしない

Slide 19

Slide 19 text

| © 2024 Levtech Co., Ltd. 19 ドメインロジックを SQL に含めると? ちなみに本題からは逸れるが他にも... 1. 再利用性の欠如(新規開発観点) ● ドメインロジックは既存のクエリ内に埋め込まれているため、 再利用できず、同じロジックを新しいクエリにも書き直す必要がある 2. 保守性の低下(既存コードの変更観点) ● ビジネスルール変更時に、SQL 内で同じロジックを使っている箇所すべてを 手動で修正する必要があり、作業コストやミスのリスクが増大する

Slide 20

Slide 20 text

| © 2024 Levtech Co., Ltd. 20 ● はじめに ● ドメイン / ドメインロジックとは? ● ドメインロジックを SQL に含めると? ● ドメインロジックをドメインモデルに閉じる ● まとめ アジェンダ

Slide 21

Slide 21 text

| © 2024 Levtech Co., Ltd. 21 ドメインロジックをドメインモデルに閉じる 実装のイメージ プレゼンテーション ユースケース ドメイン インフラストラクチャ ドメインロジック

Slide 22

Slide 22 text

| © 2024 Levtech Co., Ltd. 22 ドメインロジックをドメインモデルに閉じる 実装のイメージ ※ わかりやすさのため $queryRaw を使用 プレゼンテーション ユースケース ドメイン インフラストラクチャ

Slide 23

Slide 23 text

| © 2024 Levtech Co., Ltd. 23 ドメインロジックをドメインモデルに閉じる 実装のイメージ プレゼンテーション ユースケース ドメイン インフラストラクチャ

Slide 24

Slide 24 text

| © 2024 Levtech Co., Ltd. 24 ドメインロジックをドメインモデルに閉じる 単体テストとして書くと...(ドメイン層で書くことを想定)

Slide 25

Slide 25 text

| © 2024 Levtech Co., Ltd. 25 ドメインロジックをドメインモデルに閉じる これにより以下のようなメリットが! 1. テスタビリティの向上 ● ドメインモデル単位の単体テストでドメインロジックを網羅的に検証できるため、 統合テストでは最低限のデータの用意 / ケースの確認で済む ● ドメインロジックのテストをデータベースを使用せずに書くことができるので、 フィードバックループが短縮される 2. 再利用性向上(新規開発観点) ● 抽出されたロジックは他の機能やコンポーネントでも再利用可能で冗長性や不整合が低減できる 3. 保守性の向上(既存コードの変更観点) ● ロジックが一箇所に集約されるため、一貫性が保たれ変更時の影響範囲も明確になり、修正コストが低減できる

Slide 26

Slide 26 text

| © 2024 Levtech Co., Ltd. 26 ドメインロジックをドメインモデルに閉じる これにより以下のようなメリットが! 1. テスタビリティの向上 ● ドメインモデル単位の単体テストでドメインロジックを網羅的に検証できるため、 統合テストでは最低限のデータの用意 / ケースの確認で済む ● ドメインロジックのテストをデータベースを使用せずに書くことができるので、 フィードバックループが短縮される 2. 再利用性向上(新規開発観点) ● 抽出されたロジックは他の機能やコンポーネントでも再利用可能で冗長性や不整合が低減できる 3. 保守性の向上(既存コードの変更観点) ● ロジックが一箇所に集約されるため、一貫性が保たれ変更時の影響範囲も明確になり、修正コストが低減できる

Slide 27

Slide 27 text

| © 2024 Levtech Co., Ltd. 27 ドメインロジックをドメインモデルに閉じる つまりどういう状態になったのか? Large 手動テスト Medium Small コスト 高 低 速度 速 遅 参考:開発生産性の観点から考える自動テスト(2024/06版) t-wada

Slide 28

Slide 28 text

| © 2024 Levtech Co., Ltd. 28 ドメインロジックをドメインモデルに閉じる つまりどういう状態になったのか? Large Small 手動テスト Medium Medium Small Large コスト 高 低 速度 速 遅 参考:開発生産性の観点から考える自動テスト(2024/06版) t-wada

Slide 29

Slide 29 text

| © 2024 Levtech Co., Ltd. 29 ドメインロジックをドメインモデルに閉じる つまりどういう状態になったのか? Large Small 手動テスト Medium Medium Small Large コスト 高 低 速度 速 遅 参考:開発生産性の観点から考える自動テスト(2024/06版) t-wada 理想とするテストピラミッドに近づいていってる!

Slide 30

Slide 30 text

| © 2024 Levtech Co., Ltd. 30 ドメインロジックをドメインモデルに閉じる とはいえ... パフォーマンスへの懸念も考慮すべき ドメインロジックをドメインモデルに置くと データ量や処理内容によってはパフォーマンス低下の可能性がある

Slide 31

Slide 31 text

| © 2024 Levtech Co., Ltd. 31 ● はじめに ● ドメイン / ドメインロジックとは? ● ドメインロジックを SQL に含めると? ● ドメインロジックをドメインモデルに閉じる ● まとめ アジェンダ

Slide 32

Slide 32 text

| © 2024 Levtech Co., Ltd. 32 まとめ ● ドメインロジックを SQL に含めると、テストのためのデータベースセット アップやデータ準備が必要となり、テストの実行効率が低下する ● ドメインロジックをドメインモデルに閉じることで、データベースに依存 しない単体テストが可能になり、テストの保守性と実行効率が向上し、理 想となるテストピラミッドへと近づけることが可能 ● ただし、大量データを扱う処理などでは SQL での実装が適している場合も あるため、パフォーマンス要件との兼ね合いを考慮し、ドメインロジック の配置を適切に選択することが重要

Slide 33

Slide 33 text

| © 2024 Levtech Co., Ltd. 33 今日伝えたいこと 1. ドメインロジックをドメインモデルに閉じて   自動テストしやすい設計を目指しましょう。 2. とはいえ、必ずしもそれが正解になるわけでは   ないので注意しましょう。 再掲

Slide 34

Slide 34 text

宣伝

Slide 35

Slide 35 text

🎄レバテック開発部アドベントカレンダーやってます ! レバテック開発部 Advent Calendar 2024

Slide 36

Slide 36 text

No content