🎯 목적: 프로젝트 전역에서 안전하고 일관된 방식으로 Redis 캐시를 사용하기 위한 공통 인프라 아키텍처 및 사용 가이드입니다.
1. 🏗️ 도입 배경 및 설계 의도 (Why we built this)
기존에는 각 도메인에서 개별적으로 RedisTemplate을 설정하고 캐시 데이터를 다루었습니다. 프로젝트가 커짐에 따라 발생할 수 있는 문제를 선제적으로 방지하기 위해 공통 캐시 아키텍처를 구축했습니다.
- 키 충돌(Key Collision) 원천 차단: * 서로 다른 도메인에서 동일한 식별자(예: 이메일)를 Key로 사용할 경우 데이터가 덮어씌워지는 대참사가 발생할 수 있습니다. 이를 방지하기 위해 도메인별 고유 접두사(Prefix) 기반의 네임스페이스 패턴을 도입했습니다.
- 유지보수성 극대화 (Single Source of Truth): * 코드 곳곳에 흩어진 매직 스트링(Key 이름)과 매직 넘버(만료 시간)를
Enum 한 곳으로 모아 중앙 통제합니다.
- 결합도 감소 (Facade 패턴): * Service 로직이 Redis 라이브러리(
opsForValue 등)에 강하게 결합되지 않도록 RedisUtil로 캡슐화하여 비즈니스 로직의 순수성을 높였습니다.
2. 🧩 주요 컴포넌트 설명
① RedisConfig (공통 인프라 설정)
- 위치:
common.config.RedisConfig
- 역할: Redis 연결을 위한 기본 설정을 담당합니다.
- 특징: 문자열(Key-Value) 기반의 캐싱은 스프링 부트가 자동 구성해 주는
StringRedisTemplate을 기본으로 사용합니다.
② RedisKeyPolicy (캐시 정책 중앙 통제소) ⭐️ 핵심 ⭐️
- 위치:
common.redis.RedisKeyPolicy
- 역할: 프로젝트에서 사용되는 모든 Redis Key의 접두사(Prefix)와 만료 시간(TTL)을 정의하는 Enum 클래스입니다.
- 특징: 식별자를 넘겨주면 안전한 최종 Key 문자열을 알아서 조립해 주는
generateKey() 메서드를 제공합니다.
③ RedisUtil (공통 유틸리티)
- 위치:
common.util.RedisUtil
- 역할: Service 계층에서 가장 편하게 호출할 수 있는 Redis CRUD 어댑터입니다.
- 기능:
setDataExpire() (저장), getData() (조회), deleteData() (삭제) 기능을 제공합니다.
3. 🛠️ 캐시 사용 가이드 (How to Use)