Location-based Social Networking Service focusing on Real-world Intimacy.
"우리의 추억은 장소에 머문다." 친구들과 함께한 순간을 지도 위에 기록하고, 방문한 장소를 기반으로 서로의 친밀도를 확인하는 하이퍼로컬 SNS, Loci의 백엔드 리포지토리입니다.
- Uber의 H3 Indexing 기술을 도입하여 전 세계를 육각형 그리드(Beacon)로 나누어 관리합니다.
- 단순 좌표(Point) 기반 검색의 한계를 넘어, 구역(Area) 기반의 데이터 집계를 통해 지도 로딩 속도를 획기적으로 개선했습니다.
UserBeaconStats테이블을 통한 반정규화(Denormalization) 설계로 수만 건의 마커 조회 쿼리를 0.1초 이내로 단축했습니다.
- 단순한 팔로우 관계를 넘어, 유저 간의 상호작용(게시글 태그, 댓글, 반응 등)을 점수화합니다.
IntimacyService를 통해 실시간으로 친밀도 레벨을 계산하고, 레벨에 따라 "콕 찌르기(Nudge)" 등 차별화된 기능을 제공합니다.
- AWS S3 Presigned URL 방식을 도입하여 서버를 거치지 않고 클라이언트가 S3로 직접 파일을 업로드합니다.
- 이를 통해 백엔드 서버의 메모리 부하를 줄이고, 네트워크 대역폭 비용을 절감했습니다.
- 파일 업로드 시 500MB 용량 제한 및 파일명 난수화/위생 처리를 통해 보안성을 강화했습니다.
- Global Caching (Redis): 빈번하게 호출되는 '친구 목록'과 '유저 통계' 데이터에
@Cacheable을 적용하여 DB 부하를 최소화했습니다. - Push Notification: 대용량 푸시 발송 시 DB 커넥션 점유 문제를 해결하기 위해 트랜잭션을 분리(
REQUIRES_NEW)하여 안정성을 확보했습니다.
Loci 백엔드는 대규모 트래픽을 고려한 다양한 최적화 기법이 적용되어 있습니다.
- N+1 문제 해결:
PostRepository및FriendshipRepository등 주요 조회 로직에서JOIN FETCH및BatchSize를 활용하여 쿼리 수를 최적화했습니다. - 동시성 제어:
UserBeaconStats갱신 시 발생하는 동시성 문제를 해결하기 위해 Native Query 기반의 Upsert (ON DUPLICATE KEY UPDATE) 방식을 적용, 불필요한 Lock 대기를 제거했습니다. - 비동기 처리: 알림 발송, 통계 집계 등 응답 속도에 영향을 주지 않는 로직은
Spring Event(@Async,@TransactionalEventListener)를 통해 비동기로 처리하여 사용자 경험(UX)을 향상시켰습니다.
- JWT Authentication: Access/Refresh Token 메커니즘을 통한 Stateless 인증.
- AES-256 Encryption: 민감한 개인정보(전화번호 등)는 DB 저장 시 암호화하여 보관합니다.
com.teamloci.loci
├── domain
│ ├── auth # 인증/인가 (JWT, Phone Login)
│ ├── chat # 채팅 (Firestore 연동)
│ ├── friend # 친구 관계 및 연락처 동기화
│ ├── intimacy # 친밀도 시스템 (Gamification)
│ ├── notification # FCM 푸시 알림
│ ├── post # 게시글, 타임라인, 미디어
│ ├── settings # 사용자 설정
│ ├── stat # 지도 마커 통계 (H3 Beacon Stats)
│ └── user # 사용자 프로필 및 활동 정보
└── global
├── auth # Security Filter, Principal
├── common # 공통 Response, Entity
├── config # AWS, Redis, Swagger, Async 설정
├── error # Global Exception Handling
├── infra # 외부 인프라 (S3 File Upload)
└── util # GeoUtils(H3), AESUtil, Scheduler