수강 신청 프로젝트 중간 점검

mujik-tigers·2024년 2월 6일
post-thumbnail

안녕하세요, mujik-tigers입니다.
수강 신청 프로젝트를 시작하고 약 6주가 지난 지금까지의 진행 상황을 점검해 보려고 합니다.


프로젝트 진행 상황

현재 목표로 했던 모든 API를 완성했고 Vue를 사용하여 API 연동까지 끝마쳤습니다.
수강 신청 API 서버에서 제공하는 기능들은 다음과 같습니다.

  • 쿠키와 세션을 사용한 로그인
  • 학생, 학과 목록, 강의 정보, 수강 신청 기간 조회
  • 수강 바구니와 수강 신청 내역 조회
  • 수강 바구니 담기
  • 수강 신청
  • 이를 수행하는 데 필요한 검증들

자세한 API 문서는 링크를 확인해 주세요.


API 성능 측정

API의 평균 응답 속도를 측정하기 위해 K6를 사용하여 테스트를 진행했습니다.
학년별로 수강 신청을 진행함을 고려하여 1,000명의 가상 사용자를 설정하였습니다.

DB에 저장한 데이터의 수는 다음과 같습니다.

학생 : 5,000 (학년 당 1,000명, 4학년은 2,000명)
학과 : 54
교수 : 600
과목 : 3,000
강의 : 10,000

성능 측정 결과

API의 평균 latency 결과입니다. (AWS t2 micro ubuntu server)

APIlatencynote
현재 학기 및 년도 조회93.56ms
현재 서버 시간 조회82.33ms
남은 세션 시간 조회41.96ms
강의 목록 조회5.14s
수강 신청 인원 조회3s
수강 바구니 신청 인원 조회1s
수강 바구니 목록 조회5s
수강 바구니 신청1s
수강 바구니 삭제1s
수강 신청 기간 조회1.36s
남은 세션 시간 연장1s
로그인39.48s36.9% 의 응답은 time-out
학생 정보 조회741.44ms
학과 조회1.39s
수강 신청5.99s5.37% 의 응답은 time-out
강의 번호를 입력하는 빠른 수강 신청9.53s7.65% 의 응답은 time-out
수강 신청 내역 조회1.07s



중간 점검 결과

MySql을 방문하는 대부분의 API는 매우 느린 응답 속도를 보였고 일부는 모든 요청을 처리하지 못하고 연결이 끊어지기도 했습니다.

수강 신청 인원 수를 통한 수강 신청 가능 여부 검증 단계에서는 Race condition 문제가 발생하여 강의의 정원을 초과하여 신청된 경우도 있었습니다.

개선사항

앞으로 약 한 달동안 기능을 구현하면서 생긴 궁금증과 아쉬운 점들 중
몇 가지를 집중적으로 개선하고 과정을 블로그에 기록할 예정입니다.

  • Spring Boot에서 Redis 사용의 Best practice 탐구하기
  • 서비스 간의 의존 관계 구조 개선하기
  • 세션 연장 시에 새로운 세션을 만들지 않고 TTL만 초기화하기
  • API 변경이 있을 때, 촘촘한 테스트가 큰 오버헤드가 되는데, 어떻게 하면 이를 개선할 수 있을지 고민해보기
  • 서비스 간의 의존 관계가 있는 경우, 테스트 코드에서 Spy 처리 vs given 절에서 전부 준비하기
  • 데이터베이스 읽기 성능 개선하기
  • 캐시를 사용하여 응답 속도 개선하기
  • k6와 같은 성능 테스트 도구를 사용하는 방법과 시나리오를 설정하는 기준에 대해 학습하기
  • Nginx worker 설정값 및 캐시 처리에 대해 학습하기
  • Race condition 문제 해결하기

프로젝트 GitHub

profile
mujik-tigers 프로젝트 블로그

0개의 댓글