Skip to content

Conversation

@dnzp75
Copy link
Collaborator

@dnzp75 dnzp75 commented Jun 14, 2025

📌 PR 제목

지도 도메인 요청 구조 Geohash 방식으로 리팩토링 및 Redis Cache를 통한 최적화

✨ 변경 사항

  • Map API 요청 구조 리팩토링

    • 변경 전: 좌표 기반 요청 구조

      • 클러스터: 사각형 범위 내 [ 동 서 남 북 ] 좌표
      • 마커: 사각형 범위 내 [ 동 서 남 북 ] 좌표
    • 변경 후: Geohash 기반 정형화된 요청 구조로 전환

      • 클러스터: geohash(길이 3) + local_level (1=시도, 2=시군구)
      • 마커: geohash(길이 5) 고정
  • Redis 캐시 구조 도입

    • 클러스터: cluster:{geohash}:{level}
    • 마커: [1단계] marker:ids:geohash:{hash} / [2단계] marker:diary:{id}
  • +) 추가 변경 사항

    • multiGet 을 활용한 Redis I/O 최적화
      • 기존: diary ID 수만큼 Redis GET 호출 (ex. 700개 요청 → 700회 I/O)
      • 개선: multiGet 도입 → 요청 수 1회로 축소
    • 응답 속도 개선: 0.4s → 0.15s

🔍 변경 이유

  • 좌표 기반 요청은 범위가 매번 달라 캐시 적중률이 매우 낮음
  • 인덱스 튜닝만으로는 최대 처리량이 약 80 TPS 수준에 머무름
  • 동일한 격자 단위로 조회되는 Geohash 기반 구조로 통일함으로써 캐시 재사용률 증가하기 위함

주요 코드 변경 예시

개선 전

private List<DiaryMarkerResponseDto> getCachedDiaryDtos(Set<Long> ids) {
	List<DiaryMarkerResponseDto> cached = new ArrayList<>();
	for (Long id : ids) {
		DiaryMarkerResponseDto dto = diaryCacheDao.getDiaryFromCache(id);
		if (dto != null) cached.add(dto);
	}
	return cached;
}

개선 후 (multiGet 도입)

public List<DiaryMarkerResponseDto> getDiariesFromCacheBulk(List<Long> diaryIds) {
	List<String> keys = diaryIds.stream()
		.map(CacheKeyGenerator::diaryKey)
		.toList();
	List<Object> values = redisTemplate.opsForValue().multiGet(keys);

         ,,,

✅ 체크리스트

  • 코드가 정상적으로 동작하는지 확인
  • 관련 테스트 코드 작성 및 통과 여부 확인
  • 문서화(README 등) 필요 여부 확인 및 반영
  • 리뷰어가 알아야 할 사항 추가 설명

📸 스크린샷 (선택)

📌 참고 사항

@dnzp75 dnzp75 changed the title 지도 클러스터형/마커형 API Geohash문자열 방식으로 리팩토링 지도 API 성능 개선을 위한 Geohash 기반 구조 리팩토링 및 Redis 캐싱 적용 Jun 15, 2025
@dnzp75 dnzp75 self-assigned this Jun 15, 2025
@sonarqubecloud
Copy link

@dnzp75 dnzp75 merged commit 75d4c6c into develop Jun 15, 2025
3 checks passed
@dnzp75 dnzp75 changed the title 지도 API 성능 개선을 위한 Geohash 기반 구조 리팩토링 및 Redis 캐싱 적용 지도 내 클러스터/마커형 조회 기능 Geohash 기반 요청 구조 리팩토링 및 Redis 캐싱 적용 Nov 21, 2025
@dnzp75 dnzp75 changed the title 지도 내 클러스터/마커형 조회 기능 Geohash 기반 요청 구조 리팩토링 및 Redis 캐싱 적용 지도 클러스터/마커형 조회 기능 Geohash 기반 요청 구조 리팩토링 및 Redis 캐싱 적용 Nov 21, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants