📖 프로젝트 개요
회고록
SSAFY 2학기 자율 프로젝트 - 좋아하면 누르는 회고록
GIT
https://github.com/eora21/love-push
Image
⌨️ 사용 기술 및 라이브러리
- Spring Boot
- JPA / Hibernate
- Spring Data JPA
- QueryDSL
🧐 고민과 구현
사용자간의 거리 계산 로직
- 주변 100m의 다른 사용자를 파악하고 해당 사용자들에게 하트를 전달해야 했습니다. 이를 위해선 사용자간의 거리를 계산하는 로직이 필요했습니다.
- 하트가 눌릴 때뿐만 아니라 App을 구동시켰을 때 실시간으로 주변 사용자들의 수를 표기해야 했기에 시간복잡도가 중요했습니다.
- 기본적으로 서버에서 모든 유저들의 거리를 측정한다면 이는 O(n^2)의 시간복잡도를 가져야 했습니다.
- 이를 해결하기 위해 H3 인덱싱에서 영감을 얻어 지구를 30m * 30m의 가상 구획으로 나누고, 사용자들의 위치를 해당 구획으로 대치시켰습니다.
- 모든 가상 구획 데이터를 배열로 지니는 것은 너무나 많은 메모리를 소모했기에 각각의 구획 데이터를 String값으로 변환하고 HashMap을 이용해 데이터를 유지하는 방식을 선택했습니다.
- 서버에서 모든 사용자들의 위치를 수신 후 본인이 위치한 가상 구획 및 주변 구획들의 데이터만 추출, 주변 사용자를 계산하는 로직을 작성하여 O(n)의 시간복잡도를 도출할 수 있었습니다.
💡 알게 된 점
- Spring의 웹 레이어 구조를 알게 되었습니다.
- Spring Data JPA의 네임드 쿼리 작성법에 대해 알게 되었습니다.
- 기술 선택 시 충분한 이해도가 바탕이 되어야 한다는 점을 깨달을 수 있었습니다.
😅 아쉬웠던 점
- Java와 Spring을 처음 시도하다 보니, 높은 이해도 없이 작성한 점이 굉장히 아쉬웠습니다. 특히나 시간이 지나며 객체지향보단 순차지향적인 코드가 늘어났습니다. 다음 프로젝트에서는 이런 일을 방지하기 위해 OOP와 Spring에 대해 열심히 공부하고 있습니다.
👍 좋았던 점
- 부족함을 많이 느낄 수 있어 좋았습니다. 프로젝트 종료 후 JPA(Hibernate), Spring Data JPA, JPQL, QueryDSL, 다중 pk 설정, N+1 문제, MySQL의 트랜잭션 등에 대한 학습을 이어나가는 계기가 되었습니다.