
본 포스팅에서는 Ehcache 버전 2 -> 3 migration 방법에 대해 알아보도록합니다.
mvn : https://mvnrepository.com/artifact/org.ehcache/ehcache
github : https://github.com/ehcache/ehcache3
![]() | ![]() |
|---|
2024년 12월 기준 v3.10.x 버전대가 최신임을 확인할 수 있습니다.
JSR-107 란?
JSR-107 지원
JSR-107 지원이 중요한 이유
Spring Boot 3.x 와 2.x 버전에서의 cache type 을 적용하는 config 방식이 서로 다릅니다. 3.x 에서는 JCache (JSR-107) API가 필수로 사용되며, Ehcache 3을 사용하려면 spring.cache.type: jcache로 설정해야 합니다.
# 변경 전 ehcache2 & Spring Boot2 방식
spring:
cache:
ehcache:
config: classpath:ehcache.xml
# 변경 후 ehcache3 & Spring Boot2 방식
spring:
cache:
type: ehcache
ehcache:
config: classpath:ehcache.xml
# 변경 후 ehcache3 & Spring Boot3 방식
spring:
cache:
type: jcache
jcache:
config: classpath:ehcache.xml
Ehcache3. 즉, JCache API 를 사용하기 위해서는 다음과 같은 디펜던시들이 필요합니다.
dependencies {
// Ehcache 3 의존성
implementation 'org.ehcache:ehcache:3.9.11'
// JCache API (JSR-107) 의존성
implementation 'javax.cache:cache-api:1.1.1'
// JAXB 의존성 (Java 9 이상에서 필요)
implementation 'javax.xml.bind:jaxb-api:2.3.1'
implementation 'org.glassfish.jaxb:jaxb-runtime:2.3.9'
// Spring Cache JCache 의존성 (Spring Boot 2.x 이상에서 JCache를 사용하려면 필요)
implementation 'org.springframework.boot:spring-boot-starter-cache'
}
각 라이브러리 필요성에 대한 세부적인 설명을 덧붙이자면 다음과 같습니다.
JCache API 의존성 (javax.cache:cache-api)
Ehcache 3는 JCache API (JSR-107) 표준을 구현하므로, 이를 사용하려면 javax.cache:cache-api 의존성을 추가해야 합니다.
Ehcache 3 의존성 (org.ehcache:ehcache)
Ehcache 3를 사용하려면 org.ehcache:ehcache 라이브러리를 추가해야 합니다. 이 라이브러리는 Ehcache의 기본 캐시 구현체입니다.
JAXB 의존성 (Java 9 이상에서 필요)
javax.xml.bind:jaxb-api: Ehcache 3에서 XML 데이터를 처리하기 위해 필요한 라이브러리입니다. Java 9 이상에서 JDK에서 기본 제공되지 않기 때문에 추가해야 합니다.
org.glassfish.jaxb:jaxb-runtime: JAXB를 사용할 때 필요한 런타임 라이브러리입니다.
Spring Cache JCache 지원 (spring-boot-starter-cache)
만약 Spring Boot에서 JCache를 사용하여 Ehcache 3을 설정하려면, spring-boot-starter-cache를 포함해야 합니다.
Java 9 이상에서 JAXB 의존성 문제
Java 9 이상에서는 JAXB가 JDK에서 제거되었기 때문에, jaxb-api와 jaxb-runtime을 명시적으로 추가해야만 Ehcache 3에서 XML 처리가 가능합니다. 그렇지 않으면 JAXB 관련 예외가 발생할 수 있습니다.
<!-- 변경 전 ehcache 2 -->
<?xml version="1.0" encoding="UTF-8"?>
<ehcache>
<diskStore path="java.io.tmpdir"/>
<cache name="RegionEvent"
maxEntriesLocalHeap="1000"
maxEntriesLocalDisk="0"
eternal="false"
timeToIdleSeconds="0"
timeToLiveSeconds="60"
memoryStoreEvictionPolicy="LRU"
transactionalMode="off">
<persistence strategy="none"/>
</cache>
</ehcache>
<!-- 변경 후 ehcache 3-->
<?xml version="1.0" encoding="UTF-8"?>
<config xmlns="http://www.ehcache.org/v3">
<persistence directory="java.io.tmpdir"/>
<!-- 공통으로 사용할 템플릿 정의 -->
<cache-template name="default">
<expiry>
<ttl unit="seconds">60</ttl>
</expiry>
<resources>
<heap unit="entries">1000</heap>
</resources>
</cache-template>
<!-- RegionEvent, SellerEvent 에 대하여 default template 정책 적용 -->
<cache alias="RegionEvent" uses-template="default"/>
<cache alias="SellerEvent" uses-template="default"/>
</config>
이상입니다.
이로써 Ehcache3 버전으로의 변경이 완료되었습니다.
ehcache.xml 에 정의되어있는 캐시들이 많을 수록 코드 수정하는 데에 시간이 많이 걸릴 수 있는데 이러한 단순 노가다는 copilot 등 AI의 도움을 받으면 다소 빠르게 변경할 수 있습니다.
참고로 위 내용들은 모든 마이그레이션 시 발생하는 모든 상황을 반영한 것은 아니므로 참조에 걸어둔 링크인 마이그레이션 가이드를 통해 더 자세한 내용 확인이 필요할 수 있습니다.