애플리케이션 개발/Spring

[Spring] Cache (@Cacheable, @CachePut, @CacheEvict)

sofiaaa 2023. 2. 22. 13:26
반응형

 

Cache 사용 이유

캐시의 사용은 반복적으로 동일한 결과를 반환하는 경우에 용이하다고 한다.

지속적으로 같은 결과를 반환하는데도 DB에 접속하게 되면 DB의 장애가 생길 가능성이 높아지기 때문이다.

 

 

Cache 사용 방법

1. @EnableCaching 추가

캐시를 사용하고자 하는 클래스에 @EnableCaching 이라는 어노테이션을 추가한다.

@EnableCaching
@Configuration 
public class CacheConfig {
    ... 
}

 

2. 캐시 매니저 빈 추가

  • ConcurrentMapCacheManager: Java의ConcurrentHashMap을 사용해 구현한 캐시를 사용하는 캐시매니저
  • SimpleCacheManager: 기본적으로 제공하는 캐시가 없어 사용할 캐시를 직접 등록하여 사용하기 위한 캐시매니저
  • EhCacheCacheManager: 자바에서 유명한 캐시 프레임워크 중 하나인 EhCache를 지원하는 캐시 매니저
  • CompositeCacheManager: 1개 이상의 캐시 매니저를 사용하도록 지원해주는 혼합 캐시 매니저
  • CaffeineCacheManager: Java 8로 Guava 캐시를 재작성한 Caffeine 캐시를 사용하는 캐시 매니저
  • JCacheCacheManager: JSR-107 기반의 캐시를 사용하는 캐시 매니저

 

3. 캐시 사용

1) @Cacheable 

캐시를 저장/조회하기 위한 어노테이션으로 , 캐시에 데이터가 없을 경우에 기존 로직을 실행한 후 캐이세 데이터를 추가하고, 캐시에 데이터가 있으면 캐시의 데이터를 반환한다.

따라서, 디버깅을 해보면 최초에는 Repository의 로직을 실행하고, 그 후부터는 Repository를 타지 않는 것을 볼 수 있다.

@Override
@Cacheable(value="cache", key = "{#memberName}")
public List<MemberMaster> findAllByMember(String memberName) {
return this.memberRepository.findAllByMember(memberName);
}

@Override
@Cacheable(value="cache", key = "{#memberAge}")
public List<MemberMaster> findAllByMemberAge(String memberAge) {
return this.memberRepository.findAllByMemberAge(memberAge);
}

 

 

2) @CachePut

캐시에 값을 저장하는 용도로만 사용하는 것으로, 실행 결과를 캐시에 저장하지만, 조회 시에 저장된 캐시의 내용을 사용하지는 않고 항상 메소드의 로직을 실행한다는 점에서 다르다.

 

3) @CacheEvict

캐시는 적절한 시점에 제거되어야 하는데, 만약 값이 달라진다면 캐시를 제거해야 할 것이다. 그렇지 않으면 잘못된 결과가 반환된다.

 

 

https://mangkyu.tistory.com/179

 

[Spring] 캐시(Cache) 추상화와 사용법(@Cacheable, @CachePut, @CacheEvict)

Spring은 캐시 관련 기능을 추상화하여 편리하게 개발할 수 있도록 지원하고 있다. 이번에는 Spring이 제공하는 캐시와 관련된 기능들에 대해 알아보도록 하자. 1. Spring이 제공하는 캐시(Cache) 추상

mangkyu.tistory.com

 

반응형