Ehcache 버전 2 -> 3 migration

Brunch Kim·2024년 12월 27일
post-thumbnail

본 포스팅에서는 Ehcache 버전 2 -> 3 migration 방법에 대해 알아보도록합니다.


Ehcache 버전 현황

mvn : https://mvnrepository.com/artifact/org.ehcache/ehcache
github : https://github.com/ehcache/ehcache3

2024년 12월 기준 v3.10.x 버전대가 최신임을 확인할 수 있습니다.


Migration 대상 버전

  • 변경 전 : v2.10.3 -> 변경 후 : v3.9.11
  • 참고로 v3.10.8 의 경우 config 설정 방식 변경 등 migration 해야하는 부분이 더 많아짐에 따라 안전하게 v3.9.x 를 먼저 거치고 가도록합니다.
  • Ehcache 3 버전의 핵심은 JCache API를 지원한다는 점이니 이 점을 알고 진행하는 것이 좋습니다..

JCache(JSR-107) 에 대해서

JSR-107 란?

  • 코드 변경에 앞서 JCache 에 대해 먼저 꼭 알아야합니다.
  • JCache(Java Temporary Caching API, JSR-107)는 Java 애플리케이션에서 캐시를 처리할 수 있도록 표준화된 방법을 제공하는 API입니다.
  • 이 API는 특정 벤더에 의존하지 않으며, 다양한 캐시 라이브러리 간에 일관된 방식으로 사용할 수 있도록 만들어졌습니다.

JSR-107 지원

  • Ehcache 3 부터는 JCache (JSR-107) API를 완전히 지원합니다.
  • 따라서, JCache API를 사용하는 애플리케이션에서 Ehcache를 캐시 제공자로 사용할 수 있습니다.
  • JCache를 통해 Ehcache API 호출을 숨기고, JCache 표준 API만 사용해도 Ehcache가 실제 캐시 작업을 처리하도록 할 수 있습니다.
  • 이 덕분에, Ehcache를 사용할 때 JCache API만으로 코드가 작성되고, 나중에 다른 JCache 지원 캐시 제공자로 바꿔도 애플리케이션 코드를 거의 변경하지 않아도 됩니다.

JSR-107 지원이 중요한 이유

  • 벤더 독립성: JCache API를 사용하면 Ehcache, Infinispan, Hazelcast 등 다양한 캐시 솔루션을 벤더에 상관없이 동일한 코드로 사용할 수 있습니다.
  • 코드 변경 최소화: JCache API만 사용하면, 나중에 캐시 솔루션을 변경하더라도 애플리케이션 코드를 변경하지 않아도 됩니다.

실전! 코드 수정

1) appliation.yml 수정

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

2) dependency 추가

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 관련 예외가 발생할 수 있습니다.

3) 마지막으로 ehcache.xml 수정

<!-- 변경 전 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의 도움을 받으면 다소 빠르게 변경할 수 있습니다.

참고로 위 내용들은 모든 마이그레이션 시 발생하는 모든 상황을 반영한 것은 아니므로 참조에 걸어둔 링크인 마이그레이션 가이드를 통해 더 자세한 내용 확인이 필요할 수 있습니다.


참조

profile
브런치 즐기는 여유있는 날

0개의 댓글