shape

도담도담 - 재학생들을 위한 동아리 신청 및 관리 기능 구현하고 운영하기

프로젝트 설명

대소고 10기 신입생 동아리 배정 책임지기

기술 스택

  • Java
  • Spring Boot
  • MySQL
  • Git
  • AWS
  • Docker
  • Docker Compose
  • GitHub Actions
  • Figma

참여인원

백엔드 3명

기간

2025.03

관련 링크

상세 내용

  1. 동아리 개설 기능 구현
    • 동아리는 이름, 개설 이유, 초기 멤버, 소개를 입력하여 동아리를 개설할 수 있습니다.
    • 부장은 학생에게 부원 제안을 보낼 수 있습니다.
    • 교사는 동아리 개설 신청을 검토 후 개설을 수락 또는 거절할 수 있습니다.
    • 학생은 나의 개설 신청 상태를 볼 수 있습니다.
    동아리 개설 기능 구현 1
  2. 동아리 입부 신청 로직 구현
    • 1지망부터 3지망까지 희망하는 동아리 순서대로 사용자가 입부 신청할 수 있는 로직을 구현하였습니다.
    • 동아리는 창체 동아리, 자율 동아리로 나누어지기에, 자율 동아리에 입부를 신청할 수 있는 기능도 필요하였습니다.
    동아리 입부 신청 로직 구현 1
  3. 입부 수락, 대기, 거절 기능 구현
    • 부장이 동아리를 개설할 때 동아리의 일원을 선택할 수 있습니다.
    • 학생의 수락이 없다면 해당 학생을 부원으로 추가할 수 없게 하여야만 했습니다.
    • 이에 따라 부원 제안 요청을 수락됨, 대기중, 거절됨으로 나누어 부장은 자신의 동아리에 입부를 희망하는 학생을 명확하게 알 수 있게 하였습니다.
    입부 수락, 대기, 거절 기능 구현 1
    입부 수락, 대기, 거절 기능 구현 2
  4. 2025년 3월 대구소프트웨어마이스터고 10기 신입생 및 재학생의 동아리 신청에 실사용 되었습니다.
      2025년 3월 대구소프트웨어마이스터고 10기 신입생 및 재학생의 동아리 신청에 실사용 되었습니다. 1
    • 트러블 슈팅
      • ☄️ 문제 배경
      • 동아리 기능 개발 당시 학생이 원하는 창체 동아리 하나만 신청하는 로직으로 계획이 되어 있었습니다. 하지만 클라이언트(학교)의 로직 변경 요구에 의해 1, 2, 3지망을 각각 신청한 후 랜덤으로 입부 멤버를 결정해야 하는 로직을 짧은 시간 내에 만들어야 하였습니다.
      • 리팩터링 중 ClubMemberRepository에서 JPA의 N+1 문제가 발생할 가능성을 발견하였습니다.
      • ⭐️ 해결 방법
      • 우선순위 기반 할당 알고리즘(Priority-based Allocation Algorithm)을 사용하였습니다. 이 알고리즘을 사용함으로써 제한된 자원(동아리 정원)을 학생들의 지원 우선순위에 따라 최적으로 배분할 수 있게 하였습니다.
      • processAllPriorities 메서드를 통해 학생 지원서를 우선순위에 따라 처리할 수 있도록 구현하였고, 특정 동아리가 정원에 도달하면 차순위 지원자를 다음 우선순위 동아리로 이동할 수 있게 하였습니다.
      • assignedStudents 집합을 활용해 한 학생의 중복 배정을 원천 차단하였고, 배정 즉시 학생을 해당 집합에 추가하여 재배정을 막았습니다.
      • @EntityGraph(attributePaths = {"club"}) 를 통한 Fetch Join을 사용하였습니다. JOIN 쿼리를 통하여 동아리 엔티티를 함께 조회하도록 하였습니다. 이 결과로 불필요한 추가 쿼리를 줄였고 응답 속도를 향상시켰습니다.