Table of Contents
Ehcache 설정법
의존성 추가
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-cache'
implementation 'org.ehcache:ehcache'
implementation 'javax.cache:cache-api'
}
설정파일 추가
resources 폴더에 ehcache.xml 을 추가한다.
로그 확인이 불필요한 경우 listeners 는 제거한다.
searchOrderMaster 는 자바 소스상의 캐시명과 같아야 한다.
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.ehcache.org/v3"
xsi:schemaLocation="http://www.ehcache.org/v3 http://www.ehcache.org/schema/ehcache-core-3.0.xsd">
<cache alias="searchOrderMaster"> <!-- cache 요소는 CachceManager에 의해 작성되고 관리될 Cache 인스턴스를 나타낸다. Cache<k,v> 형태로 인스턴스가 생성된다. alias에는 캐시의 이름을 지정한다. -->
<key-type>java.util.Map</key-type> <!-- key-type 요소는 Cache 인스턴스에 저장될 캐시의 키의 FQCN을 지정한다. 즉, 키의 타입을 명시해주면 된다. 기본 값은 java.lang.Object 이다. -->
<value-type>kr.tenbyten.csapi.web.dto.SearchResponseDto</value-type> <!-- value-type 요소는 Cache 인스턴스에 저장된 값의 FQCN을 지정한다. 기본 값은 java.lang.Object 이다. -->
<expiry> <!-- expiry는 캐시 만료기간에 대해 설정하는 요소이다. -->
<ttl unit="seconds">3</ttl> <!-- ttl에는 캐시 만료 시간을 지정하며 unit에는 단위를 지정한다. 해당 요소는 30초 뒤 캐시가 만료되는 것으로 지정되어 있다. -->
<!-- unit은 days, hours, minutes, seconds, millis, micros, nanos 를 세팅할 수 있다. -->
</expiry>
<listeners>
<listener>
<class>kr.tenbyten.csapi.config.CacheEventLogger</class>
<event-firing-mode>ASYNCHRONOUS</event-firing-mode>
<event-ordering-mode>UNORDERED</event-ordering-mode>
<events-to-fire-on>CREATED</events-to-fire-on>
<events-to-fire-on>EXPIRED</events-to-fire-on>
</listener>
</listeners>
<resources> <!-- resources는 캐시 데이터의 저장 공간과 용량을 지정한다. 만약 힙 메모리만 사용한다면 <heap> 요소만으로 대체할 수 있다. -->
<heap unit="entries">2</heap> <!-- heap은 JVM 힙 메모리에 캐시를 저장하도록 세팅하는 요소이다. -->
<offheap unit="MB">10</offheap> <!-- offheap은 JVM 힙 메모리 외부의 메모리에 캐시를 저장하도록 세팅하는 요소이다. -->
</resources>
</cache>
</config>
application.yml 파일에 아래 내용을 추가해준다.
spring:
cache:
jcache:
config: classpath:ehcache.xml
캐시 활성화
아래 파일을 생성해서 캐시를 활성화 해준다.
@Configuration
@EnableCaching
public class CacheConfig {
}
로그 활성화
로깅이 필요한 경우 아래 파일을 추가해준다.
@Slf4j
public class CacheEventLogger implements CacheEventListener<Object, Object> {
public void onEvent(CacheEvent<? extends Object, ? extends Object> cacheEvent) {
log.info("=================>> getKey: {} / getOldValue: {} / getNewValue:{}", cacheEvent.getKey(), cacheEvent.getOldValue(), cacheEvent.getNewValue());
}
}
캐시 적용
@RequiredArgsConstructor
@Service
public class OrderMasterService {
@Cacheable(value = "searchOrderMaster", key = "#params")
@Transactional(readOnly = true)
public SearchResponseDto search(Map<String, String> params) { ... }
}