스프링 프레임워크

springboot에 JCache로 ehcache 로컬캐시 적용하기

blogger903 2024. 6. 17. 10:15
728x90

이번 포스트에서는 springboot에 ehcache를 로컬캐시로 구성합니다

 

환경

  • springboot 3.1.10
  • gradle 8.7
  • java 17

spring-boot-starter-cache 패키지를 dependency에 추가합니다.
spring-boot-starter-cache는 Spring Boot에서 캐시를 설정하고 사용하는 데 필요한 추상화를 제공하는 모듈입니다. 이 모듈을 통해 캐시를 쉽게 설정하고 다양한 캐시 제공자를 사용할 수 있습니다. 어떤 캐시 제공자를 사용할지는 개발자가 선택할 수 있으며, Spring Boot의 설정 파일을 통해 이를 간단히 구성할 수 있습니다.

 

Spring Boot Starter Cache의 역할 다음과 같습니다.

  • 추상화 제공: 캐시를 설정하고 사용하는 데 필요한 공통 인터페이스와 어노테이션(@Cacheable, @CachePut, @CacheEvict 등)을 제공합니다.
  • 통합: 다양한 캐시 제공자(ehcache, caffeine, redis 등)를 지원하며, 개발자는 설정 파일이나 Java 설정 클래스를 통해 원하는 캐시 제공자를 선택할 수 있습니다.
  • 편리성: 간단한 설정으로 캐싱 기능을 애플리케이션에 통합할 수 있습니다.

Spring Boot에서는 기본적으로 ConcurrentMapCacheManager를 사용하여 인메모리 캐시를 제공하지만, 이는 매우 간단한 캐시로 고급 기능이 부족합니다. 다음은 spring-boot-starter-cache만 사용하여 간단한 인메모리 캐시를 설정하고 사용하는 예시입니다.

build.gradle에 의존성 추가

implementation 'org.springframework.boot:spring-boot-starter-cache'

ehCache 의존성도 추가해줍니다

implementation 'org.ehcache:ehcache::jakarta'

EhCache3버전이상부터는 JSR107 표준을 따르기 때문에 설정하는 방법이 2버전때와 다릅니다

참고: https://www.ehcache.org/documentation/3.10/107.html

 

EhCacheConfig 설정 추가해줍니다
SprignBootApplication이 로드될때 컴포넌트 스캔에 적용되서 기본 CacheManager로 적용됩니다

@EnableCaching
@Configuration
public class EhcacheConfig {

    @Bean
    public org.springframework.cache.CacheManager cacheManager() {
        // EhcacheCachingProvider를 사용하여 CachingProvider를 가져옵니다.
        CachingProvider cachingProvider = Caching.getCachingProvider();
        javax.cache.CacheManager jCacheManager = cachingProvider.getCacheManager();
        javax.cache.configuration.Configuration<Object, Object> configuration = new MutableConfiguration<>()
                .setTypes(Object.class, Object.class)
                .setExpiryPolicyFactory(CreatedExpiryPolicy.factoryOf(Duration.ONE_MINUTE))
                .setStoreByValue(false)
                .setStatisticsEnabled(true);
        jCacheManager.createCache("cache1",configuration);

        // Spring의 CacheManager로 래핑합니다.
        return new JCacheCacheManager(jCacheManager);
    }
}

설정 코드 부가 설명
클래스패스에 JCache 구현체가 한개일경우에만 동작하는 코드입니다

CachingProvider cachingProvider = Caching.getCachingProvider();

여러 구현체 의존성을 추가했다면 full name을 명시합니다

CachingProvider cachingProvider = Caching.getCachingProvider("org.ehcache.jsr107.EhcacheCachingProvider");

캐시 적용 클라이언트 코드

    @Cacheable("cache1")
    public List<MemberDtoV2> findAllMembers() {
        return memberRepository.findAll().stream()
                .map(item -> MemberDtoV2.of(item.getId(), item.getEmail(), item.getName()))
                .collect(Collectors.toList());
    }

 

참고 링크