본문 바로가기
개발 관련/spring

Caffeine(캐시 라이브러리) 사용

by lazysnack 2022. 7. 14.

이번에 회사에서 학습기에 들어가는 화면에 대한 관리를 하는데,

자주 바뀌는 사항이 아니다보니, 캐쉬를 적용하자는 말이 나왔다.

캐시라고 하면 레디스(redis) 를 생각했었는데, caffeine 이라는 것이 나와서, 적용해볼겸 정리해보려고 한다 .

1. Caffeine

  • Java 8을 기반으로 하는 High Performance 캐싱 라이브러리
  • 빈도 및 최근 데이터에 따라 사이즈가 넘어갈 경우 eviction(방출?)
  • 최근 접근 or 쓰기 에 따라 만료 시간 설정
  • 비동기적으로 refresh 가능
  • key, values 가 자동적으로 weak reference 로 wrap
  • cache access 에 대한 statistics 제공

등등.. 이 있다.

2. 사용

  1. 우선, maven 을 사용하므로 pom.xml 에 추가

    <dependency>
        <groupId>com.github.ben-manes.caffeine</groupId>
        <artifactId>caffeine</artifactId>
        <version>2.8.0</version>
    </dependency>
  2. 서비스 로직 수정

    @Service
    public class DataProvider {
        private final DataRepository dataRepository;
        private LoadingCache<String, DataVO> cache;
        private final String CACHE_KEY = "data";
    
        @Autowired
        public DataProvider(DataRepository dataRepository) {
            this.dataRepository = dataRepository;
            cache = createCache();
        }
    
        @NonNull
        private LoadingCache<String, DataVO> createCache() {
            return Caffeine.newBuilder()
                    .maximumSize(10) // max size
                    .expireAfterWrite(30, TimeUnit.MINUTES) // 쓴 이후로 30분 후 expired
                    .build(key -> getData(key)); // 지정한 key 값으로 cache 저장
        }
    
        private LoginUIData getData(final String key) {
            return dataRepository.findData();
        }
    
        public LoginUIData getData() {
            return cache.get(CACHE_KEY);
        }
    }   
    • 이전에는 getData() 만 단순히 호출 하는 구조였는데 (서비스 레이어라는 이름이 무색할 정도로..), 생성자에 cache 를 추가해 줬다.

    • 이전과 같이 컨트롤러에서 getData() 를 호출하면 cache.get 를 통해 캐시가 있으면 캐시에 있는 값을 가져오고, 없으면 DB 에서 불러와서 캐시에 저장 후, 캐시 값을 읽어온다.

  • 간단한 용도로 사용할 예정이었기에 간단하게만 사용했지만, 이 밖에 여러 가지 옵션 들이 있으니, wiki 를 보면서 확인해보자

'개발 관련 > spring' 카테고리의 다른 글

eventPublisher 와 eventListenr 사용  (0) 2022.07.14
Feign 사용 (2)  (0) 2022.07.14
Feign 사용 (1)  (0) 2022.07.14
HandlerMethodArgumentResolver 사용  (0) 2022.07.14
JPA 어노테이션  (0) 2022.07.14