shape

Dodam - プロジェクト型深夜自習の申請機能を実装する

概要

Dodam の深夜自習機能を拡張し、クエリを最適化する

技術スタック

  • Java

    Java

  • Spring Boot

    Spring Boot

  • Spring JPA

    Spring JPA

  • MySQL

    MySQL

  • Redis

    Redis

  • Docker Compose

    Docker Compose

  • AWS

    AWS

  • GitHub Actions

    GitHub Actions

  • Git

    Git

チーム

9名(バックエンド2名、Web3名、Android2名、iOS2名)

期間

2025.04 ~ 2025.05

関連リンク

実装コードWebサービス

詳細

  1. 私が担当した部分
    • プロジェクト単位の深夜自習申請を実装しました。学生は日付・時間・プロジェクト内容を入力し、チームメンバーを選択して申請します。
    • 学生の申請や教師による状態変更(承認・却下)の際には、プロジェクトリーダーを含む参加者全員の申請状態を一括で更新する必要がありました。
  2. 初期のテーブル構造
    • 個人向けの深夜自習申請機能はすでに存在していました。MVP 開発時には既存の一般深夜自習テーブルを再利用し、別途プロジェクトテーブルを作成して、プロジェクト ID を外部キーとして保存しました。
    初期のテーブル構造 1
    初期のテーブル構造 2
  3. 問題点
    • プロジェクト照会時に不要な WHERE 句が生成されていました。JPA が深夜自習レコードを検索する際、project_id の有無で自習の種別を区別する必要があり、リクエストごとに不要な WHERE 条件が追加されていました。
    • 繰り返し処理の多用と SQL クエリの頻発により、JPA の N+1 問題と高い時間計算量が課題となっていました。
  4. 改善後のテーブル構造
    • night_study、night_study_project、night_study_project_member の各テーブルへ正規化しました。
    • 繰り返し処理に頼るのではなく、JPA と JPQL で IN、JOIN、EXISTS などを用いて時間計算量を削減しました。
    改善後のテーブル構造 1
    改善後のテーブル構造 2
    改善後のテーブル構造 3
  5. 結果
    • POST リクエストで平均 320ms → 87ms、PATCH リクエストで 624ms → 49ms へと応答時間を短縮しました。
    • プロジェクト照会時に不要なクエリ(JOIN、WHERE など)が発生しなくなりました。
  6. リファクタリング前
      リファクタリング前 1
      リファクタリング前 2
      リファクタリング前 3
    • リファクタリング後
        リファクタリング後 1
        リファクタリング後 2
        リファクタリング後 3