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 人、Web 3 人、Android 2 人、iOS 2 人)

期間

2025.04 ~ 2025.05

相關連結

實作程式碼網頁服務

詳細內容

  1. 我的貢獻
    • 實作了以專案為單位的深夜自習申請。學生輸入日期、時間與專案內容,選擇組員後即可提出申請。
    • 在學生提出申請,或教師變更狀態(核准/駁回)時,必須一併更新包含專案負責人在內的所有參與者的申請狀態。
  2. 初期資料表結構
    • 個人深夜自習申請功能原本就已存在。開發 MVP 時,我們沿用既有的一般深夜自習資料表,並另外建立一張專案資料表,以外鍵(FK)方式取得並儲存專案 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