상세 내용
- 내가 기여한 부분
- 프로젝트 단위의 심야자습 신청을 구현하였습니다. 학생은 날짜와 시간, 프로젝트 내용을 입력하고 팀원을 선택 후 신청합니다.
- 학생의 신청, 교사의 상태 변경(수락·거절) 시 프로젝트 리더를 포함한 참가자들의 신청 상태를 모두 변경해야 하였습니다.
- 초기 테이블 구조
- 기존에도 개인 심야자습 신청 기능은 존재하였습니다. MVP 개발 시 이미 있던 일반 심야자습 테이블을 사용하고, 프로젝트 테이블을 따로 만들어 FK로 프로젝트 아이디를 받아와 저장하였습니다.
- 문제점
- 프로젝트 조회 시 불필요한 WHERE절이 발생하였습니다. JPA가 심야자습들을 찾을 때 project_id의 유무로 심야자습 종류를 구분해야만 하였고, 요청 시 불필요한 where 조건이 추가되었습니다.
- 잦은 반복문 사용과 SQL 쿼리 발생으로 인하여 JPA N+1 문제와 높은 시간복잡도가 문제가 되었습니다.
- 개선 후 테이블 구조
- night_study, night_study_project, night_study_project_member 테이블로 정규화하였습니다.
- 반복문보다는 JPA와 JPQL에서 in과 join, exists 등을 사용하여 시간복잡도를 줄였습니다.
- 결과
- POST 요청 시 평균 320ms → 87ms, PATCH 요청 시 624ms → 49ms로 응답 시간을 단축하였습니다.
- 프로젝트 조회 시 불필요한 쿼리(join, where 등)가 발생하지 않았습니다.
- 리팩터링 전
- 리팩터링 후