반응형

스프링부트에서 간단하게 사용할 수 있는 캐시 사용법입니다.


서비스 레이어에서 예를 들어 아래와 같은 코드를 사용할 수 있습니다.

@Cacheable 어노테이션을 통해 캐시할 대상을 지정하고 value는 어떤 캐시정책을 쓸 것인가에 대한 값이고 key는 지정한 캐시 정책내애서 캐시를 구분해주는 키값 입니다.


@CacheEvict 어노테이션은 value로 매칭되는 @Cacheable에 캐시되었던 데이터를 지워줄 대상을 지정합니다.

마찬가지로 key는 해당 캐시정책에서 특정 키에 해당하는 데이터만 지웁니다.


혹은 여러 캐시를 모두 지우고 싶은 경우 마지막 메서드처럼 하면 됩니다.



  import org.springframework.cache.annotation.CacheEvict;
  import org.springframework.cache.annotation.Cacheable;
  import org.springframework.cache.annotation.Caching;
 
  @Cacheable(value = "user", key = "#root.methodName + #userId")
  public String getUser(String userId, PrettyLog prettyLog) {
    return userDao.selectOne(userId, prettyLog);
  }
 
 @CacheEvict(value = "user", key = "#root.methodName + #userId")
  public void clearCacheUser(String userId, PrettyLog prettyLog) {
  }
 
  @Caching(evict = { //
      @CacheEvict(value = "user", allEntries = true), //
      @CacheEvict(value = "common", allEntries = true)//
  })
  public void clearCacheUser(PrettyLog prettyLog) {
  }



스프링부트에서 위 소스를 동작하게하려면 @EnableCaching 을 메인에서 지정해줘야 합니다.


import org.springframework.boot.SpringApplication;
import org.springframework.cache.annotation.EnableCaching;
 
@SpringBootApplication
@EnableCaching
public class MainApplication {
 
  public static void main(String[] args) {
    SpringApplication.run(MainApplication.class, args);
  }
}




ehcache.xml 파일입니다. (기본은 클래스패스 최상위에두면 자동으로 인식합니다.)

캐시정책을 정의합니다. 서비스레이어에서 value 해당하는 값이 아래의 cache name에 매칭됩니다.


timeToIdleSeconds : 몇초동안사용되지않으면 지울지

timeToLiveSeconds : 몇초동안만 살아있을지

maxBytesLocalHeap : 최대 메모리 사이즈

eternal : true면 timeout 관련설정을 무시하고 캐시를 지우지않는다.


2.5.2 에서 Deprecate 되었다.

maxElmentsInMemory : 메모리에 저장할 최대 개수



2.5.2 이후 2.x 버전

maxEntriesLocalHeap



<?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" />
    <defaultCache 
    maxEntriesLocalHeap="10000" 
    eternal="false"
        timeToIdleSeconds="120" 
        timeToLiveSeconds="120" 
        overflowToDisk="true"
        maxElementsOnDisk="10000000" 
        diskPersistent="false"
        diskExpiryThreadIntervalSeconds="120" 
        memoryStoreEvictionPolicy="LRU" />
    <cache name="user" 
    maxEntriesLocalHeap="1000"
    maxBytesLocalHeap="100m" 
    eternal="false"
    timeToIdleSeconds="360" 
    timeToLiveSeconds="" 
    overflowToDisk="false"
    memoryStoreEvictionPolicy="LRU" />
</ehcache>




마지막으로 캐시를 사용하기위한 메이븐 설정입니다.


    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-cache</artifactId>
    </dependency>
    <dependency>
      <groupId>net.sf.ehcache.internal</groupId>
      <artifactId>ehcache-core</artifactId>
      <version>2.10.1</version>
      <scope>provided</scope>
    </dependency>



반응형

'java' 카테고리의 다른 글

spring boot - spring.log 남기지 않기.  (0) 2018.02.21
java poi excel write 엑셀 쓰기  (0) 2018.01.29
java 전화번호 형식 변환  (7) 2018.01.23
spring security cache control  (0) 2018.01.16
spring 301 redirect - RedirectView  (0) 2018.01.09
java md5  (0) 2017.12.26
LRU LFU FIFO 알고리즘  (0) 2017.12.19
java - collections sort  (0) 2017.12.06

+ Recent posts