본문 바로가기
게임서버-스파르타코딩NodeJs_7기/CH6 최종 프로젝트

Geo 로 거리 비교

by GREEN나무 2025. 3. 3.
728x90

북마커가 Valkey(기존 Redis) 데이터베이스에 저장되어 있다면,
다음과 같은 방식으로 사용자 위치와 비교하여 반경 5m 이내의 북마커를 찾을 수 있습니다.


📌 구현 개요

  1. Valkey에 북마커 좌표 저장 → GEOADD를 사용하여 좌표를 등록
  2. 반경 5m 이내 북마커 조회 → GEORADIUSBYMEMBER 또는 GEORADIUS 사용

📌 Valkey에 북마커 등록 (GEOADD 사용)

import { Injectable } from '@nestjs/common';
import { createClient } from 'redis';

@Injectable()
export class LocationService {
  private client;
  private readonly KEY = 'bookmarks'; // Valkey 키 이름

  constructor() {
    this.client = createClient({ url: 'redis://localhost:6379' });
    this.client.connect();
  }

  /**
   * Valkey에 북마커 추가
   * @param id 북마커 ID
   * @param latitude 위도
   * @param longitude 경도
   */
  async addBookmark(id: number, latitude: number, longitude: number) {
    await this.client.geoAdd(this.KEY, {
      longitude,
      latitude,
      member: id.toString(),
    });
  }
}

➡️ GEOADD 명령어를 사용하여 북마커(100개 이상)를 Valkey에 저장합니다.


📌 반경 5m 이내의 북마커 검색 (GEORADIUS 사용)

/**
 * 사용자 위치 기준 반경 5m 이내의 북마커 조회
 * @param userLatitude 사용자 위도
 * @param userLongitude 사용자 경도
 * @returns 5m 이내 북마커 ID 배열
 */
async getNearbyBookmarks(userLatitude: number, userLongitude: number): Promise<string[]> {
  const nearbyBookmarks = await this.client.sendCommand([
    'GEORADIUS',
    this.KEY,
    userLongitude.toString(),
    userLatitude.toString(),
    '5', // 반경 5m
    'm', // 단위: 미터
  ]);

  return nearbyBookmarks;
}

➡️ GEORADIUS 명령어를 사용하여 반경 5m 이내의 북마커 ID 리스트를 가져옵니다.


📌 사용 예시

const locationService = new LocationService();

// Valkey에 북마커 추가 (예제)
await locationService.addBookmark(1, 37.5665, 126.9780);
await locationService.addBookmark(2, 37.5666, 126.9781);

// 반경 5m 이내 북마커 검색
const nearby = await locationService.getNearbyBookmarks(37.5665, 126.9780);
console.log('5m 이내 북마커:', nearby);

📌 Valkey를 사용한 이유

속도 최적화 → Valkey는 인메모리 DB이므로 빠른 검색 가능
대량 데이터 처리 → 100개 이상의 북마커 처리 가능
간편한 거리 계산 → GEORADIUS 명령어로 간단하게 반경 검색

이제 Valkey를 활용해 빠르게 반경 5m 이내 북마커를 찾을 수 있습니다! 🚀