詳細
- 部活動の開設機能を実装する
- 部活動は、名称・開設理由・初期メンバー・紹介文を入力して開設できます。
- 部長は学生に部員への招待を送ることができます。
- 教師は部活動の開設申請を確認したうえで、開設を承認または却下できます。
- 学生は自分の開設申請の状況を確認できます。
- 部活動の入部申請ロジックを実装する
- 第1希望から第3希望まで、希望する部活動の順にユーザーが入部を申請できるロジックを実装しました。
- 部活動は正規課程(創意的体験活動)の部と自主部活動に分かれるため、自主部活動へ入部を申請できる機能も必要でした。
- 入部の承認・保留・却下機能を実装する
- 部長は部活動を開設する際に、その部のメンバーを選択できます。
- 学生本人の承認がなければ、その学生を部員として追加できないようにする必要がありました。
- そこで部員への招待リクエストを「承認済み」「保留中」「却下」に分類し、部長が自分の部活動への入部を希望する学生を明確に把握できるようにしました。
- 2025年3月、大邱ソフトウェアマイスター高校 10期の新入生および在校生の部活動申請に実運用されました。
- トラブルシューティング
- ☄️ 問題の背景
- 部活動機能の開発当初は、学生が希望する正規課程の部活動を1つだけ申請するロジックで計画されていました。しかしクライアント(学校)のロジック変更要求により、第1・第2・第3希望をそれぞれ申請したうえでランダムに入部メンバーを決定するロジックを、短期間で構築しなければなりませんでした。
- リファクタリングの途中、ClubMemberRepository で JPA の N+1 問題が発生する可能性を発見しました。
- ⭐️ 解決方法
- 優先順位ベースの割り当てアルゴリズム(Priority-based Allocation Algorithm)を採用しました。このアルゴリズムにより、限られたリソース(部活動の定員)を学生の応募優先順位に応じて最適に配分できるようにしました。
- processAllPriorities メソッドによって学生の応募を優先順位に従って処理できるように実装し、ある部活動が定員に達した場合には次点の応募者を次の優先順位の部活動へ移動できるようにしました。
- assignedStudents セットを活用して同一学生の重複割り当てを根本から防止し、割り当てと同時に学生をこのセットへ追加することで再割り当てを防ぎました。
- @EntityGraph(attributePaths = {"club"}) による Fetch Join を適用し、JOIN クエリで部活動エンティティを併せて取得するようにしました。これにより不要な追加クエリを削減し、応答速度を向上させました。