제목: "스프링에서 캐시 사용하여 프로젝트 성능 개선해보기"
작성자: jiniaslog
작성자 수정일: 2021년12월24일
링크: https://www.jiniaslog.co.kr/article/view?articleId=254
작성일: 2022년8월16일
스프링에서 제공하는 캐시 추상화 API로 여러가지 구현 클래스가 존재하나 여기서는 대표적인 3가지만 알아 보겠다.
구현체인 캐시가 없는 깡통 매니저이다. setCaches
를 통해 구현체를 넘겨서 등록할 수 있다. 위의 예시코드에서는 스프링 기본 캐시 구현체인 ConcurrentMapCache
를 만들어 등록했다.
@EnableCaching
@Configuration
public class CacheConfig(){
@Bean
public CacheManager cacheManager(){
SimpleCacheManager simpleCacheManager = new SimpleCacheManager();
simpleCacheManager.setCaches(List.of(new ConcurrentMapCache("캐시이름")));
return simpleCacheManager;
}
}
ConcurrentMapCache
만을 사용하는 캐시 매니저. 캐시 정보를 Map타입으로 메모리에 저장하므로 속도가 매우 빠르고 별다른 설정이 필요없지만 본격적인 캐시로 사용하기에는 기능이 빈약하다.
- 캐시별 용량제한이나 다양한 저장방식지원, 다중 서버분산과 같은 기능이 없으므로 테스트 용도로 사용하자.
자바에서 가장 인기있는 캐시 프레임워크인 EhCache
를 지원하는 캐시 매니저다. 본격적으로 캐시 기능을 적용하려면 사용을 고려해볼만하다.
EhCacheManagerFactoryBean.getObject()
: 아래와 같은 CacheManager
를 반환한다
CacheManager
을 EhCacheCacheManager
생성자 파라미터에 넣어주고 EhCacheCacheManager
를 생성한다.
EhCacheCacheManager
내부를 보면 EhCacheManagerFactoryBean.getObject()
로 생성한 CacheManager
가 필드로 있는것을 확인할 수 있고, 내부에 cacheMap
필드가 있음을 확인할 수 있다.
EhCacheCacheManager
는 cacheMap
와 cacheNames
를 메모리에 올려둔다.
@Cache
가 달린 타겟 메서드가 호출될 때, AOP가 적용되면서 EhCacheCacheManager
는 cacheMap
와 cacheNames
에서 캐싱정보를 찾아서 있으면 캐싱되어있는 데이터를 반환하고, 없으면 타겟 메서드 호출 뒤 메모리에 올리는 방식으로 캐싱을 적용하는 것 같다.