IT/SpringBoot

스프링 부트 #4.13. 캐싱

blogood 2020. 6. 15. 20:59
반응형

4.13. 캐싱

스프링 프레임워크는 응용 프로그램에 캐싱을 투명하게 추가할 수 있도록 지원합니다. 추상화의 핵심은 메서드에 캐싱을 적용하므로 캐시에서 사용할 수 있는 정보를 기반으로 실행 횟수가 줄어듭니다. 캐싱 논리는 호출기를 방해하지 않고 투명하게 적용됩니다. 스프링 부트은 어노션을 통해 캐싱 지원이 활성화된 한 캐시 인프라를 자동으로 구성합니다.@EnableCaching

  자세한 내용은 Spring Framework 참조의 관련 섹션을 확인합니다.

간단히 말해서 서비스 운영에 캐싱을 추가하는 것은 다음 예제와 같이 해당 메서드에 관련 음법을 추가하는 것만큼 쉽습니다.

import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Component;

@Component
public class MathService {

    @Cacheable("piDecimals")
    public int computePiDecimal(int i) {
        // ...
    }

}

이 예제에서는 비용이 많이 들 수 있는 작업에 캐싱을 사용하는 것을 보여 줍니다. 호출하기 전에 추상화는 인수와 일치하는 캐시의 항목을 찾습니다. 항목을 발견하면 캐시의 콘텐츠가 즉시 호출자에게 반환되고 메서드가 호출되지 않습니다. 그렇지 않으면 메서드가 호출되고 값을 반환하기 전에 캐시가 업데이트됩니다.computePiDecimalpiDecimalsi

  표준 JSR-107(예:)을 투명하게 사용할 수도 있습니다. 그러나 스프링 캐시와 JCache 주석을 혼합하고 일치시키지 않는 것이 좋습니다. @CacheResult

특정 캐시 라이브러리를 추가하지 않으면 Spring Boot는 메모리에 동시 맵을 사용하는 간단한 공급자를 자동으로 구성합니다. 캐시가 필요한 경우(예: 앞의 예제에서) 이 공급자는 캐시를 만듭니다. 간단한 공급자는 프로덕션 사용에 정말 권장 되지 않습니다., 하지만 그것은 시작 하 고 기능을 이해 하는 데 대 한 좋은. 사용할 캐시 공급자에 대해 염두에 두면 응용 프로그램에서 사용하는 캐시를 구성하는 방법을 알아보려면 설명서를 읽어보시기 바랍니다. 거의 모든 공급자는 응용 프로그램에서 사용하는 모든 캐시를 명시적으로 구성해야 합니다. 일부는 속성에 의해 정의 된 기본 캐시를 사용자 지정 하는 방법을 제공 합니다.piDecimalsspring.cache.cache-names

  캐시에서 데이터를 투명하게 업데이트하거나 제거할 수도 있습니다.

4.13.1. 지원되는 캐시 공급자

캐시 추상화는 실제 저장소를 제공하지 않으며 인터페이스에서 구체화된 추상화에 의존합니다.org.springframework.cache.Cacheorg.springframework.cache.CacheManager

형식 또는 명명된 빈을 정의하지 않은 경우(캐칭 구성표참조), 스프링 부트은 다음 공급자를 검색하려고 시도합니다(표시된 순서로) :CacheManagerCacheResolvercacheResolver

  속성을 설정하여 특정 캐시 공급자를 강제로 설정할 수도 있습니다. 테스트와 같은 특정 환경에서 캐싱을 완전히 사용하지 않도록 설정해야 하는 경우 이 속성을 사용합니다. spring.cache.type
  "스타터"를 사용하여 기본 캐싱 종속성을 빠르게 추가합니다. 스타터가 들어옵니다. 종속성을 수동으로 추가하는 경우 JCache, EhCache 2.x 또는 카페인 지원을 사용하려면 포함해야 합니다. spring-boot-starter-cachespring-context-supportspring-context-support

Spring Boot에서 자동으로 구성된 경우 인터페이스를 구현하는 콩을 노출하여 완전히 초기화되기 전에 구성을 더 조정할 수 있습니다. 다음 예제는 값을 기본 맵으로 전달해야 한다고 플래그를 설정합니다.CacheManagerCacheManagerCustomizernull

@Bean
public CacheManagerCustomizer<ConcurrentMapCacheManager> cacheManagerCustomizer() {
    return new CacheManagerCustomizer<ConcurrentMapCacheManager>() {
        @Override
        public void customize(ConcurrentMapCacheManager cacheManager) {
            cacheManager.setAllowNullValues(false);
        }
    };
}
  앞의 예제에서는 자동 구성이 예상됩니다. 이 경우(사용자 고유의 구성을 제공했거나 다른 캐시 공급자가 자동으로 구성됨)이 아닌 경우 사용자 지정자는 전혀 호출되지 않습니다. 원하는 만큼 사용자 지정자를 가질 수 있으며 사용 하거나 로 주문할 수도 있습니다. ConcurrentMapCacheManager@OrderOrdered
일반

컨텍스트가 하나 이상의 콩을 정의하는 경우 일반 캐싱이 사용됩니다. 해당 유형의 모든 콩을 래핑합니다.org.springframework.cache.CacheCacheManager

J캐시(JSR-107)

JCache는 클래스 패스(즉, JSR-107 호환 캐싱 라이브러리가 클래스 패스에 있음)의 존재를 통해 부트 스트랩되고 "스타터"가 제공합니다. 다양한 호환 라이브러리를 사용할 수 있으며 스프링 부트은 Ehcache 3, 헤이즐캐스트 및 인피니스판에 대한 종속성 관리를 제공합니다. 다른 호환 라이브러리도 추가할 수 있습니다.javax.cache.spi.CachingProviderJCacheCacheManagerspring-boot-starter-cache

공급자를 명시적으로 지정해야 하는 두 개 이상의 공급자가 있을 수 있습니다. JSR-107 표준이 구성 파일의 위치를 정의하는 표준화된 방법을 적용하지 않더라도 Spring Boot는 다음 예제와 같이 구현 세부 정보가 있는 캐시 설정을 수용하기 위해 최선을 다합니다.

# Only necessary if more than one provider is present
spring.cache.jcache.provider=com.acme.MyCachingProvider
spring.cache.jcache.config=classpath:acme.xml
  캐시 라이브러리가 네이티브 구현및 JSR-107 지원을 모두 제공하는 경우 Spring Boot는 JSR-107 지원을 모두 선호하므로 다른 JSR-107 구현으로 전환할 경우 동일한 기능을 사용할 수 있습니다.
  스프링 부트는 헤이즐캐스트에 대한 일반적인 지원을제공합니다. 단일 를 사용할 수 있는 경우 속성을 지정하지 않는 한 자동으로 재사용됩니다. HazelcastInstanceCacheManagerspring.cache.jcache.config

기본을 사용자 지정하는 방법에는 두 가지가 있습니다.javax.cache.cacheManager

  • 속성을 설정하여 시작 시 캐시를 만들 수 있습니다. 사용자 지정 콩이 정의되면 사용자 지정하는 데 사용됩니다.spring.cache.cache-namesjavax.cache.configuration.Configuration
  • org.springframework.boot.autoconfigure.cache.JCacheManagerCustomizer 콩은 전체 사용자 정의에 대한 참조와 함께 호출됩니다.CacheManager
  표준 콩이 정의되면 추상화가 기대하는 구현에 자동으로 래핑됩니다. 더 이상 사용자 정의가 적용되지 않습니다. javax.cache.CacheManagerorg.springframework.cache.CacheManager
에캐시 2.x

에캐시 명명된 파일이 클래스패스의 루트에서 찾을 수 있는 경우 2.x가 사용됩니다. EhCache 2.x가 발견되면 "스타터"에서 제공하는 캐시 관리자를 부트스트랩하는 데 사용됩니다. 다음 예제와 같이 대체 구성 파일도 제공할 수 있습니다.ehcache.xmlEhCacheCacheManagerspring-boot-starter-cache

spring.cache.ehcache.config=classpath:config/another-config.xml
헤이즐캐스트

스프링 부트는 헤이즐캐스트에 대한 일반적인 지원을제공합니다. a가 자동으로 구성된 경우 자동으로 로감이 됩니다.HazelcastInstanceCacheManager

인피니티판

Infinispan에는 기본 구성 파일 위치가 없으므로 명시적으로 지정해야 합니다. 그렇지 않으면 기본 부트스트랩이 사용됩니다.

spring.cache.infinispan.config=infinispan.xml

속성을 설정하여 시작 시 캐시를 만들 수 있습니다. 사용자 지정 콩이 정의된 경우 캐시를 사용자 지정하는 데 사용됩니다.spring.cache.cache-namesConfigurationBuilder

  스프링 부트에서 Infinispan의 지원은 임베디드 모드로 제한되어 있으며 매우 기본적입니다. 더 많은 옵션을 원한다면 공식 인피니스판 스프링 부트 스타터를 대신 사용해야 합니다. 자세한 내용은 인피니스판의 설명서를 참조하십시오.
카우치베이스

Couchbase Java 클라이언트와 구현을 사용할 수 있고 Couchbase가 구성된경우 자동으로 구성된다. 또한 속성을 설정하여 시작 시 추가 캐시를 만들 수도 있습니다. 이러한 캐시는 자동으로 구성된 캐시에서 작동합니다. 사용자 지정자를 사용하여 다른 캐시에 추가 캐시를 만들 수도 있습니다. "main"과 "다른"에서 2초 동안 살 수 있는 사용자 지정 시간이 있는 캐시에 두 개의 캐시(및)가 필요하다고 가정합니다. 다음과 같이 구성을 통해 처음 두 개의 캐시를 만들 수 있습니다.couchbase-spring-cacheCouchbaseCacheManagerspring.cache.cache-namesBucketBucketcache1cache2Bucketcache3Bucket

spring.cache.cache-names=cache1,cache2

그런 다음 다음과 같이 추가 및 캐시를 구성하는 클래스를 정의할 수 있습니다.@ConfigurationBucketcache3

@Configuration(proxyBeanMethods = false)
public class CouchbaseCacheConfiguration {

    private final Cluster cluster;

    public CouchbaseCacheConfiguration(Cluster cluster) {
        this.cluster = cluster;
    }

    @Bean
    public Bucket anotherBucket() {
        return this.cluster.openBucket("another", "secret");
    }

    @Bean
    public CacheManagerCustomizer<CouchbaseCacheManager> cacheManagerCustomizer() {
        return c -> {
            c.prepareCache("cache3", CacheBuilder.newInstance(anotherBucket())
                    .withExpiration(2));
        };
    }

}

이 샘플 구성은 자동 구성을 통해 생성된 것을 다시 사용합니다.Cluster

Redis

Redis를 사용할 수 있고 구성된 경우 A가 자동으로 구성됩니다. 속성을 설정하여 시작 시 추가 캐시를 만들 수 있으며 속성을 사용하여 캐시 기본값을 구성할 수 있습니다. 예를 들어 다음 구성은 10분 동안 살 수 있는 시간을 사용하여 만들고 캐시합니다.RedisCacheManagerspring.cache.cache-namesspring.cache.redis.*cache1cache2

spring.cache.cache-names=cache1,cache2
spring.cache.redis.time-to-live=600000
  기본적으로 두 개의 별도 캐시가 동일한 키를 사용하는 경우 Redis에 겹치는 키가 없고 잘못된 값을 반환할 수 없도록 키 접두사가 추가됩니다. 직접 만들 경우 이 설정을 활성화하는 것이 좋습니다. RedisCacheManager
  고유한 구성을 추가하여 기본 구성을 완전히 제어할 수 있습니다. 기본 직렬화 전략을 사용자 지정하려는 경우에 유용할 수 있습니다. RedisCacheConfiguration@Bean

구성을 더 많이 제어해야 하는 경우 콩을 등록하는 것이 좋습니다. 다음 예제에서는 살 시간을 특정 시간으로 구성된 사용자 지정자를 보여 주는 다음을 보여 주는 예제입니다.RedisCacheManagerBuilderCustomizercache1cache2

@Bean
public RedisCacheManagerBuilderCustomizer myRedisCacheManagerBuilderCustomizer() {
    return (builder) -> builder
            .withCacheConfiguration("cache1",
                    RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofSeconds(10)))
            .withCacheConfiguration("cache2",
                    RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofMinutes(1)));

}
카페인

카페인은 구아바의 지원을 대체하는 구아바의 캐시를 재작성한 자바 8입니다. 카페인이 있는 경우("스타터"에서 제공하는)가 자동으로 구성됩니다. 캐시는 속성을 설정하여 시작 시 만들 수 있으며 다음 순서 중 하나에 의해 사용자 지정할 수 있습니다.)CaffeineCacheManagerspring-boot-starter-cachespring.cache.cache-names

  1. 에 의해 정의 된 캐시 사양 spring.cache.caffeine.spec
  2. 콩이 정의됩니다.com.github.benmanes.caffeine.cache.CaffeineSpec
  3. 콩이 정의됩니다.com.github.benmanes.caffeine.cache.Caffeine

예를 들어 다음 구성은 최대 크기500및 10분 의 라이브 시간을 가진 캐시를 만들고 캐시합니다.cache1cache2

spring.cache.cache-names=cache1,cache2
spring.cache.caffeine.spec=maximumSize=500,expireAfterAccess=600s

콩이 정의되면 자동으로 . 캐시 관리자가 관리하는 모든 캐시와 연결되므로 . 자동 구성은 다른 일반 형식을 무시합니다.com.github.benmanes.caffeine.cache.CacheLoaderCaffeineCacheManagerCacheLoaderCacheLoader<Object, Object>

간단한

다른 공급자를 찾을 수 없는 경우 캐시 저장소로 사용하는 간단한 구현이 구성됩니다. 응용 프로그램에 캐싱 라이브러리가 없는 경우 기본값입니다. 기본적으로 캐시는 필요에 따라 만들어지지만 속성을 설정하여 사용 가능한 캐시 목록을 제한할 수 있습니다. 예를 들어, 캐시만 원하는 경우 다음과 같이 속성을 설정합니다.ConcurrentHashMapcache-namescache1cache2cache-names

spring.cache.cache-names=cache1,cache2

이렇게 하고 응용 프로그램에서 나열되지 않은 캐시를 사용하는 경우 캐시가 필요하지만 시작시에는 런타임에 실패합니다. 이는 신고되지 않은 캐시를 사용하는 경우 "실제" 캐시 공급자의 행동방식과 유사합니다.

없음

구성에 있을 때 적절한 캐시 구성도 예상됩니다. 특정 환경에서 캐싱을 완전히 사용하지 않도록 설정해야 하는 경우 캐시 유형을 강제로 다음 예제와 같이 op 이없는 구현을 사용하도록 설정합니다.@EnableCachingnone

spring.cache.type=none

 

Spring Boot Reference Documentation

Phillip Webb, Dave Syer, Josh Long, Stéphane Nicoll, Rob Winch, Andy Wilkinson, Marcel Overdijk, Christian Dupuis, Sébastien Deleuze, Michael Simons, Vedran Pavić, Jay Bryant, Madhura Bhave, Eddú Meléndez, Scott Frederick

2.3.1.RELEASE

Copyright © 2012-2020

Copies of this document may be made for your own use and for distribution to others, provided that you do not charge any fee for such copies and further provided that each copy contains this Copyright Notice, whether distributed in print or electronically.

출처: docs.spring.io/spring-boot/docs/2.3.1.RELEASE/reference/htmlsingle/#boot-features-caching

반응형