Redis 사용 가이드
기본 원칙
RedisManager를 사용한다 — 직접 Redis 클라이언트 사용 금지- 캐시 key 전역 중복 방지에 주의한다
- 캐시 사용 시 Confluence에 반드시 사용 내역을 기록한다
- 모든 캐시에 TTL(만료 시간)을 설정한다
RedisManager 사용법
@Service
@RequiredArgsConstructor
@Slf4j
public class UserService {
private final RedisManager redisManager;
private final UserMapper userMapper;
private static final String CACHE_KEY_USER = "user:detail:";
private static final long CACHE_TTL_SEC = 600L; // 10분
/**
* 사용자 단건 조회 (캐시 적용)
*/
@Transactional(readOnly = true)
public UserVo get(UserVo vo) {
String cacheKey = CACHE_KEY_USER + vo.getUserSn();
// 캐시에서 조회
Object cached = redisManager.getValue(cacheKey);
if (cached != null) {
return (UserVo) cached;
}
// DB 조회 후 캐시 저장
UserVo result = userMapper.get(vo);
if (result != null) {
redisManager.saveValue(cacheKey, result, CACHE_TTL_SEC);
}
return result;
}
/**
* 사용자 수정 (캐시 무효화)
*/
@Transactional(rollbackFor = Exception.class)
public void update(UserVo vo) {
userMapper.update(vo);
// 캐시 삭제
String cacheKey = CACHE_KEY_USER + vo.getUserSn();
redisManager.deleteValue(cacheKey);
log.info("사용자 캐시 삭제: key={}", cacheKey);
}
}
RedisManager 메서드
| 메서드 | 설명 |
|---|---|
saveValue(key, value, timeoutSeconds) | 값 저장 (TTL 필수) |
getValue(key) | 값 조회 |
deleteValue(key) | 값 삭제 |
hasKey(key) | 키 존재 여부 확인 |
// 저장 (TTL 300초)
redisManager.saveValue("otp:user01", "123456", 300L);
// 조회
Object value = redisManager.getValue("otp:user01");
// 삭제
redisManager.deleteValue("otp:user01");
// 존재 확인
boolean exists = redisManager.hasKey("otp:user01");
캐시 Key 네이밍 규칙
캐시 key는 전역적으로 중복되지 않도록 아래 형식을 사용한다:
{서비스명}:{도메인}:{식별자}
예시:
user:detail:12345 → 사용자 12345 상세
user:list:dept:10 → 부서 10의 사용자 목록
board:detail:99 → 게시판 99 상세
code:grpCode:A001 → 코드 그룹 A001
Confluence 캐시 사용 내역 기록
캐시를 새로 추가할 때는 반드시 Confluence에 아래 내용을 기록한다:
| 항목 | 내용 |
|---|---|
| 캐시 Key | user:detail:{userSn} |
| 저장 값 | UserVo (사용자 상세 정보) |
| TTL | 600초 (10분) |
| 무효화 조건 | 사용자 정보 수정 시 |
| 담당자 | 홍길동 |
임시 데이터 저장 (OTP 등)
@Service
@RequiredArgsConstructor
@Slf4j
public class OtpService {
private final RedisManager redisManager;
private static final long OTP_TTL_SEC = 300L; // 5분
public void saveOtp(String userId, String otp) {
String key = "otp:" + userId;
redisManager.saveValue(key, otp, OTP_TTL_SEC);
log.info("OTP 저장: userId={}", userId);
}
public boolean verifyOtp(String userId, String inputOtp) {
String key = "otp:" + userId;
Object stored = redisManager.getValue(key);
if (stored == null) {
return false;
}
boolean valid = inputOtp.equals(stored.toString());
if (valid) {
redisManager.deleteValue(key); // 인증 성공 시 삭제
}
return valid;
}
}
보안 주의사항
- Redis 포트 (6379) 외부 노출 금지 (내부망만 허용)
- 민감 데이터 저장 시 최소 정보만 저장
- TTL 설정 필수 — 무기한 데이터 저장 금지
- Redis 연결 정보는 환경변수로 관리
application.yml Redis 설정
spring:
data:
redis:
host: ${REDIS_HOST:localhost}
port: ${REDIS_PORT:6379}
password: ${REDIS_PASSWORD:}
timeout: 3000ms
체크리스트
- [ ]
RedisManager를 통해서만 Redis 접근 (직접 클라이언트 사용 금지) - [ ]
saveValue(key, value, ttlSeconds)— TTL 항상 지정 - [ ] 캐시 Key 전역 중복 여부 확인
- [ ] 캐시 추가 시 Confluence에 사용 내역 기록
- [ ] 데이터 수정 시 관련 캐시 삭제 (
deleteValue)