- 빠르고 정확한 전국 주차장 조회 서비스
- 편리하고 안정적인 주차장 예약 서비스
- 효율적인 주차장 운영을 위한 주차장 입•출차 현황 관리 서비스
📗 ParkNav 브로슈어
📙 ParkNav Notion
- 프로젝트 이름 : ParkNav
- 프로젝트 소개 : 예약과 주차의 효율성을 높이는 주차장 예약 플랫폼
- 프로젝트 목표
- 데이터 수집 : 실제 주차장 데이터 수집으로 정확한 정보 제공 및 다양한 예약, 입차 출차 데이터 생성
- 알고리즘 : 예약 안정성과 주차장 운영 효율성을 최대로 구현하는 알고리즘
- 검색 성능 : 다양한 검색어에 대한 빠르고 정확한 검색 결과 제공
- 동시성 제어 : 동시적으로 일어나는 다양한 입차, 출차 상황에 대하여 안전하고 정확하게 제어
- 구현 기능
- 주차장 검색 및 조회
- 주차장 예약 기능
- 마이페이지 기능
- 차량 관리 기능
- 관리자 페이지 주차현황 관리
- 기간 :
- 2023.03.10 ~ 2023.04.21
- 팀원 :
이름 | GITHUB | |
---|---|---|
BE | 김도연 | https://github.com/dev-dykim |
BE | 오세영 | https://github.com/osy9536 |
BE | 이재훈 | https://github.com/Gem-o-b |
주차장 조회 | 주차장 예약 |
---|---|
![]() |
![]() |
- 예약하고 싶은 위치 혹은 현재 위치 주변의 주차장을 검색 - 장소 검색, 현위치 주변 검색 기능 - 필터 검색 기능(주차시간, 주차요금, 주차유형) |
- 선택한 주차장의 예약 기능 - 선택한 시간별 예상요금 기능 - 현재 예약 가능 차량 수 확인 기능 - 예약이 불가능한 경우 불가능한 시간대 확인 기능 |
마이페이지 | 차량관리 |
---|---|
![]() |
![]() |
- 예약, 사용내역 확인 기능(주차장 이름, 차량번호, 예약일시, 주차요금, 관리) - 예약 취소 기능 |
- 내 차량 등록 기능 - 대표차량 등록 기능 - 차량 삭제 기능 |
관리자페이지 |
---|
![]() |
- 입 출차 차량 목록 기능 - 입차 기능 - 출차 기능 |
기술선택 이유 펼쳐보기
요구 사항 | 기술 | 기술 선택 이유 |
---|---|---|
동시성 제어 | 선택한 기술 : - Lettuce 스핀락 선택지 : - Pessimistic Locking - Redisson 분산락 - Lettuce 스핀락 |
Lettuce 스핀락 - Version2에서 시간대별 예약 현황 테이블을 만듦으로써 성능적인 면의 상승이 있었지만, 동시성 제어가 실패하게 되면 코어 로직에서 이전 Version1보다 치명적인 문제가 발생할 수 있음 - Pessimistic Locking이 속도면에서 더 좋은 성능을 갖고 있지만, 다음과 같은 단점이 존재 • 동시에 많은 요청이오면 데드락(deadlock)이 발생할 가능성 • 특정 데이터에 락을거는 특성상 해당 로직의 추가적인 수정이 발생시 락의 위치를 바꾸거나 추가적인 락을 걸어야 함 • 완벽한 동시성 제어가 되지 않을 수 있음 → 동시성 제어의 속도면에서는 Pessimistic Locking이 더 좋은 성능일지라도, 전체적인 프로젝트의 안정성을 위해 Lettuce의 스핀락 사용 |
CI/CD | 선택한 기술 : - GitHub Actions 선택지 : - GitHub Actions - Jenkins |
GitHub Actions - 무료이거나 비용이 저렴할 것 - 짧은 기간에 사용해야하기 때문에 러닝커브 및 예상 리소스가 낮을 것 - EC2에 배포가 가능해야하고 GIT과 연동이 될 것 |
Test | 선택한 기술 : - Jmeter, JUnit5 |
Jmeter: - 대용량 트래픽을 시뮬레이션할 수 있는 테스트 도구로써 Jmeter를 선정: - 이를 통해 시스템이 정상적으로 대량의 요청을 처리할 수 있는지 확인, 병목 현상 발견: : JUnit5: - 자바 언어를 기반으로 하는 유닛 테스트 도구: - 단위 테스트 : 단위테스트를 통해 해당 메서드가 정상 작동하는지 확인: - 통합 테스트 : 동시성 제어 기능을 테스트하고 다중 스레드 환경에서 안정성을 확인 |
검색 성능 개선 | 선택한 기술 : - Fetch Join - QueryDSL - Fulltext index |
Fetch Join(N+1 문제) - 부모 엔티티를 조회한 후 연관된 자식 엔티티를 조회하는 과정에서 부모 엔티티 수만큼 자식 엔티티를 조회하는 문제 해결 QueryDSL - 자바 코드와 유사한 형태로 쿼리를 작성 가능 → 가독성 향상, 코드 재사용성 향상, 컴파일시 문법 오류 확인 가능 - 런타임에 쿼리를 조건에 따라 다르게 생성하고 실행해야 하는 동적쿼리 생성 가능 Fulltext index(ngram) - ParkInfo의 name 컬럼에 index를 걺으로써 검색 속도 향상 - 특정 단어, 구 검색 정확성 향상 |
API | 선택한 기술 : - Kakao map API 선택지 : - Kakao map API - Naver map API |
Kakao map API - 선택기준 : 검색 시 다양한 조건에 의해 검색이 가능해야함 ( 건물명, 도로명, 주소 등) - Naver map API : 주소에 대한 위도, 경도만 검색가능 ( 강남구, 서울시 등 ) - Kakao map API : 검색어에 대한 위도, 경도를 검색가능( 63빌딩, 강남구 등 ) |
-
주차장 검색 성능 개선
👉 주차장 검색 성능 개선 기록 보기
👉 주차장 조회 성능 테스트 보기 -
예약 알고리즘 성능 개선
👉 예약 알고리즘 성능 개선 기록 보기 -
동시성 제어 성능 테스트
👉 동시성제어 성능 테스트 보기
-
예약 알고리즘 version2에 이르기까지 과정
👉 version2 알고리즘 트러블슈팅 보기 -
테스트코드에 대한 고민
👉 코드 커버리지 적용 보기
👉 테스트코드 작성 트러블슈팅 보기 -
Redis SpinLock 적용
👉 Redis SpinLock 적용 보기