[TIL] 스프링 기본 캐싱 TTL 커스텀

Soeng_dev·2024년 12월 19일

커스텀 캐시로 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); // TTL: 1분
            }
        };
    }
}
profile
Software Engineer

0개의 댓글