커스텀 캐시로 TTL 적용
ExpiringConcurrentMapCache 구현
import org.springframework.cache.concurrent.ConcurrentMapCache;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
public class ExpiringConcurrentMapCache extends ConcurrentMapCache {
private final Map<Object, Long> expiryMap = new ConcurrentHashMap<>();
private final long ttl;
public ExpiringConcurrentMapCache(String name, long ttl) {
super(name);
this.ttl = ttl;
}
@Override
public void put(Object key, Object value) {
super.put(key, value);
expiryMap.put(key, System.currentTimeMillis() + ttl);
}
@Override
public ValueWrapper get(Object key) {
if (isExpired(key)) {
evict(key);
return null;
}
return super.get(key);
}
private boolean isExpired(Object key) {
Long expiryTime = expiryMap.get(key);
return expiryTime != null && System.currentTimeMillis() > expiryTime;
}
}
CacheManager 설정
@Configuration
@EnableCaching
public class CacheConfig {
@Bean
public CacheManager cacheManager() {
return new ConcurrentMapCacheManager() {
@Override
protected Cache createConcurrentMapCache(String name) {
return new ExpiringConcurrentMapCache(name, 60000);
}
};
}
}