Java

[Redis] 캐싱 구현(콜론 두 개 :: 등장 이유)

연신내고독한늑대 2025. 1. 30. 20:00

아래 글은 Spring Cache를 Redis와 함께 사용할 때, **::(콜론 두 개)**가 등장하는 이유와, 이를 어떻게 다뤄야 하는지에 집중해 정리했습니다. 캐싱 구현에서 흔히 겪는 혼동을 줄이는 데 도움이 되었으면 합니다.

 

■ @Cacheable(value = "cacheName")와 실제 Redis 키

Spring Cache 추상화(예: @Cacheable)를 통해 Redis를 사용하면, 실제 Redis 키는 자동으로 아래와 같은 형태로 생성됩니다.

"캐시이름::캐시 키"
  • 예: @Cacheable(value = "routeCache", key = "#routeNo")라면
    • 캐시 이름: "routeCache"
    • 캐시 키: routeNo
    • 실제 Redis 키: "routeCache::{routeNo}"

이는 Spring Cache가 “로직상 캐시 이름”을 “실제 Redis 키 문자열”로 만들 때 ::를 구분자로 사용하기 때문입니다.

 

■ 캐시 이름에 ::를 직접 붙이면 어떻게 될까요?

가끔 아래처럼 캐시 이름에 ::를 명시하는 사례가 보입니다.

@Cacheable(value = "routeCache::", key = "#routeNo")
public Routes findRoute(int routeNo) { ... }

위 경우 **“routeCache::”**가 캐시 이름 그 자체가 됩니다. 실제 Redis 키는 다시 ::가 붙어, 아래와 같이 네 개의 콜론이 들어간 형태로 만들어질 수 있습니다.

"routeCache::::{routeNo}"

문제는, 이렇게 되면 **다른 곳에서 cacheManager.getCache("routeCache")**를 사용했을 때, 전혀 다른 캐시로 인식된다는 점입니다. 결과적으로 캐시에 저장된 객체를 제대로 못 찾거나, 키가 달라서 혼동이 생기는 경우가 많습니다.

 

정리

  • 캐시 이름에는 일반적으로 ::를 붙이지 않습니다.
  • “"routeCache"”만 써주면, 스프링이 내부적으로 ::를 붙여서 실제 Redis 키를 만들기 때문에, 둘 다 일관성을 유지할 수 있습니다.

 

■ 직접 Redis 키를 다룰 때 (redisTemplate.delete 등)

스프링 캐시 추상화를 쓰면서도, 간혹 직접 RedisTemplate로 키를 삭제해야 하는 상황이 생길 수 있습니다. 이때는 실제 Redis 키가 아래와 같습니다.

"캐시이름::키"

따라서, RedisTemplate을 사용하려면 아래와 같이 삭제 해줘야 합니다.

redisTemplate.delete("tokenCache::" + userId);

 

■ Spring Cache 추상화 방식(추천)

public void evict(String cacheName, Object key) {
     var cache = cacheManager.getCache(cacheName);
     if (cache != null) {
         cache.evict(key);
     }
 }

위처럼 작성해두면, evict("tokenCache", userId)만 호출해도 캐시를 제거할 수 있습니다.

 

 

■ 요약

 

  • Spring Cache를 사용하면, 내부적으로 캐시이름::캐시키 형태로 실제 Redis 키가 생성됩니다.
  • 캐시 이름에 ::를 직접 붙이면, 최종 키가 :::: 식으로 늘어나 다른 캐시로 인식될 위험이 있으므로 주의해야 합니다.
  • redisTemplate.delete(...)처럼 직접 키를 다룰 때는, 정확히 캐시이름::키 형태의 문자열로 지워야 합니다.
  • 결론적으로, 캐시 이름에는 ::를 붙이지 않는 것이 일반적이며, 스프링이 내부에서 알아서 붙여주도록 두시는 편이 혼동을 줄이는 방법입니다.