공간적 기억 구축하기
현실 세계를 위한 핀터레스트를 만드는 데 3개월을 보냈습니다.
아이디어는 간단합니다. 특정 GPS 좌표에 디지털 메모, 사진 또는 이야기를 남기는 것입니다. 사람들은 그 정확한 장소에 실제로 서 있을 때만 그것들을 볼 수 있습니다. 이는 현실 세계를 디지털 타임캡슐의 집합체로 바꿉니다.
위치 기반 앱을 만드는 것은 보기보다 어렵습니다. 기술 스택에 대해 배운 점은 다음과 같습니다.
The Spatial Database 확장성을 고려한다면 위도와 경도를 단순히 숫자로만 저장해서는 안 됩니다. 공간 인덱스가 필요합니다. 저는 PostgreSQL과 함께 PostGIS를 사용했습니다.
PostGIS는 다음을 처리합니다:
- R-tree를 이용한 공간 인덱싱
- 내장된 거리 계산 기능
- 빠른 근접성 쿼리
사용자의 50미터 이내에 있는 기억을 찾아야 한다면, PostGIS가 핵심적인 역할을 수행합니다.
The Caching Strategy 인기 있는 관광지는 요청이 너무 많습니다. 2초마다 데이터베이스에 접근하는 것은 성능에 좋지 않습니다. 저는 혼잡한 지역의 메모리 ID를 캐싱하기 위해 Redis GEO 명령을 사용했습니다.
전문가의 팁: Redis에 객체 전체를 캐싱하지 마세요. ID만 캐싱하세요. 이렇게 하면 메모리 사용량을 낮게 유지할 수 있고, 쿼리 시간을 20ms에서 2ms로 단축할 수 있습니다.
The Upload Pattern 서버가 모든 사진 업로드를 처리하게 되면 부하가 걸렸을 때 서버가 다운될 것입니다. 저는 2단계 업로드 패턴을 사용했습니다:
- 클라이언트가 서버에 사전 서명된(pre-signed) URL을 요청합니다.
- 클라이언트가 파일을 Cloudflare R2로 직접 업로드합니다.
- 클라이언트가 업로드가 완료되었음을 서버에 알립니다.
S3 대신 R2를 선택한 이유는 데이터 전송 비용(egress fees)이 없기 때문입니다. 이는 사용자가 미디어를 다운로드할 때 비용을 절감해 줍니다.
What Worked
- PostGIS와 Redis GEO를 통해 공간 쿼리를 빠르게 처리할 수 있습니다.
- R2로의 직접 업로드는 백엔드의 확장성을 가능하게 합니다.
- Go와 Gin은 낮은 메모리 사용량으로 높은 성능을 제공합니다.
- 단계적 개인정보 보호(Private, Friends, 또는 Public)가 사용자를 보호합니다.
What Went Wrong
- 고층 건물이 많은 도시에서는 GPS 정확도가 일정하지 않습니다.
- "콜드 스타트(cold start)" 문제는 실재합니다. 앱이 활기차게 느껴지려면 많은 사용자가 필요합니다.
- 콘텐츠 모더레이션에는 지속적인 주의가 필요합니다.
이를 구축하면서 물리적 위치가 소셜 앱에서 과소평가된 차원이라는 것을 배웠습니다. 디지털 콘텐츠는 실제 장소와 연결될 때 더 의미 있게 느껴집니다.
Optional learning community: https://t.me/GyaanSetuAi
