아래 글은 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(...)처럼 직접 키를 다룰 때는, 정확히 캐시이름::키 형태의 문자열로 지워야 합니다.
- 결론적으로, 캐시 이름에는 ::를 붙이지 않는 것이 일반적이며, 스프링이 내부에서 알아서 붙여주도록 두시는 편이 혼동을 줄이는 방법입니다.
'Java' 카테고리의 다른 글
[WebSocket] Java로 WebSocket 구현하기(feat. JWT) (0) | 2025.01.23 |
---|---|
[S3] Spring에서 AWS S3 설정을 활용한 파일 업로드 (1) | 2024.11.08 |
[Gradle] 의존성 설정과 컴파일/런타임 시점의 이해(feat.Lombok) (0) | 2024.09.30 |
[Gradle] 의존성 설정 알아보기 (1) | 2024.09.27 |
[JUnit]Spring Boot에서 JUnit으로 테스트하는 방법 (1) | 2024.09.09 |