제목: "[Spring] 캐시(Cache) 추상화와 사용법(@Cacheable, @CachePut, @CacheEvict)"
작성자: tistory(망나니개발자)
작성자 수정일: 2021년8월3일
링크: https://mangkyu.tistory.com/179
작성일: 2022년8월16일
제목: "스프링에서 캐시 사용하여 프로젝트 성능 개선해보기"
작성자: jiniaslog
작성자 수정일: 2021년12월24일
링크: https://www.jiniaslog.co.kr/article/view?articleId=254
작성일: 2022년8월16일
스프링에서 @Cacheable과 같은 어노테이션 기반의 캐시 기능을 사용하기 위해서는 먼저 별도의 선언이 필요하다
그렇기 때문에 @EnableCaching 어노테이션을 설정 클래스에 추가해주어야 한다.
어노테이션을 추가한 후에는 캐시를 관리해줄 CacheManager
를 빈으로 등록해주어야 한다.
Spring은 현재 다음과 같은 캐시 매니저들을 제공하고 있다.
우리는 많은 캐시매니저들 중에서 필요에 맞는 캐시 매니저를 찾아서 선택하면 된다. 이와 관련된 내용은 스프링 공식 문서를 참고하면 된다.
위와 같이 캐시 매니저를 추가하면 해당 캐시 매니저가 우리의 캐시 관련 기능들을 담당하여 처리하게 된다.
ehcache.xml
<ehcache>
<diskStore path="java.io.tmpdir"/>
<defaultCache
maxEntriesLocalHeap="10000"
maxEntriesLocalDisk="10000"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
diskExpiryThreadIntervalSeconds="120"
memoryStoreEvictionPolicy="LRU"/>
<cache name="account"
maxElementsInMemory="10"
eternal="false"
timeToIdleSeconds="300"
timeToLiveSeconds="600"
memoryStoreEvictionPolicy="LRU" />
</ehcache>
CacheConfig
@Configuration
@EnableCaching
public class CacheConfig {
@Bean
public CacheManager cacheManager() {
return new EhCacheCacheManager(ehCacheManagerFactoryBean().getObject());
}
@Bean
public EhCacheManagerFactoryBean ehCacheManagerFactoryBean() {
EhCacheManagerFactoryBean factoryBean = new EhCacheManagerFactoryBean();
factoryBean.setConfigLocation(new ClassPathResource("ehcache.xml"));
factoryBean.setShared(true);
return factoryBean;
}
}
package me.dragonappear.replicationdatasource.config;
import net.sf.ehcache.Cache;
import net.sf.ehcache.config.CacheConfiguration;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.ehcache.EhCacheCacheManager;
import org.springframework.cache.ehcache.EhCacheManagerFactoryBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.Objects;
@Configuration
@EnableCaching
public class CacheConfig {
/*
- Eh캐시 매니저 생성 도우미
빈등록을 해놓으면 된다.
*/
@Bean
public EhCacheManagerFactoryBean ehCacheManagerFactoryBean() {
return new EhCacheManagerFactoryBean();
}
/*
- EhcacheManager 등록
*/
@Bean
public CacheManager cacheManager() {
// 캐시 설정
CacheConfiguration accountCacheConfig = getCacheConfiguration("account");
CacheConfiguration memberCacheConfig = getCacheConfiguration("member");
// 설정을 가지고 캐시 생성
Cache accountCache = new Cache(accountCacheConfig);
Cache memberCache = new Cache(memberCacheConfig);
// 캐시 팩토리에 생성한 eh캐시를 추가
Objects.requireNonNull(ehCacheManagerFactoryBean().getObject()).addCache(accountCache);
Objects.requireNonNull(ehCacheManagerFactoryBean().getObject()).addCache(memberCache);
// 캐시 팩토리를 넘겨서 eh캐시 매니저 생성
return new EhCacheCacheManager(Objects.requireNonNull(ehCacheManagerFactoryBean().getObject()));
}
private CacheConfiguration getCacheConfiguration(String cacheName) {
return new CacheConfiguration()
.eternal(false)
.eternal(false)
.timeToIdleSeconds(0)
.timeToLiveSeconds(21600)
.maxEntriesLocalHeap(0)
.memoryStoreEvictionPolicy("LRU")
.name(cacheName);
}
요소 | 설명 |
---|---|
EhCacheManagerFactoryBean | CacheManger 의 적절한 관리 및 인스턴스를 제공하는데 필요하며 EhCache 설정 리소스를 구성한다. |
maxEntriesLocalHeap | Heap 캐시 메모리 pool size 설정, 가비지 컬렉션 대상이 된다. |
memoryStoreEvictionPolicy | 캐시가 가득찼을때 관리 알고리즘 설정 default "LRU" |
timeToLiveSeconds | Element가 존재하는 시간. 이 시간이 지나면 캐시에서 제거된다. 이 시간이 0이면 만료시간을 지정하지 않는다. |
timeToIdleSeconds | Element가 지정한 시간 동안 사용(조회)되지 않으면 캐시에서 제거된다. 이 값이 0인 경우 조회 관련 만료 시간을 지정하지 않는다. |
eternal | true일 경우 timeout 관련 설정이 무시, element가 캐시에서 삭제되지 않음. |
name | 캐시명 |