chaeyoung- 2023. 9. 5. 12:10

 

 

캐시는 데이터나 값을 미리 복사해 놓는 임시 장소를 가리킨다.

접근 시간에 비해 원래 데이터를 접근하는 시간이 오래 걸리는 경우나 값을 다시 계산하는 시간을 절약하고 싶은 경우에 사용한다. 캐시에 데이터를 미리 복사해 놓으면 계산이나 접근 시간 없이 더 빠른 속도로 데이터에 접근할 수 있다.

 

 

즉, 캐시는 접근 비용이 비싼 데이터의 사본을 만들어 저장하고, 동일한 요청이 있을 때 원본 데이터에 접근하지 않고 

사본 데이터를 제공할 수 있게 하는 중간 장치의 개념입니다.

 

병목 현상이 일어날 수 있는 지점의 성능 향상을 위해 캐시를 사용합니다.

 

 

그럼 어떠한 Cache 기술을 적용할지 고려해보자.

 

Cache 관리 전략을 선택할 때 가장 먼저 고려해야 할 요소는, 캐시 데이터를 저장할 스토리지를 서버가 자체적으로 소유하고 있을지, 외부 서버에 캐시 저장소를 따로 둘 지에 대한 부분입니다. 캐시 저장소를 서버에 두는 방식을 Local Cache, 외부 캐시 저장소를 두는 방식을 Global Cache라고 합니다.

 

Local Cache 특징

로컬 Cache는 데이터 조회 오버헤드가 없습니다.

캐시를 외부 저장소에 저장하면 네트워크 통신을 통해 캐시 저장소에 접근하고, 데이터를 가져오는 과정 등의 오버헤드가 없기 때문에 읽기 속도가 빠릅니다.

 

서버 간 데이터 일관성이 깨질 수 있다.

단일 서버 인스턴스에 캐시 데이터를 저장하기 때문에, 서버의 인스턴스가 여러 개일 경우 서버 간 캐시 데이터가 일치하지 않아 신뢰성이 떨어질 수 있습니다.

 

서버 간 동기화가 어렵고, 동기화 비용 발생

캐시 일관성을 유지하기 위해 동기화를 한다고 하여도, 추가 비용이 발생합니다. 또한, 서버 갯수가 늘어날수록, 자신을 제외한 모든 인스턴스와 동기화 작업을 진행해야 하기 때문에 비용의 크기는 서버의 갯수의 제곱에 비례하여 증가합니다.

 

 

Global Cache 특징

네트워크 I/O 비용 발생

외부 캐시 저장소에 접근하여 데이터를 가져오기 때문에, 이 과정에서 네트워크 I/O 비용 발생합니다. 하지만 서버 인스턴스 추가시에도 동일한 비용 요구하기에 서버가 고도화될수록 높은 효율을 발휘합니다.

 

데이터 일관성을 유지할 수 있다.

모든 서버의 인스턴스가 동일한 캐시 저장소에 접근하기 때문에, 데이터의 일관성을 보장할 수 있습니다. 데이터의 일관성이 깨지기 쉬운 분산 서버 환경에 적합한 구조입니다.

 

 

 

1. application.properties에 추가
spring.cache.type=redis
spring.cache.redis.cache-null-values=true

2. Application.파일에 추가
@EnableCaching // Redis Cache

 

 

 메인 파일에 @EnableCaching 애너테이션을 작성하여 스프링에게 캐싱 적용 대상임을 알려줍니다. 해당 애너테이션을 작성하면, 스프링은 AOP를 통해 비 침투적으로 캐싱 전략을 적용합니다.