스프링부트 EhCache 2 사용 - 3

dragonappear·2022년 8월 16일
0

Cache

목록 보기
3/5
post-custom-banner


출처

제목: "[Spring] 캐시(Cache) 추상화와 사용법(@Cacheable, @CachePut, @CacheEvict)"
작성자: tistory(망나니개발자)
작성자 수정일: 2021년8월3일
링크: https://mangkyu.tistory.com/179
작성일: 2022년8월16일


제목: "스프링에서 캐시 사용하여 프로젝트 성능 개선해보기"
작성자: jiniaslog
작성자 수정일: 2021년12월24일
링크: https://www.jiniaslog.co.kr/article/view?articleId=254
작성일: 2022년8월16일

Spring이 제공하는 캐시 추상화

  • 스프링은 AOP 방식으로 편리하게 메서드에 캐시 서비스를 적용하는 기능을 제공하고 있다.
  • 캐시 서비스는 트랜잭션과 마찬가지로 AOP를 이용해 메서드 실행 과정에 투명하게 적용된다.
    • 이를 통해 캐시 관련 로직을 핵심 비즈니스 로직으로부터 분리할 뿐만 아니라, 손쉽게 캐시 기능을 적용할 수 있다.
  • 또한 스프링은 캐시 구현 기술에 종속되지 않도록 추상화된 서비스를 제공하고 있다. 그렇기 때문에 환경이 바뀌거나 적용할 캐시 기술을 변경하여도 어플리케이션 코드에 영향을 주지 않는다.

Spring에서 캐시 사용법(@Cacheable, @CachePut, @CacheEvict)

1. @EnableCaching 추가

스프링에서 @Cacheable과 같은 어노테이션 기반의 캐시 기능을 사용하기 위해서는 먼저 별도의 선언이 필요하다
그렇기 때문에 @EnableCaching 어노테이션을 설정 클래스에 추가해주어야 한다.

2, 캐시 매니저 빈 추가

어노테이션을 추가한 후에는 캐시를 관리해줄 CacheManager를 빈으로 등록해주어야 한다.
Spring은 현재 다음과 같은 캐시 매니저들을 제공하고 있다.

  • ConcurrentMapCacheManager: Java의 ConcurrentHashMap을 사용해 구현한 캐시를 사용하는 캐시매니저
  • SimpleCacheManager: 기본적으로 제공하는 캐시가 없어 사용할 캐시를 직접 등록하여 사용하기 위한 캐시매니저
  • EhCacheCacheManager: 자바에서 유명한 캐시 프레임워크 중 하나인 EhCache를 지원하는 캐시 매니저
  • CompositeCacheManager: 1개 이상의 캐시 매니저를 사용하도록 지원해주는 혼합 캐시 매니저
  • CaffeineCacheManager: Java 8로 Guava 캐시를 재작성한 Caffeine 캐시를 사용하는 캐시 매니저
  • JCacheCacheManager: JSR-107 기반의 캐시를 사용하는 캐시 매니저

우리는 많은 캐시매니저들 중에서 필요에 맞는 캐시 매니저를 찾아서 선택하면 된다. 이와 관련된 내용은 스프링 공식 문서를 참고하면 된다.
위와 같이 캐시 매니저를 추가하면 해당 캐시 매니저가 우리의 캐시 관련 기능들을 담당하여 처리하게 된다.

빈 생성

xml에서 설정

ehcache.xml

<ehcache>
    <diskStore path="java.io.tmpdir"/>

    <defaultCache
            maxEntriesLocalHeap="10000"
            maxEntriesLocalDisk="10000"
            eternal="false"
            timeToIdleSeconds="120"
            timeToLiveSeconds="120"
            diskExpiryThreadIntervalSeconds="120"
            memoryStoreEvictionPolicy="LRU"/>

    <cache name="account"
           maxElementsInMemory="10"
           eternal="false"
           timeToIdleSeconds="300"
           timeToLiveSeconds="600"
           memoryStoreEvictionPolicy="LRU" />

</ehcache> 

CacheConfig

@Configuration
@EnableCaching
public class CacheConfig {

    @Bean
    public CacheManager cacheManager() {
        return new EhCacheCacheManager(ehCacheManagerFactoryBean().getObject());
    }

    @Bean
    public EhCacheManagerFactoryBean ehCacheManagerFactoryBean() {
        EhCacheManagerFactoryBean factoryBean = new EhCacheManagerFactoryBean();
        factoryBean.setConfigLocation(new ClassPathResource("ehcache.xml"));
        factoryBean.setShared(true);
        return factoryBean;
    }
}

Config에서 설정

package me.dragonappear.replicationdatasource.config;


import net.sf.ehcache.Cache;
import net.sf.ehcache.config.CacheConfiguration;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.ehcache.EhCacheCacheManager;
import org.springframework.cache.ehcache.EhCacheManagerFactoryBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.Objects;

@Configuration
@EnableCaching
public class CacheConfig {

     /*
         - Eh캐시 매니저 생성 도우미
           빈등록을 해놓으면 된다.
     */
    @Bean
    public EhCacheManagerFactoryBean ehCacheManagerFactoryBean() {
        return new EhCacheManagerFactoryBean();
    }


       /*
           - EhcacheManager 등록
       */
	@Bean
    public CacheManager cacheManager() {
        // 캐시 설정
        CacheConfiguration accountCacheConfig = getCacheConfiguration("account");
        CacheConfiguration memberCacheConfig = getCacheConfiguration("member");

        // 설정을 가지고 캐시 생성
        Cache accountCache = new Cache(accountCacheConfig);
        Cache memberCache = new Cache(memberCacheConfig);

        // 캐시 팩토리에 생성한 eh캐시를 추가
        Objects.requireNonNull(ehCacheManagerFactoryBean().getObject()).addCache(accountCache);
        Objects.requireNonNull(ehCacheManagerFactoryBean().getObject()).addCache(memberCache);

        // 캐시 팩토리를 넘겨서 eh캐시 매니저 생성
        return new EhCacheCacheManager(Objects.requireNonNull(ehCacheManagerFactoryBean().getObject()));
    }

    private CacheConfiguration getCacheConfiguration(String cacheName) {
        return new CacheConfiguration()
                .eternal(false)
                .eternal(false)
                .timeToIdleSeconds(0)
                .timeToLiveSeconds(21600)
                .maxEntriesLocalHeap(0)
                .memoryStoreEvictionPolicy("LRU")
                .name(cacheName);
    }
    

  • 여러번 호출해도 캐싱되어서 셀렉트 쿼리가 나가지 않는것을 확인할수있다.

필수 설정

요소설명
EhCacheManagerFactoryBeanCacheManger의 적절한 관리 및 인스턴스를 제공하는데 필요하며 EhCache 설정 리소스를 구성한다.
maxEntriesLocalHeapHeap 캐시 메모리 pool size 설정, 가비지 컬렉션 대상이 된다.
memoryStoreEvictionPolicy캐시가 가득찼을때 관리 알고리즘 설정 default "LRU"
timeToLiveSecondsElement가 존재하는 시간. 이 시간이 지나면 캐시에서 제거된다. 이 시간이 0이면 만료시간을 지정하지 않는다.
timeToIdleSecondsElement가 지정한 시간 동안 사용(조회)되지 않으면 캐시에서 제거된다. 이 값이 0인 경우 조회 관련 만료 시간을 지정하지 않는다.
eternaltrue일 경우 timeout 관련 설정이 무시, element가 캐시에서 삭제되지 않음.
name캐시명
post-custom-banner

0개의 댓글