詳細內容
- 社團開設功能實作
- 輸入社團名稱、開設理由、初始成員與社團介紹,即可開設社團。
- 社長可以向學生發送入社邀請。
- 教師可以審核社團開設申請後,決定核准或駁回。
- 學生可以查看自己開設申請的狀態。
- 社團入社申請邏輯實作
- 實作了讓使用者依照第一到第三志願的順序申請入社的邏輯。
- 由於社團分為正式(課程)社團與自主組織社團,因此也需要提供申請加入自主社團的功能。
- 入社申請的接受、待處理與拒絕功能
- 社長開設社團時,可以選擇社團的成員。
- 在該學生本人接受之前,無法將其加入為社員。
- 因此將入社邀請的狀態區分為已接受、待處理與已拒絕,讓社長能清楚掌握有意加入自己社團的學生。
- 2025 年 3 月,大邱軟體 Meister 高中第 10 屆新生與在校生的社團申請作業實際採用了此功能。
- 疑難排解
- ☄️ 問題背景
- 社團功能最初開發時,規劃是讓學生只申請一個自己想加入的正式(課程)社團。但因客戶(學校)要求變更邏輯,我必須在短時間內實作出讓學生分別申請第一、第二、第三志願後,再隨機決定入社成員的邏輯。
- 重構過程中,我發現 ClubMemberRepository 可能會出現 JPA 的 N+1 問題。
- ⭐️ 解決方法
- 我採用了優先順序分配演算法(Priority-based Allocation Algorithm)。透過此演算法,能依照學生的申請優先順序,將有限的資源(社團名額)做最佳化分配。
- 透過 processAllPriorities 方法,實作了依優先順序處理學生申請的機制;當某個社團額滿時,可將後續志願的申請者移至其下一志願的社團。
- 利用 assignedStudents 集合徹底防止同一名學生被重複分配;分配後立即將該學生加入集合,以阻擋再次分配。
- 我透過 @EntityGraph(attributePaths = {"club"}) 套用 Fetch Join,使社團實體能藉由 JOIN 查詢一併載入。藉此減少了不必要的額外查詢,並提升了回應速度。