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