shape

도담도담 - 프로젝트 심야자습 신청 기능 구현하기

프로젝트 설명

도담도담 심야자습 기능 확장하고 쿼리 최적화하기

기술 스택

  • 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로 프로젝트 아이디를 받아와 저장하였습니다.
    초기 테이블 구조 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