Java Spring - Cache 도입기 (1 / 2): 어떤 캐시를 쓸까?
2024. 3. 14. 23:32ㆍSpring Boot
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 과 라이프 사이클을 같이 하므로 사용하기 더욱 간편
- redis 나 memcached 같은 캐시 엔진들과 달리 ehcache 는 데몬을 가지고 있지 않고 spring 내부적으로 동작하여 캐싱 처리를 한다.
- 사용 방법
- 그래들 추가
- 컨피그 추가
- 캐시 관련 설정 추가
- 서비스에 아래 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 연산 자체를 모두 로그 파일에 기록하는 형태
- RDB (snapshotting) 방식
- 읽기 성능 증대를 위한 서버 측 복제를 지원
- 쓰기 성능 증대를 위한 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
반응형
'Spring Boot' 카테고리의 다른 글
DTO 상속에 대하여 (0) | 2024.03.14 |
---|---|
Java Spring - Cache 도입기 (2 / 2): Redis 적용기 (1) | 2024.03.14 |
Java Spring 으로 백엔드 개발 시 지양해야할 코딩 패턴: (1) | 2024.03.14 |
네이버 코딩컨벤션 적용하기 - formatter / rules / suppressions .xml (2) | 2024.03.14 |
사용자 정의 어노테이션을 활용한 Profile 별 호출 가능 API 설정 - @LocalDevOnly (0) | 2024.03.14 |