ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [우아한테크캠프] SpringBoot + Ehcache
    카테고리 없음 2018. 8. 11. 09:43

    JSR(Java Specification Request, 자바 스펙 요구서)


    스프링의 장점 중 하나로 PSA(Portable Service Abstraction)가 있다. 

    외부 서비스들을 간단한 추상 인터페이스만으로 쉽게 사용할 수 있도록 해주는 것

    Cache에서는 Redis, Ehcache, ConcurrentMap 등을 CacheManager 인터페이스로 추상화돼있고, 

    CacheManager 인터페이스를 이용해서 또 다른 Cache 라이브러리를 사용할 수 있다.


    PSA(Portable Service Abstraction)

    성격이 비슷한 여러 종류의 기술을 추상화하고 이를 동일한 사용법으로 사용할 수 있도록 지원해주는 것

    스프링에서는 서비스 추상화를 위해 다양한 어댑터를 제공한다. 즉 다양한 기술에 대한 API를 제공한다.


    캐시를 사용하는 이유

    같은 요청이 빈번하게 들어오는 경우에 해당 결과를 보관하여 빠르게 결과를 돌려주기 위해


    스프링 부트에서는 각 Cache API들의 기술 및 변화에 관계없이 일관된 사용을 위해 추상화를 지원한다(CacheManager)

    스프링 부트에서는 기본적으로 여러 서드파티 캐시 라이브러리를 지원한다. 꽤 많은 캐시를 지원하니 자신에게 맞는 캐시를 골라서 사용하면 된다.



    1. 라이브러리 추가

    compile('org.springframework.boot:spring-boot-starter-cache')
    compile('net.sf.ehcache:ehcache')

    2. ehcache.xml 생성

    <?xml version="1.0" encoding="UTF-8"?>
    <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"
    updateCheck="false">
    <diskStore path="java.io.tmpdir" />

    <cache name="getBestCategoryListCache"
    maxEntriesLocalHeap="10000"
    maxEntriesLocalDisk="1000"
    eternal="false"
    diskSpoolBufferSizeMB="20"
    timeToIdleSeconds="300" timeToLiveSeconds="600"
    memoryStoreEvictionPolicy="LFU"
    transactionalMode="off">
    </cache>
    <cache name="getPromotionListCache"
    maxEntriesLocalHeap="10000"
    maxEntriesLocalDisk="1000"
    eternal="false"
    diskSpoolBufferSizeMB="20"
    timeToIdleSeconds="300" timeToLiveSeconds="600"
    memoryStoreEvictionPolicy="LFU"
    transactionalMode="off">
    </cache>
    </ehcache>

    3. 캐시 매니저 빈 등록 (기본적으로 어떤 설정도 하지 않으면 ConcurrentMapCacheManager를 사용한다. 하지만 상황에 맞게 다른 캐시 구현체를 등록할 수도 있다.)

    @Bean
    public CacheManager cacheManager() {
    return new EhCacheCacheManager(ehCacheCacheManager().getObject());
    }

    @Bean
    public EhCacheManagerFactoryBean ehCacheCacheManager() {
    EhCacheManagerFactoryBean factory = new EhCacheManagerFactoryBean();
    factory.setConfigLocation(new ClassPathResource("ehcache.xml"));
    factory.setShared(true);
    return factory;
    }


    4. Cache Enable (@EnableCaching 추가)



    5. 어노테이션을 통한 Cache 사용 (@Cacheable, @CacheEvict, @CachePut)

    @CachePut : 매번 메서드를 호출, 하지만 호출과 동시에 캐시에 보관하므로 보통 저장할 때 용이

    @CachePut(key = "#name", value = "wonwoo")
    public String save(String name) {
    return name;
    }




    참고

    http://blog.breakingthat.com/2018/03/19/springboot-ehcache-%EC%A0%81%EC%9A%A9/

    https://minwan1.github.io/2018/03/18/2018-03-18-Spring-Cache/

    댓글

Designed by Tistory.