이전에 학습한 Spring의 @Cacheable은 기본적으로 애플리케이션 내부 메모리(e.g., ConcurrentHashMap)에 데이터를 저장하는 로컬 캐시 방식입니다.
문제점 (분산 환경에서의 데이터 불일치):
getProductById(1)의 결과를 WAS 1의 로컬 캐시에 저장합니다.분산 캐시는 여러 서버 인스턴스들이 공유할 수 있는 별도의 중앙 집중식 캐시 서버(또는 클러스터)를 두는 방식입니다.
동작 방식:
대표적인 분산 캐시 솔루션: Redis, Memcached
Redis (Remote Dictionary Server)는 키-값(Key-Value) 구조의 데이터를 메모리에 저장하고 조회하는 인메모리 데이터 저장소입니다.
핵심 특징:
Lists, Sets, Sorted Sets, Hashes 등 다양한 자료구조를 지원하여, 단순 캐싱뿐만 아니라 랭킹 보드, 세션 관리, 메시지 큐 등 다양한 용도로 활용될 수 있습니다.spring-boot-starter-data-redis)spring-boot-starter-data-redis 의존성을 통해 Redis를 매우 쉽게 연동하고, Spring의 캐시 추상화(@Cacheable)와 통합할 수 있도록 지원합니다.의존성 추가: build.gradle에 spring-boot-starter-data-redis를 추가합니다.
application.yml 설정: Redis 서버의 접속 정보를 설정합니다.
spring:
data:
redis:
host: localhost
port: 6379
cache:
type: redis # Spring의 캐시 관리자로 Redis를 사용하도록 지정
@EnableCaching 활성화: 메인 애플리케이션 클래스에 @EnableCaching 어노테이션을 추가합니다.
@Cacheable 사용: 기존과 동일하게 캐싱이 필요한 메서드에 @Cacheable 어노테이션을 붙입니다.
@Service
public class ProductService {
// 이제 이 메서드의 결과는 로컬 메모리가 아닌,
// 외부의 Redis 서버에 저장되고 조회됩니다.
@Cacheable(value = "products", key = "#id")
public Product getProductById(Long id) {
System.out.println("DB에서 상품 정보를 조회합니다...");
return productRepository.findById(id).orElse(null);
}
}
spring-boot-starter-data-redis와 간단한 설정을 통해, 기존의 @Cacheable 코드를 변경하지 않고도 캐시 저장소를 로컬 메모리에서 Redis(분산 캐시)로 손쉽게 전환할 수 있습니다.