Spring Ehcache

Developer:Bird·2020년 11월 20일
1

Spring

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

1.[EhCache?]

메모리,디스크저장소,리스너,캐시로더,Restful, Soap api들을 유용하게 사용할 수 있도록 도와줍니다.

<dependency>
    <groupId>javax.cache</groupId>
    <artifactId>cache-api</artifactId>
    <version>X.X.X</version>
</dependency>

다음과 같은 종속성을 추가하면 사용 할 수 있다.

2.[How to Use?]

1. JavaPOJO(순수자바언어)사용하여 Ehcache Api를 구성(Configuration)

public class CacheHelper {

private CacheManager cacheManager;
  private Cache<Integer, Integer> squareNumberCache;

  public CacheHelper() {
      cacheManager = CacheManagerBuilder
        .newCacheManagerBuilder().build();
      cacheManager.init();

      squareNumberCache = cacheManager
        .createCache("squaredNumber", CacheConfigurationBuilder
          .newCacheConfigurationBuilder(
            Integer.class, Integer.class,
            ResourcePoolsBuilder.heap(10)));
  }

  public Cache<Integer, Integer> getSquareNumberCacheFromCacheManager() {
      return cacheManager.getCache("squaredNumber", Integer.class, Integer.class);
  }
  
  // standard getters and setters

1.newCacheManagerBuilder() Api를 사용하여 캐시 squaredNumber를 생성
2.캐시를 얻기위해 getCache() APi이용하여 사용

2. 제공된 스키마정의에따른 XML file을 통한 구성(Configuration)

-XML-
<cache-template name="squaredNumber">
    <key-type>java.lang.Integer</key-type>
    <value-type>java.lang.Integer</value-type>
    <heap unit="entries">10</heap>
</cache-template>
-JavaCode-
URL myUrl = getClass().getResource(xmlFile); 
XmlConfiguration xmlConfig = new XmlConfiguration(myUrl); 
CacheManager myCacheManager = CacheManagerBuilder
  .newCacheManager(xmlConfig);

3.[구성 옵션]

3.1 지속성

캐시에 저장할 값이 너무많으면 해당 값중 일부를 하드 드라이브에 저장할 수 있음.

PersistentCacheManager persistentCacheManager = 
  CacheManagerBuilder.newCacheManagerBuilder()
    .with(CacheManagerBuilder.persistence(getStoragePath()
      + File.separator 
      + "squaredValue")) 
    .withCache("persistent-cache", CacheConfigurationBuilder
      .newCacheConfigurationBuilder(Integer.class, Integer.class,
        ResourcePoolsBuilder.newResourcePoolsBuilder()
          .heap(10, EntryUnit.ENTRIES)
          .disk(10, MemoryUnit.MB, true)) 
      )
  .build(true);
 
persistentCacheManager.close();

PersistentCacheManager 를 사용하여서 지속적 저장위치를 결정할 수 있게만듬

3.2 데이터 만료

    CacheConfiguration<Integer, Integer> cacheConfiguration 
  = CacheConfigurationBuilder
    .newCacheConfigurationBuilder(Integer.class, Integer.class, 
      ResourcePoolsBuilder.heap(100)) 
    .withExpiry(Expirations.timeToLiveExpiration(Duration.of(60, 
      TimeUnit.SECONDS))).build();

이 캐시에서 모든 데이터는 60 초 동안 유지되며 그 시간이 지나면 메모리에서 삭제됩니다.

4.[실전 분석]

1. Repository

public interface VetRepository extends Repository<Vet, Integer> {
	@Transactional(readOnly = true)
	@Cacheable("vets")
	Collection<Vet> findAll() throws DataAccessException;
}

@Cacheable 붙이게 되면 나중에 cache하게될 목록으로 등록하게됨. 이때 findAll()이 호출될때 디스크에 접근하기 전에 먼저 "vets"라는 이름을 가진 캐시저장소에 Cache되어있는지 확인을 하고 있을 경우 데이터를 쓴다. 없을경우 데이터를 캐시한다.

[참고사항]
@EnableCaching안의 어노테이션은 공용 메소드에 대한 캐싱 어노테이션이 있는지 모든 Spring Bean을 검사하는 포스트 프로세서를 트리거합니다. 이러한 주석이 발견되면 프록시가 자동으로 생성되어 메서드 호출을 가로 채서 그에 따라 캐싱 동작을 처리합니다. 포스트 프로세서는 @Cacheable, @CachePut및 @CacheEvict을 처리합니다 .

2.CacheConfiguration

@Configuration(proxyBeanMethods = false)
@EnableCaching
class CacheConfiguration {

@Bean
public JCacheManagerCustomizer petclinicCacheConfigurationCustomizer() {
	return cm -> {
		cm.createCache("vets", cacheConfiguration());
	};
}

@Cacheable("vets")를 작성한후, CacheConfiguration에 "vets" Cache를 Bean 등록 하여야 Cache가 생성이 가능하다.

3.Entity

@Entity
@Table(name = "vets")
public class Vet extends Person implements Serializable{
.
.
.

@XmlRootElement
public class Vets implements Serializable {

	private List<Vet> vets;

	@XmlElement
	public List<Vet> getVetList() {
		if (vets == null) {
			vets = new ArrayList<>();
		}
		return vets;
	}

}

다음과 같이 Serializable을 상속하고 있음을 알 수 있다.
그렇다면 왜 Serialzable해야하는가?

다음은 Serializable없이 작동하였을때 발생하는 오류이다.
SerializationException이 발생했다. 즉 Vets를 OnHeapStore에 저장하여야하는데 직렬화하지 않은 객체를 그대로 집어 넣을수가 없기 때문에 발생한 문제다.

[결과]

그럼에도 불구하고 다음과 같이 데이터를 올바르게 출력함을 알 수 있다. 이는 Cache하지 않고 데이터 호출하여 쓰는것 이다.

5.[참고문서]

1.ehcache 가이드
2.Spring에서 캐쉬 작동과정 가이드

profile
끈임없이 발전하자.
post-custom-banner

0개의 댓글