Spring Boot(11)-Spring Cache 사용

더 읽 기
Spring Cache 사용 하기
Spring 은 Cache 추상 을 제공 합 니 다.이것 은 우리 가 어떤 bean 의 외부 호출 에 Cache 를 사용 해 야 하 는 지 설명 할 수 있 도록 합 니 다.방법 호출 은 Cache 를 사용 한 후 실제 방법 을 호출 하기 전에 캐 시 에서 결 과 를 가 져 옵 니 다.캐 시 에 없 으 면 실제 방법 을 호출 합 니 다.이것 도 AOP 를 기반 으로 이 루어 집 니 다.Spring Cache 에 관 한 소 개 는 본 고의 중점 이 아니 므 로 필요 하 다 면 필자 가 쓴 것 을 참고 할 수 있다.http://elim.iteye.com/blog/2123030。
Spring Boot 애플 리 케 이 션 에서 Spring Cache 를 사용 하려 면@SpringBootConfiguration표 시 된 Class 에@EnableCaching를 추가 해 야 합 니 다.Spring Boot 는 Classpath 에서 제공 하 는 Spring Cache 구현 클래스 에 따라 적합 한 실현 자 를 선택 하여 자동 으로 설정 합 니 다.지원 하 는 실현 은 Ehcache 기반 실현,Redis 기반 실현 등 이 있 으 며 자세 한 내용 은org.springframework.boot.autoconfigure.cache.CacheConfiguration의 소스 코드 를 참고 할 수 있 습 니 다.찾 지 못 하면 ConcurrentMap 기반 구현 을 사용 합 니 다.
다음 코드 에서 Spring Cache 를 사용 합 니 다.
@SpringBootApplication
@EnableCaching
public class Application {

    public static void main(String[] args) {
        SpringApplication app = new SpringApplication(Application.class);
        app.setAddCommandLineProperties(false);
        app.run(args);
    }

}

그리고 bean 에서 Spring Cache 가 제공 하 는 주 해 를 사용 하여 캐 시 를 정의 할 수 있 습 니 다.아래 코드 에 서 는getTime()이름 을cacheName1캐 시 로 정의 합 니 다.
@Component
public class SimpleService {

    @Cacheable("cacheName1")
    public long getTime() {
        return System.currentTimeMillis();
    }
    
}

캐 시 를 간단하게 검증 하 는 단원 테스트 는 다음 과 같 습 니 다.
@SpringBootTest(classes=Application.class)
@RunWith(SpringJUnit4ClassRunner.class)
public class CacheTest {

    @Autowired
    private SimpleService simpleService;
    
    @Test
    public void testGetTime() throws Exception {
        long time1 = this.simpleService.getTime();
        TimeUnit.MILLISECONDS.sleep(100);
        long time2 = this.simpleService.getTime();
        Assert.assertEquals(time1, time2);
    }
    
    
}

Ehcache 로 구현
Spring Cache 의 Ehcache 를 사용 해 야 합 니 다.먼저 pom.xml 에 다음 과 같은 의존 도 를 추가 해 야 합 니 다.
<dependency>
    <groupId>org.springframework.bootgroupId>
    <artifactId>spring-boot-starter-cacheartifactId>
dependency>
<dependency>
    <groupId>net.sf.ehcachegroupId>
    <artifactId>ehcacheartifactId>
dependency>

그리고 가장 쉬 운 방법 은 Classpath 의 루트 아래 에ehcache.xml파일 을 놓 는 것 입 니 다.그러면 Spring Boot 는 기본적으로 Spring Cache 의 Ehcache 를 사용 합 니 다.Ehcache 의 자동 설정 은EhCacheCacheConfiguration에서 정의 합 니 다.Ehcache 의 프로필 이 Classpath 루트 에 저장 되 어 있 지 않 으 면spring.cache.ehcache.config을 통 해 지정 할 수 있 습 니 다.예 를 들 어 아래 코드 는 Classpath 의 config 디 렉 터 리 에서 ehcache.xml 파일 을 Ehcache 의 설정 파일 로 지정 합 니 다.
spring.cache.ehcache.config=classpath:/config/ehcache.xml

Spring Cache 의 자동 설정 속성 정의 클래스 는 Cache Properties 입 니 다.API 문서 나 소스 코드 를 참고 하면 선택 한 Spring Cache 의 실현 이 지정 할 수 있 는 상세 한 설정 정 보 를 볼 수 있 습 니 다.
Simple ServicegetTime()가 지정 한 Cache 는 cacheName 1 이라는 Cache 입 니 다.그래서 ehcache.xml 에서 cacheName 1 이라는 Cache 를 정의 해 야 합 니 다.설정 은 다음 과 같 습 니 다.
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"
    maxBytesLocalHeap="100M">
    <defaultCache maxElementsInMemory="10000" eternal="false"
        timeToIdleSeconds="120" timeToLiveSeconds="120"
        maxElementsOnDisk="10000000" diskExpiryThreadIntervalSeconds="120"
        memoryStoreEvictionPolicy="LRU">
        <persistence strategy="localTempSwap" />
    defaultCache>

    <cache name="cacheName1" />

ehcache>

응용 프로그램 에 다양한 이름 의 Cache 가 많이 적용 되 었 다 면 ehcache.xml 에서 한 번 정의 하면 너무 귀 찮 을 수 있 습 니 다.아마도 주요 Cache 를 ehcache.xml 에 정의 하여 충분 한 사용자 정의 설정 을 하고 싶 을 것 입 니 다.그 다음 에 다른 것 은 사용 할 때 자동 으로 만 들 수 있 고 기본 캐 시 설정 을 사용 하면 자신의 EhCacheCacheManager 가 bean 을 실현 하고getMissingCache()의 논 리 를 존재 하지 않 으 면 만 들 수 있 습 니 다.이렇게 하면 Spring Boot 는 EhCacheCacheManager bean 을 자동 으로 만 들 지 않 습 니 다.아래 의 코드 는 간단 한 예시 이다.
@Component
public class MyEhCacheCacheManager extends EhCacheCacheManager {

    @Override
    protected Cache getMissingCache(String name) {
        Cache cache = super.getMissingCache(name);
        if (cache == null) {
            Ehcache ehcache = super.getCacheManager().addCacheIfAbsent(name);
            cache = new EhCacheCache(ehcache);
        }
        return cache;
    }

}

Redis 사용 실현
Redis 를 사용 하려 면 pom.xml 에spring-boot-starter-data-redis의존 도 를 추가 해 야 합 니 다.그러면 Spring Boot 는 RedisTemplate bean 을 자동 으로 만 듭 니 다.RedisTemplate bean 이 있 으 면 Spring Boot 는 Redis 를 기반 으로 하 는 Spring Cache Manager,RedisCache Manager 를 자동 으로 만 듭 니 다.
<dependency>
    <groupId>org.springframework.bootgroupId>
    <artifactId>spring-boot-starter-data-redisartifactId>
dependency>

Spring Boot 가 기본적으로 만 든 RedisTemplate 는 localhost 를 서비스 주소 로 사용 합 니 다.포트 번 호 는 6379 이 고 데이터베이스 색인 은 0 이 며spring.redis.host을 통 해 Redis 서비스 IP 를 지정 할 수 있 습 니 다.spring.redis.portRedis 서비스 감청 포트 번 호 를 지정 하고spring.redis.database사용 할 데이터 라 이브 러 리 색인 번 호 를 지정 할 수 있 습 니 다.다음 코드 에 서 는10.10.10.3이 호스트 의 Redis 를 사용 하고 데이터베이스 색인 번 호 는 1 입 니 다.Redis 에 대한 더 많은 설정 정 보 는org.springframework.boot.autoconfigure.data.redis.RedisProperties의 API 문 서 를 참고 할 수 있 습 니 다.
spring.redis.host=10.10.10.3
spring.redis.database=1

기본 Spring Cache 의 Redis 가 Redis 에 저 장 된 Key 는cacheName::cacheKey형식 입 니 다.그 중에서 cacheName 은 현재 Spring Cache 의 name 이 고 cacheKey 는 Spring Cache 가 전달 한 Key 입 니 다.spring.cache.redis.key-prefix을 통 해 Redis 에 저 장 된 Key 의 접 두 사 를 지정 할 수 있 으 며,이 속성 이 지정 되면 생 성 된 Key 는 이 접두사 에 Spring Cache 가 전달 하 는 Key 가 됩 니 다.예 를 들 어 아래 코드 에 접 두 사 는test-spring-cache::로 지정 되 어 있 으 며,Spring Cache 가 전달 하 는 Key 가 key 1 이면 최종 적 으로 Redis 에 저 장 된 Key 는test-spring-cache::key1입 니 다.
spring.cache.redis.key-prefix=test-spring-cache::
spring.cache.redis.timeToLive을 통 해 Redis 캐 시 에 있 는 Key 의 생존 시간 을 지정 할 수 있 습 니 다.아래 코드 에 캐 시 유효 시간 이 60 초 로 지정 되 어 있 습 니 다.
spring.cache.redis.timeToLive=60s

Spring Cache 의 Redis 구현 에 대한 더 많은 설정 은org.springframework.boot.autoconfigure.cache.CacheProperties.RedisAPI 문 서 를 참고 할 수 있 습 니 다.
지정 한 Cache 구현
Classpath 에 여러 개의 Spring Cache 구현 클래스 를 동시에 저장 하고 여러 개의 Spring Cache 구현 클래스 가 사용 조건 을 만족 시 킬 수 있 을 때 Spring Boot 는 일정한 순서에 따라 선택 합 니 다.특정한 유형의 Spring Cache 가 적용 되면 다른 유형의 Spring Cache 가 사용 되 지 않 습 니 다.이 자동 으로 사용 되 는 전 제 는 현재 환경 에 Spring Cache 가 없 는 CacheManager 형식의 bean 을 요구 하기 때 문 입 니 다.자동 으로 사용 되 는 순 서 는org.springframework.boot.autoconfigure.cache.CacheType이 매 거 진 에서 정 의 된 순서에 따라 이 루어 집 니 다.그 정 의 는 다음 과 같 습 니 다.
    /**
     * Generic caching using 'Cache' beans from the context.
     */
    GENERIC,

    /**
     * JCache (JSR-107) backed caching.
     */
    JCACHE,

    /**
     * EhCache backed caching.
     */
    EHCACHE,

    /**
     * Hazelcast backed caching.
     */
    HAZELCAST,

    /**
     * Infinispan backed caching.
     */
    INFINISPAN,

    /**
     * Couchbase backed caching.
     */
    COUCHBASE,

    /**
     * Redis backed caching.
     */
    REDIS,

    /**
     * Caffeine backed caching.
     */
    CAFFEINE,

    /**
     * Simple in-memory caching.
     */
    SIMPLE,

    /**
     * No caching.
     */
    NONE

따라서 Classpath 에서 Ehcache 와 Redis 를 동시에 가 진 Spring Cache 가 실현 되면 Ehcache 의 실현 을 우선 사용 하고 Redis 의 실현 을 사용 하려 면spring.cache.type=redis지정 을 통 해 Redis 의 실현 을 사용 할 수 있 습 니 다.
Cache 를 지정 하여 자동 설정 에 만 적용 합 니 다.Cache Manager 를 정의 한 경우 이 설정 은 잘못 되 었 습 니 다.
CacheManagerCustomizer
Cache Manager Customizer 는 Cache Manager 를 사용자 정의 로 확장 하 는 데 사 용 됩 니 다.그 정 의 는 다음 과 같 습 니 다.
@FunctionalInterface
public interface CacheManagerCustomizerextends CacheManager> {

    /**
     * Customize the cache manager.
     * @param cacheManager the {@code CacheManager} to customize
     */
    void customize(T cacheManager);

}

어떤 CacheManager 에 대한 사용자 정의 가 필요 할 때 CacheManager Customizer 인 터 페 이 스 를 실현 할 수 있 습 니 다.사용자 정의 가 필요 한 CacheManager 구현 클래스 로 범 형 을 지정 한 다음 Spring bean 으로 정의 할 수 있 습 니 다.다음 코드 는 Ehcache 가 구현 한 CacheManager 에 대해 사용자 정의 하 였 으 며,EhCacheCacheManager 가 초기 화 된 후 기본 Cache 설정 으로 Cache 를 만 들 었 습 니 다.
@Component
public class EhcacheCacheManagerCustomizer implements CacheManagerCustomizer<EhCacheCacheManager> {

    @Override
    public void customize(EhCacheCacheManager cacheManager) {
        List<String> cacheNames = Arrays.asList("cacheName1", "cacheName2", "cacheName3", "cacheName4", "cacheName5", "cacheName6");
        cacheNames.forEach(cacheManager.getCacheManager()::addCacheIfAbsent);
    }

}

Spring Cache 에 대한 자동 설정 은org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration의 소스 코드 나 API 문 서 를 참고 할 수 있 습 니 다.
(비고:본 고 는 Spring Boot 2.0.3 을 바탕 으로 쓴 것 입 니 다)

좋은 웹페이지 즐겨찾기