LostCatBox

spring-cache에 대해서

Word count: 589Reading time: 3 min
2024/02/11 Share

왜?

  • 캐시를 활용할때 어떤 차이가 있으며, 어떤 효과를 지녔는지?

spring-cache + ehcache

build.gradle

1
2
3
4
5
6
//ehcache
implementation 'org.springframework.boot:spring-boot-starter-cache'
implementation 'org.ehcache:ehcache:3.10.0'

// JSR-107 API를 사용하기 위함
implementation 'javax.cache:cache-api:1.1.1'

xml 세팅

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
<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="rpkResponse"> <!-- @Cacheable의 value, 캐시 이름 -->
<key-type>java.lang.String</key-type> <!-- @Cacheable의 key, 캐시 키 타입, 기본 값은 java.lang.Object -->
<!-- @Cacheable의 return 타입 class 위치, 기본 값은 java.lang.Object -->
<value-type>[객체 주소]</value-type>

<!-- ttl 설정 -->
<expiry>
<ttl unit="millis">60000</ttl>
</expiry>
<!-- unit은 days, hours, minutes, seconds, millis, micros, nanos 를 세팅할 수 있다. -->

<!-- Cache의 리스너 클래스를 등록하는 설정, 리스너가 필요 없다면 등록하지 않아도 된다. -->
<listeners>
<listener>
<!-- 리스너 클래스 위치 -->
<class>[클래스위치]</class>

<!-- 비동기 방식, 반대 동기는 SYNCHRONOUS -->
<event-firing-mode>ASYNCHRONOUS</event-firing-mode>
<!-- 순서 보장 X, 반대는 ORDERED -->
<event-ordering-mode>UNORDERED</event-ordering-mode>

<!-- EVICTED, EXPIRED, REMOVED, CREATED, UPDATED-->
<!-- 생성과 만료 시 이벤트 발생 -->
<events-to-fire-on>CREATED</events-to-fire-on>
<events-to-fire-on>UPDATED</events-to-fire-on>
<events-to-fire-on>EXPIRED</events-to-fire-on>
</listener>
</listeners>

<!-- resources는 캐시 데이터의 저장 공간과 용량을 지정한다. 만약 힙 메모리만 사용한다면 <heap> 요소만으로 대체할 수 있다. -->
<resources>
<!-- heap은 JVM 힙 메모리에 캐시를 저장하도록 세팅하는 요소
entries는 항목이다. 800개의 항목을 힙에 저장할 수 있다는 뜻
800개가 넘어가면 가장 오랫동안 참조하지 않은 것을 삭제하고 새로운 것을 저장(LRU) -->
<!-- 메모리가 충분하다는 가정 하에 max는 5000 이하로 설정하는 것을 권장 -->
<heap unit="entries">800</heap>

<!-- offheap은 JVM 힙 메모리 외부의 메모리에 캐시를 저장하도록 세팅하는 요소이다. -->
<!-- <offheap unit="MB">10</offheap>-->
<!-- B, KB, MB, GB, TB -->

<!-- Disk 메모리, LFU strategy-->
<!-- persistent="false" shutdown 되면 disk를 비워버립니다.-->
<!-- persistent="true" shutdown 되도 disk에 보관되고 JVM이 다시 뜨면 load it back 합니다.-->
<!-- <disk unit="MB" persistent="false">5</disk> -->
</resources>
</cache>

</config>

application-yml

1
2
3
4
spring:
cache:
jcache:
config: classpath:ehcache.xml

cacheEventListener

1
2
3
4
5
6
7
@Slf4j
public class CacheEventLogger implements CacheEventListener<Object, Object> {

public void onEvent(CacheEvent<? extends Object, ? extends Object> cacheEvent) {
log.info("cache event logger message. getKey: {} / getOldValue: {} / getNewValue:{}", cacheEvent.getKey(), cacheEvent.getOldValue(), cacheEvent.getNewValue());
}
}

eacheConfig

1
2
3
4
@Configuration
@EnableCaching
public class CacheConfig {
}

사용예시

1
2
3
4
5
6
7
8
9
10
11
12
13
@Cacheable(
value = "rpkResponse",
key = "#params.screenCode + #params.osCode + '_A'",
condition = "#params.screenCode != null && #params.screenCode != '' && #params.osCode != null && #params.osCode != ''"
)
@Override
public RpkResponse getRpk(RpkParams params) {
ParamsValidator.validateRpkParams(params);
NTvingRpkParams rpkParams = NTvingRpkParams.of(params);
NTvingRpkResponse response = nTvingSearchFeign.getRpk(rpkParams);

return RpkResponse.of(response);
}
CATALOG
  1. 1. 왜?
  2. 2. spring-cache + ehcache
    1. 2.1. build.gradle
    2. 2.2. xml 세팅
    3. 2.3. application-yml
    4. 2.4. cacheEventListener
    5. 2.5. eacheConfig
    6. 2.6. 사용예시