[자바/스프링] Ehcache

Java

  1. 캐시 구성

     <ehcache>
         <diskStore path="java.io.tmpdir" />
    
         <!-- 기본 캐시 구성 -->
         <defaultCache
             maxElementsInMemory="1000"
             eternal="false"
             timeToIdleSeconds="120"
             timeToLiveSeconds="120"
             overflowToDisk="true" />
            
         <!-- 추가 캐시 구성 -->
         <cache
             name="캐시명"
             maxElementsInMemory="100"
             eternal="false"
             timeToIdleSeconds="600"
             timeToLiveSeconds="3600"
             overflowToDisk="true" />
     </ehcache>
    
    • maxElementsInMemory: 메모리 최대 보관 개수
    • timeToLiveSeconds: 메모리 최대 보관 시간
    • overflowToDisk: 메모리 최대 보관 설정 초과 시 엘리먼트를 디스크에 저장
  2. 캐시 구성 및 사용

     CacheManager cacheManager = CacheManager.getInstance();
     Ehcache ehcache = cacheManager.getEhcache("캐시명");
    
     // 서비스에 ehcache 의존성 주입
     MyService myService = new MyService(cache);
     ...
    
     cacheManager.shutdown();
    
    • CacheManager: 클래스패스 루트에서 ehcache.xml 파일을 찾아 캐시 구성 후 해당 캐시명에 대한 캐시 인스턴스 요청
    • 캐시 인스턴스를 서비스 인스턴스에 주입
  3. 서비스 메소드 내에서 키-값으로 캐싱

    • 기본 사용

        if (!cache.containsKey(key)) {
            cache.put(key, value);
            return null;
        }
        else
        {
            return cache.get(key);
        }
      
    • atomically하게 수행

        cache.putIfAbsent(key, value)
      

Spring

  1. 수동 캐싱
    • CacheManager 구성, 캐시 서비스 생성 후 ApplicationContext 객체로 로드

        @Configuration
        public class MyCachConfiguration {
            @Bean
            public CacheManager cacheManager() {
                return CacheManager.getInstance();
            }
      
            @Bean
            public MyService myService() {
                Ehcache cache = cacheManager().getCache("캐시명");
                // 생성자 주입
                return new MyService(cache);
            }
        }
      
    • 캐시 구성 로드 후 컨텍스트로부터 서비스를 가져와 사용

        ApplicationContext context = new AnnotationConfigApplicationContext(MyCachConfiguration.class);
        MyService myService = context.getBean(MyService.class);
      
        // 서비스 사용
        ...
      
        ((AbstractApplicationContext) context).close();
      
  2. 스프링으로 자동 구성

     @Configuration
     public class MyCachConfiguration {
         @Bean
         public EhCacheManagerFactoryBean cacheManager() {
             EhCacheManagerFactoryBean factory = new EhCacheManagerFactoryBean();
             factory.setConfigLocation(new ClassPathResource("ehcache.xml"));
             return factory;
         }
    
         @Bean
         public EhCacheFactoryBean myCache() {
             EhCacheFactoryBean factory = new EhCacheFactoryBean();
             factory.setCacheManager(cacheManager().getObject());
             factory.setCacheName("캐시명");
             return factory;
         }
    
         @Bean
         public MyService myService() {
             // 생성자 주입
             return new MyService(myCache().getObject());
         }
     }
    
    • EhCacheManagerFactoryBean으로 Ehcache CacheManager 구성
      • 리소스 로딩 메커니즘으로 Ehcache 구성 파일 로드 가능
      • 기구성 CacheManager을 쉽게 재사용할 수 있고 원하는 이름으로 등록 가능
      • 이미 구성된 캐시가 있는지 찾아보고 없으면 ehcache.xml 파일의 defaultCache 엘리먼트를 이용해 캐시를 새로 구성
    • EhCacheFactoryBean으로 Cache 인스턴스를 가져옴

Comments