복붙노트

[SPRING] 항목 / 엔티티 모음이있는 Spring 캐시

SPRING

항목 / 엔티티 모음이있는 Spring 캐시

스프링 캐시 (Spring Cache)를 사용하여 키 집합을 전달하고 반환 값은 엔티티 목록입니다. 캐싱 프레임 워크에서 반환 목록의 각 요소가 해당 코드와 함께 캐시된다는 것을 이해하고 싶습니다. 현재 키가 전체 목록이며, 후속 호출에서 키가 누락 된 경우 전체 콜렉션을 다시로드하려고 시도합니다.

@Override
@Cacheable(value = "countries")
public List<Country> getAll(List<String>codes) {
    return countryDao.findAllInCodes(codes);
}

또 다른 가능성은지도가 반환된다는 것입니다. 마찬가지로 이전에 쿼리 한 적이없는 항목에 대해서만 쿼리를 수행하고 키를 사용하여 각 항목을 캐시하는 데에도 지능적으로 캐시를 사용하고 싶습니다.

@Override
@Cacheable(value = "countries")
public Map<String,Country> getAllByCode(List<String>codes) {
    return countryDao.findAllInCodes(codes);
}

국가 클래스가 다음과 같다고 가정 해 보겠습니다.

class Country{
  String code; 
  String fullName;
  long id;

... // getters setters constructurs etc.. 
}

스프링 캐쉬로 가능합니까?

해결법

  1. ==============================

    1.사실, Spring의 Caching Abstraction을 사용하더라도 가능하지만 OOTB (Out-of-the-Box)는 가능하지 않습니다. 본질적으로 Spring의 캐싱 인프라 스트럭처를 커스터마이징해야한다 (아래에서 더 설명한다)

    사실, Spring의 Caching Abstraction을 사용하더라도 가능하지만 OOTB (Out-of-the-Box)는 가능하지 않습니다. 본질적으로 Spring의 캐싱 인프라 스트럭처를 커스터마이징해야한다 (아래에서 더 설명한다)

    디폴트로, Spring의 캐싱 인프라 스트럭처는 @Cacheable 메소드 매개 변수 전체를 캐시 "키"로 사용합니다. 물론 여기에서 설명하는 것처럼 SpEL 표현식이나 사용자 정의 KeyGenerator 구현을 사용하여 키 해상도를 사용자 정의 할 수도 있습니다.

    하지만 @Cacheable 메서드의 반환 값과 함께 각 캐시 항목 (즉 배열 / 컬렉션 또는 Map을 기반으로하는 키 / 값 쌍)으로 매개 변수 인수의 컬렉션 또는 배열을 분해하지는 않습니다.

    이를 위해서는 Spring의 CacheManager (캐싱 전략 / 제공자에 따라 다름)와 캐시 인터페이스의 맞춤 구현이 필요합니다.

    이 게시물에 대한 예제 (약간)를 업데이트 / 정리했습니다.

    이 예제는 스프링 프레임 워크 자체에서 제공되는 ConcurrentMapCacheManager를 확장하고 커스터마이징한다.

    이론적으로 Spring Data Redis의 Redis, 여기 (소스), Spring Data GemFire의 Pivotal GemFire의 CacheManager (소스)와 같은 CacheManager 구현을 확장 / 사용자 정의 할 수있다. Pivotal GemFire의 오픈 소스 버전은 Apache Geode이며 해당 Spring Data Geode 프로젝트 (기본적으로 SD GemFire와 동일한 Spring Data Geode의 CacheManager 소스)가 있습니다. 물론이 기술을 다른 캐싱 공급자에게 적용 할 수 있습니다 ... Hazelcast, Ehcache 등

    그러나, 작업의 실제적인 함축은 Spring의 Cache 인터페이스의 맞춤 구현 (또는 구체적으로 기본 클래스)에 의해 처리된다.

    어쨌든, 내 예제를 통해 애플리케이션의 캐싱 요구 사항을 충족시키기 위해 애플리케이션에서해야 할 일을 파악할 수있을 것이다.

    또한지도를 처리하는 데 동일한 접근 방식을 적용 할 수 있지만,이를 연습 문제로 남겨 둘 것입니다. ;-).

    희망이 도움이!

    건배, 남자

  2. from https://stackoverflow.com/questions/44529029/spring-cache-with-collection-of-items-entities by cc-by-sa and MIT license