JSCODE Logo
JSCODE 박재성JSCODE 제이온JSCODE 시니
과외유튜브블로그후기
완강 후기 이벤트블로그 리뷰 이벤트AWS SAA 합격 후기 이벤트
회사명 : JSCODE대표 : 박재성사업자 등록번호 : 244-22-01557통신판매업 : 제 2023-인천미추홀-0381 호

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

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

이용약관개인정보처리방침

비전공자도 이해할 수 있는 Redis 중급/실전

Redis로 ‘쓰기 작업’에 대한 DB 부하 줄이기

Redis의 수많은 자료 구조를 효율적으로 배우려면?
List 자료 구조 (RPUSH, LRANGE, LPOP 등)
[실습] 좋아요 수 폭증으로 인한 DB 부하를 Redis로 해결하기 - 1
[실습] 좋아요 수 폭증으로 인한 DB 부하를 Redis로 해결하기 - 2

Redis로 동시성 이슈 해결하기

String 자료 구조 (SET, GET, DEL, SETNX)
[실습] 재고를 차감할 때 동시성 이슈로 인한 오차가 발생하지 않도록 만들기 - 1
[실습] 재고를 차감할 때 동시성 이슈로 인한 오차가 발생하지 않도록 만들기 - 2
[실습] 재고를 차감할 때 동시성 이슈로 인한 오차가 발생하지 않도록 만들기 - 3

Redis로 인기 검색어 구현하기

Sorted Set 자료 구조 (ZADD, ZRANGE, ZINCRBY)
[실습] 많이 검색한 키워드 Top 10을 보여주는 '인기 검색어 기능’ 만들기 - 1
[실습] 많이 검색한 키워드 Top 10을 보여주는 '인기 검색어 기능’ 만들기 - 2

Redis로 API 요청 횟수 제한 기능 구현하기 (Rate Limiting)

Sorted Set 자료 구조 (ZCARD, ZREMRANGEBYSCORE, EXPIRE)
[실습] 악의적인 요청을 방지하기 위해, 10초당 API 요청 횟수를 5회로 제한하기 - 1
[실습] 악의적인 요청을 방지하기 위해, 10초당 API 요청 횟수를 5회로 제한하기 - 2

Redis를 활용해 내 위치를 기준으로 반경 1km에 위치한 카페 찾기

Geospatial 자료 구조 (GEOADD, GEOPOS, GEODIST, GEOSEARCH)
[실습] 내 위치를 기준으로 반경 1km에 위치한 카페 찾기 - 1
[실습] 내 위치를 기준으로 반경 1km에 위치한 카페 찾기 - 2

Redis로 하루 동안 서비스에 방문한 사용자 수(DAU) 카운팅하기

Set 자료 구조 (SADD, SMEMBERS, SCARD)
Bitmap 자료 구조 (SETBIT, GETBIT, BITCOUNT)
Set과 Bitmap의 공통점 / 차이점
[실습] 하루 동안 서비스에 방문한 사용자 수(DAU) 카운팅하기 - 1
[실습] 하루 동안 서비스에 방문한 사용자 수(DAU) 카운팅하기 - 2
[실습] 하루 동안 서비스에 방문한 사용자 수(DAU) 카운팅하기 - 3

Redis를 세션 스토리지로 활용하기

Hash 자료 구조 (HSET, HGET, HGETALL)
서버가 2대 이상일 경우, Redis로 세션 스토리지를 구축해야 하는 이유
[실습] 인증 기능을 로컬 세션 스토리지로 구현했을 때 발생하는 문제점 - 1
[실습] 인증 기능을 로컬 세션 스토리지로 구현했을 때 발생하는 문제점 - 2
[실습] Redis로 세션 스토리지 구축하기
← 블로그 목록으로 돌아가기

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

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

✅ 상황

실무에서 ‘내 위치를 기준으로 반경 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()); } }
       
👨🏻‍🏫
다음 강의에서 작성한 코드가 잘 작동하는 지 테스트해보자.
📎
이 글은 비전공자도 이해할 수 있는 Redis 중급/실전 강의의 수업 자료 중 일부입니다.