-
[우아한테크캠프] SpringBoot + Ehcache카테고리 없음 2018. 8. 11. 09:43
JSR(Java Specification Request, 자바 스펙 요구서)
스프링의 장점 중 하나로 PSA(Portable Service Abstraction)가 있다.
외부 서비스들을 간단한 추상 인터페이스만으로 쉽게 사용할 수 있도록 해주는 것
Cache에서는 Redis, Ehcache, ConcurrentMap 등을 CacheManager 인터페이스로 추상화돼있고,
CacheManager 인터페이스를 이용해서 또 다른 Cache 라이브러리를 사용할 수 있다.
PSA(Portable Service Abstraction)
성격이 비슷한 여러 종류의 기술을 추상화하고 이를 동일한 사용법으로 사용할 수 있도록 지원해주는 것
스프링에서는 서비스 추상화를 위해 다양한 어댑터를 제공한다. 즉 다양한 기술에 대한 API를 제공한다.
캐시를 사용하는 이유
같은 요청이 빈번하게 들어오는 경우에 해당 결과를 보관하여 빠르게 결과를 돌려주기 위해
스프링 부트에서는 각 Cache API들의 기술 및 변화에 관계없이 일관된 사용을 위해 추상화를 지원한다(CacheManager)
스프링 부트에서는 기본적으로 여러 서드파티 캐시 라이브러리를 지원한다. 꽤 많은 캐시를 지원하니 자신에게 맞는 캐시를 골라서 사용하면 된다.
1. 라이브러리 추가
compile('org.springframework.boot:spring-boot-starter-cache')
compile('net.sf.ehcache:ehcache')2. ehcache.xml 생성
<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"
updateCheck="false">
<diskStore path="java.io.tmpdir" />
<cache name="getBestCategoryListCache"
maxEntriesLocalHeap="10000"
maxEntriesLocalDisk="1000"
eternal="false"
diskSpoolBufferSizeMB="20"
timeToIdleSeconds="300" timeToLiveSeconds="600"
memoryStoreEvictionPolicy="LFU"
transactionalMode="off">
</cache>
<cache name="getPromotionListCache"
maxEntriesLocalHeap="10000"
maxEntriesLocalDisk="1000"
eternal="false"
diskSpoolBufferSizeMB="20"
timeToIdleSeconds="300" timeToLiveSeconds="600"
memoryStoreEvictionPolicy="LFU"
transactionalMode="off">
</cache>
</ehcache>3. 캐시 매니저 빈 등록 (기본적으로 어떤 설정도 하지 않으면 ConcurrentMapCacheManager를 사용한다. 하지만 상황에 맞게 다른 캐시 구현체를 등록할 수도 있다.)@Bean
public CacheManager cacheManager() {
return new EhCacheCacheManager(ehCacheCacheManager().getObject());
}
@Bean
public EhCacheManagerFactoryBean ehCacheCacheManager() {
EhCacheManagerFactoryBean factory = new EhCacheManagerFactoryBean();
factory.setConfigLocation(new ClassPathResource("ehcache.xml"));
factory.setShared(true);
return factory;
}4. Cache Enable (@EnableCaching 추가)
5. 어노테이션을 통한 Cache 사용 (@Cacheable, @CacheEvict, @CachePut)
@CachePut : 매번 메서드를 호출, 하지만 호출과 동시에 캐시에 보관하므로 보통 저장할 때 용이
@CachePut(key = "#name", value = "wonwoo")
public String save(String name) {
return name;
}참고
http://blog.breakingthat.com/2018/03/19/springboot-ehcache-%EC%A0%81%EC%9A%A9/
https://minwan1.github.io/2018/03/18/2018-03-18-Spring-Cache/