Java Spring - Cache 도입기 (1 / 2): 어떤 캐시를 쓸까?

2024. 3. 14. 23:32자바/자바스프링

728x90
반응형

 

#1. 캐싱 툴 조사

Ehcache vs. Redis vs. Memcached

1. Spring boot Starter cache

💡 스프링 부트에서 캐시를 사용할 수 있게끔 해줌

  • 스프링 부트에서 제공하는 캐싱 추상화를 활성화하기 위한 스터터 의존성.
    • 앱 단에서 어떤 캐시 구현체를 사용할 지 명시하지 않으면, 스프링 부트는 기본적으로 간단한 로컬 메모리 캐시를 사용함.
    • 즉 해당 스타터를 사용하여 캐싱을 활성화하고, ehcache 등 캐시 구현체를 지정할 수 있음.
  • 사용 방법
    • 그래들 추가
    • 컨피그 추가
    • 서비스에 어노테이션 추가
      • ehcache 와 동일

2. Ehcache

 💡 스프링에서 캐시를 어떻게 사용할 지 정해주는 어노테이션을 제공하는 라이브러리

https://velog.io/@backtony/Spring-Ehcache

  • spring 에서 간단하게 사용할 수 있는 자바 기반 오픈 소스 캐시 라이브러리
    • 캐시 구현체 중 하나로, 스프링 부트에서 Spring boot Starter cache를 통해 캐싱을 활성화할 때, 이를 구체적으로 어떤 캐시 구현체를 사용할 지를 지정할 때 선택할 수 있는 옵션 중 하나.
  • ehcache 만의 특징
    • redis 나 memcached 같은 캐시 엔진들과 달리 ehcache 는 데몬을 가지고 있지 않고 spring 내부적으로 동작하여 캐싱 처리를 한다.
      • 데몬 - 사용자가 직접 제어하지 않고, 백그라운드에서 돌면서 여러 작업을 하는 프로그램
    • 같은 로컬 환경에서 구동되고, ehcache는 서버 app 과 라이프 사이클을 같이 하므로 사용하기 더욱 간편
  • 사용 방법
    • 그래들 추가
    • 컨피그 추가
    • 캐시 관련 설정 추가
    • 서비스에 아래 3개 어노테이션을 통해 캐싱 처리를 할 수 있다
      • @Cacheable : 캐시가 있으면 캐시의 정보를 가져오고 없으면 등록
      • @CachePut : 무조건 캐시에 저장. 캐시를 갱신하기 위해 실행을 강제해야함
      • @CacheEvict : 캐시를 삭제
# spring-boot-starter-cache 설정
spring.cache.type=ehcache

# ehcache 설정
spring.cache.ehcache.config=classpath:ehcache.xml
  • 스프링의 캐시 추상화
    • 캐시 기술을 지원하는 캐시 매니저를 빈으로 등록해야 함.
    • 캐시 데이터를 concurrentHashMap 에 저장하는 concurrentMapCacheManager EhCache를 지원하는 EhCacheCacheManager, RedisCacheManager등 다양한 캐시 매니저가 존재하며 캐싱 전략에 따라 적절한 캐시 매니저를 사용할 수 있음

3. redis

💡 캐시 NoSQL 데이터베이스 (글로벌 캐시)

https://velog.io/@qotndus43/Cache

1) 개요

  • 모든 데이터를 메모리에 저장하고 조회.
    • 인메모리 DB
    • 즉 빠른 성능을 보장
  • 다른 인메모리 디비와의 차이점 -- 레디스의 다양한 자료구조
    • 개발 편의성 👆🏿
    • 개발 난이도 👇🏿
  • 실질적으로는 noSQL
    • 고성능 키-값 저장소로서 문자열, 리스트, 해시, 셋, 정렬된 셋 형식의 데이터를 지원하는 NoSQL
  • 로컬 캐시가 아닌 글로벌 캐시
    • 서버와 분리된 별도 저장소에 데이터를 보관하여, 로컬 캐시보다는 느리지만, 중복데이터 및 데이터 일관성 문제가 없다.
  • 그라파나
    • 모니터링 도구
    • 레디스 서버에 대한 상태를 모니터

2) 특징

  • 영속성을 지원하는 인메모리 데이터 저장소
    • 즉 디스크에 저장할 수 있음.
    • 저장하는 방식은 두 가지:
      • RDB (snapshotting) 방식
        • 순간적으로 메모리에 있는 내용을 디스크에 전체를 옮겨 담는 방식
      • AOF (append on File) 방식
        • 레디스의 모든 write/update 연산 자체를 모두 로그 파일에 기록하는 형태
  • 읽기 성능 증대를 위한 서버 측 복제를 지원
  • 쓰기 성능 증대를 위한 client 측 샤딩 (Sharding) 지원
  • redis 만의 특징
    • 트랜잭션 지원
    • 다양한 데이터 구조
    • 복제
    • pub / sub messaging
    • 별도 서버 사용 구성

3) 사용방법

  • redis 설치
  • 빌드.그래들에 의존성 라이브러리 추가
implementation 'org.springframework.boot:spring-boot-starter-data-redis' //redis

 

  • yml 설정
  • 캐시 매니저 빈(bean) 객체를 등록해야 함
    • enableCaching 어노테이션을 추가
    • 이미 스프링부트에서 스타터 패키지와 enableCaching 어노테이션이 있다면 concurrentMapCacheManager를 기본으로 등록.
      • 즉 기본 로컬 메모리 캐시를 사용함
    • redis를 사용할 시 redis cache configuration 설정을 통해, redis cache manager 등록
      • 이를 통해 TTL (Time To Live), disableCachingNullValues, key&value 직렬화 등 캐싱 정책을 설정할 수 있다
  • @Cacheable
    • redis에 캐싱된 데이터가 있으면 메서드 실행 없이 데이터를 반환하고, 없으면 DB에서 조회한 다음 메서드 return 값을 redis에 캐시한다.
    • @Cacheable은 value 와 key 를 같이 사용하여 캐시의 키값을 사용한다.
    • spring @Cacheable 은 내부적으로 spring AOP를 이용.
      • 같은 객체내의 method 끼리 호출 시에는 @Cacheable 이 설정되어있어도 캐싱되지 않음

4. memcached

 💡 캐시 데이터베이스

 

https://chrisjune-13837.medium.com/redis-vs-memcached-10e796ddd717

  • 분산 메모리 캐시 시스템
    • 디비 부하를 완화하여 동적 웹 응용 프로그램 속도를 높이는데 사용하도록 만들어짐
  • 레디스와의 차이점: 자료구조 지원이 다름
    • (Memcached와 redis는 같은 원리이며 Memcached는 단순하게 key-value 타입기반이지만 Redis는 string, set, sorted set, hashes, list 등의 다양한 자료구조를 지원)
  • memcached 를 사용하면, 기존 웹 서버 자체가 독립적으로 제공하는 캐시 사이즈가, 웹 서버가 아무리 늘어나도 캐시 사이즈가 똑같지만, memcached는 캐시를 결합한다.
    • 즉 memcached를 사용하면 모든 서버가 동일한 가상 메모리 풀을 조사하고 있다.
    • 주어진 항목이 항상 전체 웹 클러스터의 동일한 위치에 저장되고 검색 됨.
      • 통일 된 캐시
  • memcached 만의 특징
    • 멀티스레드 지원 → 멀티프로세스 코어를 사용할 수 있음
      • 스케일업을 통해서 더욱 많은 작업처리를 할 수 있음
    • 같은 로컬 환경에서 별도로 구동됨

#2. 정리

1. Ehcache

💡

  • ehcache는 데몬을 가지지 않고 Spring 내부적으로 동작하여 캐싱 처리를 한다.
  • ehcache는 서버 어플리케이션과 라이프사이클을 같이한다
  • 같은 로컬 환경 일지라도 별도로 구동하는 memcached와는 다르게 ehcache는 서버 어플리케이션과 라이프사이클을 같이 하므로 사용하기 더욱 간편하다 

2. Redis

💡

  • Memcached에서 제공하지 않은 기능을 다양하게 제공한다.
  • 해시 형태이기 때문에 Memcached와 성능 차이가 크지 않다.
  • 리플리케이션이 가능하여 메모리가 날라가도 복구할 수 있다.
  • Key에 저장할 수 있는 데이터의 범위가 Memcached에 비해 크다.
  • 메모리를 2배로 사용하며, 메모리 파편화가 발생하기 쉽다.
  • 트래픽이 몰리면 응답속도가 불안정한 편이다. 

3. Memcached

💡

  • 서버 한 대가 장애가 발생하더라도 큰 문제 없이 서비스를 제공할 수 있다.
  • O(1)의 성능인 Memcached를 사용하면 통신 속도가 빠르다.
  • Memcached에 저장한 원본 데이터는 메모리가 날라가도 즉시 복구할 수 있다.
  • 트래픽이 몰려도 응답속도는 Redis에 비해 안정적이다.
  • 데이터 변경이 적은 경우에 메모리 파편화 문제가 적은 편이다.
  • 메모리 사용량이 Redis에 비해 낮다. 

 

3가지 캐시에 대한 비교

https://db-engines.com/en/system/Ehcache%3BMemcached%3BRedis

  • redis와 memcached의 성능 비교

https://www.youtube.com/watch?v=j_mjvkhZG18

  • redis와 ehcache 의 성능 비교

https://velog.io/@noakafka/Redis-vs-Ehcache-무엇을-쓸까

#3. 결론

  • 확장성 및 성능 상의 이점 / 다양한 자료구조 제공 / 기존 세팅 존재 등의 이유로
    • Redis 를 선택
  •  

 

 

728x90
반응형