의존성 추가
implementation 'com.github.ben-manes.caffeine:caffeine'
caffeine 적용 후 확인
System.out.println("cacheManager bean = " + cacheManager.getClass().getName());
// org.springframework.cache.caffeine.CaffeineCacheManager
간단하게 읽고 쓰고, 변경되면 제거하는 설정도 해주어서 따로 스케줄러로 관리는 하지 않으려고 한다. 최대 크기는 설정하고 싶어서 config를 추가했다.
@Configuration
@EnableCaching
public class CacheConfig {
@Bean
public CaffeineCacheManager caffeineCacheManager() {
CaffeineCacheManager cacheManager = new CaffeineCacheManager();
cacheManager.setCaffeine(Caffeine.newBuilder()
.expireAfterAccess(10, TimeUnit.MINUTES) // 10분 후 만료
.maximumSize(1000)); // 최대 1000개 저장
return cacheManager;
}
}
Cache Eviction 전략 두 가지
1. sized-based
최대 크기나 무게 제한을 설정하면 접근 빈도나 최근 접근한 시점에 따라 제거
.maximumSize(1000) // 항목 당 최대 캐시 개수
.maximumWeight(1000) // 총 무게 기준
maximumSize()와maximumWeight()은 함께 사용할 수 없음
2. time-based
저장/교체, 마지막 접근 시간을 기준으로 만료
.expiresAfterWrite(10, TimeUnit.MINUTES) // 저장/교체한 시간 기준
.expireAfterAccess(10, TimeUnit.MINUTES) // 저장/교체, 마지막 접근 시간 기준
- 만료 시간이 되었다고 바로 제거가 되지 않고 이벤트(읽기, 쓰기, 교체 등) 이벤트가 발생할 때 제거 → 세세한 메모리 관리가 필요하다면 제거 스케줄러 이용
참조 옵션
weakKeys(), weakValues(), softValues() 모두 GC(가비지 컬렉터)에 의해 회수될 수 있다. 회수된 캐시는 수정, 접근 또는 Cache.cleanUp을 호출할 때 제거된다. Cache.estimatedSize()에서 계산될 수 있지만 읽기/쓰기는 불가능 하다.
1. 약한 참조 WeakReference
- GC가 필요하다고 판단하면 즉시 수거
- 메모리가 부족하지 않아도 GC가 바로 제거 가능
2. 소프트 참조 SoftReference
- 메모리가 부족할 때만 GC가 수거
번외. 강한 참조 StrongReference
- 우리가 일반적으로 사용하는 참조 방식
- 해당 객체가 참조되는 한 GC가 수거하지 않음
참고
'개발 > Spring' 카테고리의 다른 글
| Spring 프로젝트 아키텍처 정하기 (2) | 2025.04.11 |
|---|---|
| 리팩토링 - 패키지를 넘나드는 캐시 (0) | 2025.02.12 |
| 스프링 내장 캐시 사용하기 (2) | 2025.02.07 |
| Spring 서버 로깅 1 - 로그 레벨 (0) | 2024.11.04 |
| 토비의 스프링 - 서비스 추상화 (0) | 2024.10.25 |