1. 開発プロセス

採用する開発プロセスを決定する。

日付: 2024-11-13

ステータス

2024-11-13 提案されました

コンテキスト

mindmap
  root((開発プロセス))
   SCRUM
       原則
            経験プロセスを管理する
            自己組織化する
            コラボレーションする
            価値観に基づいて優先順位を付ける
            時間を区切る
            反復的に開発する
       価値基準
            確約
            勇気
            集中
            公開
            尊敬
       プロセス
            バックログを整理する
            スプリント計画セッションを開く
            スクラムスプリントを開始する
            デイリースクラムを開く
            スプリントレビューを開く
            スプリントレトロスペクティブを開く
       役割
            スクラムマスター
            プロダクトオーナー
            開発チーム
       アーティファクト
            プロダクトバックログ
            スプリントバックログ
            製品インクリメント
   XP
       5つの価値
            シンプルさ
            コミュニケーション
            フィードバック
            勇気
            尊重
       5つのルール
            計画
            管理
            設計
            コーディング
            テスト
      12のプラクティス
            計画ゲーム
            顧客テスト
            小規模リリース
            シンプルな設計
            ペアプログラミング
            テスト駆動開発
            リファクタリング
            集団所有権
            継続的インテグレーション
            持続可能なペース
            メタファー
            コーディング規約

アジャイル開発の中で、SCRUMXPが有名である。SCRUMは経験プロセスを管理することを重視し、XPはプラクティスを重視する。どちらもアジャイル開発の価値観を共有している。 今回は、どちらか一方を採用するか、または両方を組み合わせるかを決定する。

決定

XPを採用する、理由は以下の通り。

開発プロセスは以下の通り。

---
title: XP開発プロセス
---
stateDiagram-v2
    [*] --> リリース計画
    リリース計画 --> イテレーション計画
    イテレーション計画 --> コーディングとテスト
    コーディングとテスト --> イテレーションレビュー

    イテレーションレビュー --> [*]
    イテレーションレビュー --> イテレーション計画

影響

ポジティブ:

ネガティブ:

コプライアンス

各テーマは個別に検討する。

備考

2. シンプルな設計

設計アプローチに関して決定する

日付: 2024-11-14

ステータス

2024-11-14 提案されました

コンテキスト

mindmap
  root((設計))
   ユースケース
   ドメインモデル
   データモデル
   ユーザーインターフェース
        ビュー
        モデル
        インタラクション

アプリケーションを構成する設計要素に以下のものが含まれる。

決定

以下の設計プロセスを採用する。

---
title: 設計プロセス
---
stateDiagram-v2
    [*] --> ユースケース作成
    ユースケース作成 --> データモデル設計
    データモデル設計 --> ドメインモデル設計
    ドメインモデル設計 --> コーディングとテスト
    コーディングとテスト --> リファクタリング
    コーディングとテスト --> ユーザーインターフェース設計
    ユーザーインターフェース設計 --> コーディングとテスト
    コーディングとテスト --> リファクタリング

    リファクタリング --> [*]
    リファクタリング  --> ユースケース作成

影響

ポジティブ

ネガティブ

コプライアンス

開発支援ツールを使用して設計プロセスを実行する

備考

3. テスト駆動開発

テスト駆動開発の進め方についての決定

日付: 2024-11-14

ステータス

2024-11-14 提案されました

コンテキスト

mindmap
  root((テスト駆動開発))
    TODOリスト
    テストファースト
    仮実装
    三角測量
    リファクタリング
    テスト  
     単体テスト
     統合テスト
     受け入れテスト
%%{init: {'theme': 'base', 'themeVariables': { 'pie1': '#ffcc00', 'pie2': '#ff9900', 'pie3': '#ff6600' }}}%%
pie
    title テスティングピラミッド
    "単体テスト" : 70
    "統合テスト" : 20
    "E2Eテスト" : 10

ここで対象となるテストは単体テストである。

決定

コーディングとテストにおいていはテスト駆動開発の採用する。 理由は、設計のスピードアップと高品質なコードが期待できるから。

stateDiagram-v2
    [*] --> TODO: TDOリストを作成
    TODO --> Red: テストを書く
    Red --> Green: 最小限の実装
    Green --> Refactor: リファクタリング
    Refactor --> Red: 次のテストを書く
    Red: テストに失敗
    Green: テストに通る最小限の実装
    Refactor: コードの重複を除去してリファクタリング
    Refactor --> TODO: リファクタリングが完了したらTODOリストに戻る

影響

ポジティブ

ネガティブ

コプライアンス

CI/CDと組み合わせて実施する。

備考

4. リファクタリング

リファクタリングの方針を決定する。

日付: 2024-11-14

ステータス

2024-11-14 提案されました

コンテキスト

mindmap
  root(リファクタリング)
    抽出
      メソッドの抽出
      変数の抽出
      クラスの抽出
      インターフェースの抽出
    インライン
      メソッドのインライン化
      変数のインライン化
    移動
      メソッドの移動
      フィールドの移動
    リネーム
      メソッド名の変更
      変数名の変更
      クラス名の変更
    メソッドシグネチャの変更
      パラメータの追加
      パラメータの削除
      パラメータの並び替え
    一時変数を問い合わせに置き換え
    パラメータオブジェクトの導入
    継承を委譲に置き換え
    フィールドのカプセル化
    条件文の分解
    メソッド呼び出しの簡素化

決定

リファクタリングはカタログの語彙を使って意図を明確にする。

影響

ポジティブ

ネガティブ

コプライアンス

Gitのコミットメッセージにリファクタリングのカタログの語彙を使う。

備考

5. 継続的インテグレーション

継続的インテグレーションを導入する。

日付: 2024-11-14

ステータス

2024-11-14 提案されました

コンテキスト

%%{init: {'theme': 'base', 'themeVariables': { 'pie1': '#ffcc00', 'pie2': '#ff9900', 'pie3': '#ff6600' }}}%%
graph LR
  subgraph GitHub
    subgraph Repository
      Git
    end

    subgraph Continuous_Integration
      GitHub_Actions
    end
  end

  subgraph Vercel
    subgraph Production_Environment_Vercel
      UI
    end
  end

  subgraph Heroku
    subgraph Production_Environment_Heroku
      API
      DB
    end
  end

  開発者 --> Git
  Git --> API & UI
  API --> DB
  API -->|データのやり取り| UI
  Git --> GitHub_Actions
  利用者 --> UI

決定

継続的インテグレーションを導入する。理由は以下の通り。

影響

ポジティブ:

ネガティブ:

コプライアンス

GitHub Actionsを使用する。

備考

6. アプリケーションアーキーテクチャ

アプリケーションアーキテクチャについての決定を記述します。

日付: 2024-11-14

ステータス

2024-11-14 提案されました

コンテキスト

classDiagram
  class データベース

  class プレゼンテーション層 {
    Controller
  }

  class サービス層 {
    Service
  }

  class インフラストラクチャ層 {
    DataSource
  }

  class ドメイン層 {
    Model 
  }

    プレゼンテーション層 --> サービス層
    サービス層 --> インフラストラクチャ層
    サービス層 --> ドメイン層
    インフラストラクチャ層 --> データベース

決定

アーキテクチャスタイルは、レイヤードアーキテクチャを採用。 ドメイン層のアーキテクチャパターンはドメインモデルパターンを採用。

理由は、ドメインモデルパターンは、ビジネスロジックをドメインモデルに集約することで、ビジネスロジックの再利用性を高めることができるため。

影響

ポジティブ:

ネガティブ:

コプライアンス

ArchUnitを使用して、アーキテクチャのコンプライアンスを確認する。

備考

7. プロジェクト構成

プロジェクトの構成についての決定

日付: 2024-11-25

ステータス

2024-11-25 提案されました

コンテキスト

単一のレポジトリで複数のアプリケーションを開発している。

graph TD
  subgraph プロジェクト
    subgraph バックエンド
        販売管理サービス
    end
    subgraph フロントエンド
        販売管理アプリケーション
    end
  end

また、ドキュメントや構築・運用コードも同じレポジトリで管理している。

graph TD
  subgraph プロジェクト
      subgraph ドキュメント
          ADR
          セットアップガイド
          業務分析
          アプリケーション仕様
      end
      subgraph 構築運用コード
          Dockerfile
          Gulpfile
          DBSchema
      end
  end

決定

以下のディレクトリ構成を採用する。

影響

ポジティブ:

ネガティブ:

コプライアンス

gulpのdevタスクで一連のビルドを実行する。

備考

7. プロジェクト構成

プロジェクトの構成についての決定

日付: 2024-11-25

ステータス

2024-11-25 提案されました

コンテキスト

単一のレポジトリで複数のアプリケーションを開発している。

graph TD
  subgraph プロジェクト
    subgraph バックエンド
        販売管理サービス
    end
    subgraph フロントエンド
        販売管理アプリケーション
    end
  end

また、ドキュメントや構築・運用コードも同じレポジトリで管理している。

graph TD
  subgraph プロジェクト
      subgraph ドキュメント
          ADR
          セットアップガイド
          業務分析
          アプリケーション仕様
      end
      subgraph 構築運用コード
          Dockerfile
          Gulpfile
          DBSchema
      end
  end

決定

以下のディレクトリ構成を採用する。

影響

ポジティブ:

ネガティブ:

コプライアンス

gulpのdevタスクで一連のビルドを実行する。

備考

8. 排他制御

データベースの排他制御についての方針を決定する。

日付: 2024-12-05

ステータス

2024-12-05 提案されました

コンテキスト

MyBatisを使用した排他制御には、以下の方法がある。

行ロック

悲観ロック

楽観ロック

決定

スケーラビリティを考慮し、楽観ロックを採用する。

楽観ロック対象は、集約ルートエンティティとする。

影響

ポジティブ:

ネガティブ:

コプライアンス

単体テストを実施し、楽観ロックが正しく機能することを確認する。

単体テストには、Testcontainersを使用する。

備考

9. E2Eテスト

E2Eテストを導入する。

日付: 2024-12-20

ステータス

2024-12-20 提案されました

コンテキスト

バックエンド、フロントエンドの変更時の影響範囲を確認するために、E2Eテストを導入する。

決定

E2Eテストには、Cypressを採用する。

影響

ポジティブ:

ネガティブ:

コプライアンス

CI/CDパイプラインにE2Eテストを組み込み、自動化する。

  e2e:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3

      - name: Set up JDK
        uses: actions/setup-java@v3
        with:
          java-version: '21'
          distribution: 'temurin'
      - name: Grant execute permission for Gradle wrapper
        run: chmod +x ./gradlew
        working-directory: app/backend/api
      - name: Build with Gradle in api directory
        run: ./gradlew build -x test
        working-directory: app/backend/api
      - name: Run with Gradle in api directory
        run: ./gradlew bootRun &
        working-directory: app/backend/api

      - name: Use Node.js latest
        uses: actions/setup-node@v3
        with:
          node-version: latest
          cache: 'npm'
      - run: npm ci
        working-directory: app/frontend
      - name: Cypress run
        uses: cypress-io/github-action@v5
        with:
          build: npm run build
          start: npm run dev
          wait-on: "http://localhost:5173"
          working-directory: app/frontend

タブを使うユーザーインターフェース部分は開発環境のみメニュー表示を環境変数で切り替えるなどの対応を行う。

<li className="nav-item">
    マスタ
    <ul className="nav-sub-list">
        <SubNavItem id="side-nav-department-nav" to="/department">部門</SubNavItem>
        <SubNavItem id="side-nav-employee-nav" to="/employee">社員</SubNavItem>
        <SubNavItem id="side-nav-product-nav" to="/product">商品</SubNavItem>
        { !Env.isProduction() && (
            <ul className="nav-sub-list">
                <SubNavItem id="side-nav-product-nav" to="/product-category">分類</SubNavItem>
                <SubNavItem id="side-nav-product-nav" to="/product-detail">詳細</SubNavItem>
            </ul>
        )}
    </ul>
</li>

備考