본문 바로가기
SPRING

ehcache

by brilliant-growth 2024. 5. 30.

ehcache

어노테이션 설명
@EnableCaching Spring Boot Cache를 사용하기 위해 '캐시 활성화'를 위한 어노테이션을 의미합니다.
@CacheConfig 캐시정보를 '클래스 단위'로 사용하고 관리하기 위한 어노테이션을 의미합니다.
@Cacheable 캐시정보를 메모리 상에 ‘저장’하거나 ‘조회’ 해오는 기능을 수행하는 어노테이션입니다.
@CachePut 캐시 정보를 메모리상에 '저장'하며 존재 시 갱신하는 기능을 수행하는 어노테이션입니다.
@CacheEvict 캐시 정보를 메모리상에 '삭제'하는 기능을 수행하는 어노테이션입니다.
@Caching 여러 개의 ‘캐시 어노테이션’을 ‘함께 사용’할 때 사용하는 어노테이션입니다.

 

어노테이션  주요 기능  캐싱 실행 시점
@Cacheable 캐시 조회, 저장 기능 - 캐시 존재 시 ‘메서드 호출 전 실행’- 캐시 미 존재 시 ‘메서드 호출 후 실행’
@CachePut 캐시 저장 기능 - 캐시 존재 시 ‘메서드 호출 후 실행’- 캐시 미 존재 시 ‘메서드 호출 후 실행’
@CacheEvict 캐시 삭제 기능 - beforeInvocation 속성값이 true일때 ‘메서드 호출 전 실행’- beforeInvocation 속성값이 false일때 ‘메서드 호출 후 실행’

 

 

 

ehcache 적용 해보기

 

## Dependency 추가

<dependency>
<groupId>org.ehcache</groupId>
<artifactId>ehcache</artifactId>
<version>3.8.1</version>
</dependency>

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

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>



## ehcache.xml 추가

<?xml version=*"1.0"* encoding=*"UTF-8"*?>
<config xmlns=*'http://www.ehcache.org/v3'*>
<!-- 캐시 파일이 생성되는 경로 -->
<persistence directory=*"cache/data"*/>
<cache alias=*"shopCache"*>
<expiry>
<!-- 캐시 만료 시간 = timeToLiveSeconds -->
<ttl unit=*"seconds"*>60</ttl>
</expiry>
<resources>
<!-- JVM heap 메모리, LRU strategy-->
<heap unit=*"entries"*>1000</heap>
<disk unit=*"MB"* persistent=*"false"*>5</disk>
</resources>
</cache>
</config>



## application.properties에 추가

#Ehcache
spring.cache.jcache.config=classpath:ehcache.xml
@EnableCaching
@EnableScheduling
@SpringBootApplication
public class Application {

  public static void main(String[] args) {
    SpringApplication.run(CubeApplication.class, args);
  }
}


//service
public Member findMemberNoCache(String username) {
        slowQuery(2000);
        return memberRepository.findMemberByUsername(username);
    }

    @Cacheable(value="findMemberCache", key = "#username") // 해당 캐시 사용
    public Member findMemberCache(String username) {
        slowQuery(2000);
        return memberRepository.findMemberByUsername(username);
    }

    @CacheEvict(value = "findMemberCache", key="#username") //해당 캐시 삭제
    public String refresh(String username) {
        return username + "님의 Cache Clear !";
    }

    // 빅쿼리를 돌린다는 가정
    private void slowQuery(long seconds) {
        try {
            Thread.sleep(seconds);
        } catch (InterruptedException e) {
            throw new IllegalStateException(e);
        }
    }

 

@Cacheable(value="findMemberCache")  ehcache.xml에서 지정한 findMemberCache 캐시를 사용하겠다는 의미이다.
즉 캐시를 사용하여 데이터를 조회하겠다는 의미이다.
여기서 key는 메소드 argument인 name을 사용하겠다는 의미이다.
즉, name에 따라 별도로 캐시 된다.
그리고 캐시 여부를 체크하여 캐시가 안되어있을 경우에는 데이터를 가져와 캐시를 하고,
캐시가 되어있다면 캐시 되어있는 데이터를 반환하게 된다.

 

@CacheEvict(value = "findMemberCache", key="#username") 은 해당 캐시 내용을 지우겠다는 의미이다.
캐시 데이터가 갱신되어야 한다면 @CacheEvict가 선언된 메서드를 실행시키면 캐시 데이터는 삭제되고 새로운 데이터를 받아 캐시하게 된다.
key에 따라 캐시를 선택해서 제거가 가능하다.

'SPRING' 카테고리의 다른 글

스프링의 xml의 역할  (1) 2024.07.01
Retry 와 Recover  (0) 2024.05.30
db 이중화 작업(springBoot,mybatis)  (0) 2023.11.24
MVC 패턴 구현 순서  (1) 2023.11.24
스프링 설정에 관하여(web.xml,servlet-context.xml,root-context.xml)  (1) 2023.11.24