source

스프링 부트 - 개발 중에 @Cacheable을 비활성화하려면 어떻게 해야 합니까?

manycodes 2023. 4. 6. 21:49
반응형

스프링 부트 - 개발 중에 @Cacheable을 비활성화하려면 어떻게 해야 합니까?

다음 두 가지를 찾고 있습니다.

  1. 스프링 부트 "dev" 프로파일을 사용하여 개발 중에 모든 캐시를 비활성화하는 방법application.properties에서 모든 기능을 끄는 일반적인 설정은 없습니다.가장 쉬운 방법이 뭐죠?

  2. 특정 메서드에 대해 캐시를 비활성화하려면 어떻게 해야 합니까?SpEl을 이렇게 사용하려고 했습니다.

    @Cacheable(value = "complex-calc", condition="#${spring.profiles.active} != 'dev'}")
    public String someBigCalculation(String input){
       ...
    }
    

하지만 작동시킬 수 있어요이와 관련된 SO에 대해 몇 가지 질문이 있지만 XML 구성 또는 기타에 대해 언급하고 있지만 저는 Spring Boot 1.3을 사용하고 있으며 이것은 자동 구성을 사용하고 있습니다.

일을 너무 복잡하게 만들고 싶지 않아요.

캐시의 타입은, 디폴트로 자동적으로 검출되어 설정됩니다.그러나 사용할 캐시 유형을 지정할 수 있습니다.spring.cache.type설정을 변경합니다.비활성화하려면 값을 다음과 같이 설정합니다.NONE.

특정 프로파일에 대해 수행하려는 경우 해당 프로파일에 추가합니다.application.properties이 경우,application-dev.properties추가하다

spring.cache.type=NONE

캐시를 사용할 수 없게 됩니다.

David Newcomb의 코멘트는 진실을 말해줍니다.

spring.cache.type=NONE캐시를 끄지 않고 캐시를 방지합니다. 즉, 프로그램에 27개 층의 AOP/인터셉터 스택이 추가되지만 캐싱을 수행하지 않습니다.'모두 꺼라'는 게 무슨 의미냐에 따라 다르죠

이 옵션을 사용하면 응용 프로그램 시작 속도가 빨라질 수 있지만 오버헤드가 발생할 수도 있습니다.

1) 스프링 캐시 기능을 완전히 비활성화하려면

를 이동하다@EnableCaching전용 컨피규레이션클래스의 클래스에는,@Profile유효하게 하려면 , 다음과 같이 합니다.

@Profile("!dev")
@EnableCaching
@Configuration
public class CachingConfiguration {}

물론 당신이 이미 가지고 있다면Configuration를 제외한 모든 클래스가 유효하게 되어 있다.dev환경을 재이용하기만 하면 됩니다.

@Profile("!dev")
//... any other annotation 
@EnableCaching
@Configuration
public class NoDevConfiguration {}

2) 가짜(noop) 캐시 매니저 사용

경우에 따라서는 활성화@EnableCaching일부 클래스 또는 일부 Spring 종속성이 Spring 컨테이너에서 빈을 가져올 것으로 예상하기 때문에 프로필로는 충분하지 않습니다.org.springframework.cache.CacheManager인터페이스입니다.
이 경우, 올바른 방법은 가짜 구현을 사용하는 것입니다.이것에 의해, Spring은, 실장중에, 모든 의존 관계를 해결할 수 있습니다.CacheManager오버헤드가 없습니다.

우리는 이 게임을 통해 달성할 수 있었다.@Bean그리고.@Profile:

import org.springframework.cache.support.NoOpCacheManager; 

@Configuration
public class CacheManagerConfiguration {

    @Bean
    @Profile("!dev")
    public CacheManager getRealCacheManager() {
        return new CaffeineCacheManager(); 
        // or any other implementation
        // return new EhCacheCacheManager(); 
    }

    @Bean
    @Profile("dev")
    public CacheManager getNoOpCacheManager() {
        return new NoOpCacheManager();
    }
}

또는 더 적합한 경우 다음 항목을 추가할 수 있습니다.spring.cache.type=NONEM에 기재된 것과 동일한 결과를 생성하는 속성.데니눔 답.

두 번째 질문에는 다음과 같이 답하십시오.

특정 프로파일이 활성화되었는지 여부를 결정하는 메서드를 작성합니다(환경은 주입된 환경입니다).

boolean isProfileActive(String profile) { 
   return Arrays.asList(environment.getActiveProfiles()).contains(profile);
}

캐시 가능한 주석의 스펠 조건에 사용합니다.

기본 프로파일만 있고 이것만으로 개발 프로파일과 Prod 프로파일을 만들고 싶지 않다면 이 방법이 프로젝트에 매우 빠른 솔루션이 될 수 있습니다.

을 하다에서 해 .application.properties:

appconfig.enablecache=true

'어울리다'로 수 요.true/false.

다음으로 @Caching bean을 정의할 때 다음 절차를 수행합니다.

@Bean
public CacheManager cacheManager(@Value("${appconfig.enablecache}") String enableCaching) {
    if (enableCaching.equals("true")) {
        return new EhCacheCacheManager();
        //Add your Caching Implementation here.
    }
    return new NoOpCacheManager();
}

이 '하다'로 되어 있는 false,NoOpCacheManager()를 반환하여 캐시를 사실상 끕니다.

캐시를 글로벌하게 이노블 또는 디세이블로 하는 클래스에서 메서드별로 다음 작업을 수행할 수 있습니다.이것에 의해, 클래스 레벨로 메서드의 캐시 방법을 제어할 수 있습니다.

수 요.application.propertiesmy.cache.enabled=true이 셋업은 현재 디폴트로 유효하게 되어 있습니다.

수 .application-dev.properties다른 값으로 설정합니다.이 접근법의 장점은 어떤 이유로든 필요할 때 방법을 기준으로 이 작업을 더 복잡하게 만들 수 있다는 것입니다.

public class MyClass {

  @Value("${my.cache.enabled:true}")
  public String isMyCacheEnabled;

  public boolean isMyCacheEnabled() {
    return (isMyCacheEnabled == null) || isMyCacheEnabled.equals("") || Boolean.valueOf(isMyCacheEnabled);
  }

  @Cacheable(
      cacheManager = "myCacheManager",
      cacheNames = "myCacheKey",
      condition = "#root.target.isMyCacheEnabled()",
      key = "#service + '-' + #key")
  public String getMyValue(String service, String key) {
    // do whatever you normally would to get your value
    return "some data" + service + key;
  }
}

언급URL : https://stackoverflow.com/questions/35917159/spring-boot-how-to-disable-cacheable-during-development

반응형