본문 바로가기

Spring Boot

ehCache 설정하기

ehCache 는 캐시 엔진 중의 하나이다. 주요 특징으로는 아래와 같다.

  • 경량의 빠른 캐시 엔진
  • 확장성 : 메모리, 디스크 저장 지원, 멀티 CPU의 동시 접근에 튜닝
  • 분산 지원 : 동기, 비동기 복사, 피어 자동 발견
  • 높은 품질

결국 캐시란, 반복적으로 데이터를 불러올 때 지속적으로 DBMS 혹은 서버에 요청하는 것이 아닌 메모리에 데이터를 저장하였다가 데이터를 불러다가 쓰는 것을 의미한다.

따라서 서버나 DBMS에 부담을 덜어주고, 엄청 빠르기 때문에 많은 시스템에서 사용하고 있다.

대표적으로 Browser Cache, Apacha Cache, DNS Cache등 여러가지 형태로 캐시가 사용되고 있다.

 

 

1. gradle dependencies 추가

implementation 'org.springframework.boot:spring-boot-starter-cache'
compile group: 'net.sf.ehcache', name: 'ehcache', version: '2.10.6'

 

2. @Component 생성, @Bean 등록

EHCacheConfig Class 생성

@Component
public class EHCacheConfig {
private static final Logger logger = LoggerFactory.getLogger(EHCacheConfig.class);
	@Bean
	public EhCacheManagerFactoryBean ehCacheManagerFactoryBean() {
		EhCacheManagerFactoryBean ehCacheManagerFactoryBean = new EhCacheManagerFactoryBean();
		ehCacheManagerFactoryBean.setConfigLocation(new PathMatchingResourcePatternResolver().getResource("classpath:config/ehcache-config.xml"));
		ehCacheManagerFactoryBean.setShared(true);
		return ehCacheManagerFactoryBean;
	}
	
	@Bean
	public EhCacheCacheManager ehCacheCaheManager(EhCacheManagerFactoryBean ehCacheManagerFactoryBean) {
		return new EhCacheCacheManager(ehCacheManagerFactoryBean.getObject());
	}

}

 

 

3. @SpringBootApplication Boot 실행 Class(~~Application.java) 에 CacheManager 등록

@Autowired 
private final CacheManager cacheManager; 

@Bean
public CommandLineRunner runner() { // command Log
	return (a) -> {
		logger.info("Using cache manager: " + this.cacheManager.getClass().getName());
	};
};

 

 

4. cache-config 설정파일 생성

<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="ehcache.xsd" 
    updateCheck="false">

    <diskStore path="java.io.tmpdir" />
    
    <cache name="AlarmRatioCache" 
	        eternal="false" 
	    	maxEntriesLocalHeap="10000"
	        maxEntriesLocalDisk="2000" 
	        diskSpoolBufferSizeMB="20"
	        timeToIdleSeconds="1200" timeToLiveSeconds="1800"
	        memoryStoreEvictionPolicy="LFU" 
	        transactionalMode="off">
		<persistence strategy="localTempSwap" />
    </cache>
    
<!-- maxEntriesLocalHeap : 메모리에 생성 될 최대 캐시 갯수 -->
<!-- maxEntriesLocalDisk	디스크에 생성 될 최대 캐시 갯수 -->
<!-- eternal	영속성 캐시 설정 (지워지는 캐시인지?) -->
<!-- external = "true"이면, timeToIdleSecond, timeToLiveSeconds 설정이 무시됨 -->
<!-- timeToIdleSecond	해당 초동안 캐시가 호출 되지 않으면 삭제 -->
<!-- timeToLiveSeconds	해당 초가 지나면 캐시가 삭제 -->
<!-- overflowToDisk	오버플로우 된 항목에 대해 disk에 저장할 지 여부 -->
<!-- diskPersistent	캐시를 disk에 저장하여, 서버 로드 시 캐시를 말아 둘지 설정 -->
<!-- diskExpiryThreadIntervalSeconds	Disk Expiry 스레드의 작업 수행 간격 설정 -->
<!-- memoryStoreEvictionPolicy	캐시의 객체 수가 maxEntriesLocalHeap에 도달하면, 객체를 추가하고 제거하는 정책 설정 -->
<!-- LRU : 가장 오랫동안 호출 되지 않은 캐시를 삭제 -->
<!-- LFU : 호출 빈도가 가장 적은 캐시를 삭제 -->
<!-- FIFO : First In First Out, 캐시가 생성된 순서대로 가장 오래된 캐시를 삭제 -->
</ehcache> 

 

5. 호출할 @RestController Class에  @EnableCaching 등록

6. @Repository Class에 사용할 mapper에 @Cacheable(value="AlarmRatioCache") 등록

 

자세한 내용은 ehCache API를 참고하면 되겠다.

https://www.ehcache.org/documentation/2.7/recipes/spring-annotations.html

'Spring Boot' 카테고리의 다른 글

springboot + gradle + front-end npm build  (0) 2022.03.16
Spring servlet container 이미지  (0) 2021.09.02
[SpringBoot] DateTime Format  (0) 2021.06.11
Spring Boot + Logback 설정  (0) 2019.06.20
Spring Boot + Apache 연동  (0) 2019.06.17