Redis 사용 가이드

RedisManager를 통한 캐시 사용 규칙 및 주의사항

마지막 수정: 2026-05

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에 아래 내용을 기록한다:

항목내용
캐시 Keyuser:detail:{userSn}
저장 값UserVo (사용자 상세 정보)
TTL600초 (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)