JSCODE Logo
프로그래밍 과외블로그후기멘토진
회사명 : JSCODE대표 : 박재성사업자 등록번호 : 244-22-01557통신판매업 : 제 2023-인천미추홀-0381 호
학원 명칭 : 제이에스코드(JSCODE)원격학원학원설립ㆍ운영 등록번호 : 제6063호

서울특별시 구로구 경인로 20가길 11(오류동, 아델리아)

Copyright ⓒ 2025 JSCODE - 최상위 현업 개발자들의 프로그래밍 교육 All rights reserved.

이용약관개인정보처리방침
← 블로그 목록으로 돌아가기

[실습] 내 위치를 기준으로 반경 1km에 위치한 카페 찾기 - 1

JSCODE 박재성
JSCODE 박재성
2026-01-12
author
JSCODE 박재성
category
Redis
createdAt
Jan 12, 2026
series
비전공자도 이해할 수 있는 Redis 중급/실전
slug
find-nearby-cafes-with-redis-geospatial-part-1
type
post
updatedAt
Jan 12, 2026 12:17 AM

✅ 상황

실무에서 ‘내 위치를 기준으로 반경 1km에 위치한 카페 찾는 기능’을 구현해야 한다고 가정하자. 만약 이 기능을 RDB인 MySQL로 구현해야 한다면 SQL문이 굉장히 복잡해지고 거리 계산을 일일이 다 해야되기 때문에 성능도 좋지 않다.
그래서 특정 위치 기준으로 주어진 거리 내의 데이터를 찾아야 할 때 자주 사용하는 Redis의 Geospatial 자료 구조를 활용해 구현해볼 것이다. Geospatial은 거리 계산에 최적화된 자료 구조이면서 거리 계산에 관련된 기능을 기본적으로 제공해주기 때문에 성능이 보장되면서도 쉽게 구현할 수 있다.
 
 

✅ 실습

  1. 코드 살펴보기
    1. 실습의 편의를 위해 일부 코드를 작성해두었다.
      CafeController
      @RestController @RequestMapping("/cafe") @RequiredArgsConstructor public class CafeController { private final CafeService cafeService; // Redis에 카페 데이터 추가하는 API @PostMapping public void addCafe(@RequestBody AddCafeRequestDto addCafeRequestDto) { cafeService.addCafe(addCafeRequestDto); } // 특정 위치를 기준으로 지정된 반경 내에 있는 카페를 조회해주는 API @GetMapping("/nearby") public List<Object> findCafesNearby(@RequestParam double longitude, @RequestParam double latitude, @RequestParam double distance) { return cafeService.findCafesNearby(longitude, latitude, distance); } }
       
      AddCafeRequestDto
      @AllArgsConstructor @Getter public class AddCafeRequestDto { private String name; private double longitude; private double latitude; }
       
      CafeService
      @Service @RequiredArgsConstructor public class CafeService { public void addCafe(AddCafeRequestDto addCafeRequestDto) { return; } public List<Object> findCafesNearby(double longitude, double latitude, double distanceKm) { return null; } }
       
  1. 코드 작성하기
    1. CafeService
      @Service @RequiredArgsConstructor public class CafeService { private final RedisTemplate<String, String> redisTemplate; private static final String GEOSPATIAL_KEY = "cafe"; public void addCafe(AddCafeRequestDto addCafeRequestDto) { // Redis GeoSpatial 자료구조에 카페 데이터 저장 // Redis 명령어에서 'GEOADD [key] [위도] [경도] [member]'와 동일 redisTemplate.opsForGeo() .add(GEOSPATIAL_KEY, new Point(addCafeRequestDto.getLongitude(), addCafeRequestDto.getLatitude()), addCafeRequestDto.getName()); } public List<Object> findCafesNearby(double longitude, double latitude, double distanceKm) { // Redis GeoSpatial 자료구조에서 특정 위치를 기준으로 지정된 반경 내에 있는 카페 조회 (오름차순) // Redis 명령어에서 'GEOSEARCH [key] FROMLONLAT [경도] [위도] BYRADIUS [거리] [단위] ASC WITHDIST'와 동일 GeoSearchCommandArgs args = GeoSearchCommandArgs .newGeoSearchArgs() .includeDistance() .sortAscending(); // ASC WITHDIST return redisTemplate.opsForGeo().search( // GEOSEARCH GEOSPATIAL_KEY, // [key] fromCoordinate(new Point(longitude, latitude)), // FROMLONLAT [경도] 위도] new Distance(distanceKm, Metrics.KILOMETERS), // BYRADIUS [거리] [단위] args // ASC WITHDIST ).getContent().stream() .map(geoResult -> new CafeDistance( geoResult.getContent().getName(), geoResult.getDistance().getValue() // '카페 이름'과 '거리'를 반환 )) .collect(Collectors.toList()); } }
       
👨🏻‍🏫
다음 강의에서 작성한 코드가 잘 작동하는 지 테스트해보자.
author
category
Redis
createdAt
Jan 12, 2026
series
비전공자도 이해할 수 있는 Redis 중급/실전
slug
type
series-footer
updatedAt
Jan 12, 2026 12:26 AM
📎
이 글은 비전공자도 이해할 수 있는 Redis 중급/실전 강의의 수업 자료 중 일부입니다.