복잡한뇌구조마냥

[DB] Redis 본문

BE/DB

[DB] Redis

지금해냥 2025. 12. 7. 01:38

1. Redis란?

Redis(Remote Dictionary Server)는 메모리 기반 Key-Value 저장소로,
주로 캐시(Cache), 세션(Session), 임시 데이터 저장소 용도로 사용된다.

Redis 특징

Redis는 In-Memory 기반의 Key-Value 저장소로,
RDB를 대체하기보다는 보조 저장소로 주로 사용된다.
  • In-Memory 기반 → 속도가 매우 빠름
  • 다양한 자료구조 지원
    • String, List, Set, Sorted Set, Hash
  • TTL(Time To Live) 지원
  • 싱글 스레드 기반(Event Loop) → 예측 가능한 성능
  • 디스크 영속화(RDB / AOF) 가능

2. Redis를 왜 도입했는가?

실제 프로젝트(취미 장비 대여 플랫폼, 인증/보안 기능)에서 Redis를 도입한 이유는 다음과 같다.

✔️ Redis 도입 배경

  • DB 부하 감소
  • 짧은 수명의 데이터를 DB에 저장하고 싶지 않음
  • 인증/보안 관련 데이터의 빠른 조회
  • 서버 재시작과 무관한 상태 공유

3. Redis 활용 사례 ① 이메일 인증 (SMTP 인증 코드)

문제 상황

  • 이메일 인증 코드(6자리 숫자)는 유효 시간이 짧음
  • DB에 저장하면 불필요한 테이블, 주기적인 정리 필요

해결 방법

  • Redis에 email → 인증코드 형태로 저장
  • TTL을 5분으로 설정
 
redisTemplate.opsForValue()
    .set(email, authCode, Duration.ofMinutes(5));

장점

  • 인증 만료 자동 처리 (TTL)
  • DB 오염 방지
  • 빠른 인증 코드 검증

4. Redis 활용 사례 ② JWT Refresh Token 관리

왜 Redis에 Refresh Token을?

  • JWT는 Stateless하지만, 로그아웃/강제 만료 처리가 어려움
  • Redis를 사용하면 서버 단에서 토큰 제어 가능

구현 방식

  • userId → refreshToken 저장
  • 로그인 시 저장
  • 로그아웃 시 삭제
  • 재발급 시 검증
redisTemplate.opsForValue()
    .set("RT:" + userId, refreshToken, refreshTokenTtl);

효과

  • 로그아웃 즉시 토큰 무효화 가능
  • 탈취된 토큰 대응 가능
  • 보안 강화

5. Redis 활용 사례 ③ 임시 상태 관리 (Rate Limit / 중복 요청 방지)

사용 예시

  • 이메일 인증 요청 횟수 제한
  • 특정 API 요청 빈도 제한
 
Long count = redisTemplate.opsForValue().increment(key);

if (count == 1) {
    redisTemplate.expire(key, Duration.ofMinutes(1));
}
  • 1분 내 요청 횟수 초과 시 차단

6. Redis vs DB, 언제 Redis를 써야 할까?

구분 Redis DB
저장 위치 메모리 디스크
속도 매우 빠름 상대적으로 느림
영속성 선택적 기본
사용 목적 캐시, 임시 데이터 핵심 데이터
트랜잭션 제한적 강력
TTL 기본 지원 직접 구

👉 TTL이 명확한 데이터, 인증/세션, 캐시성 데이터 → Redis
👉 영구 보관 데이터 → DB

👉 대체 관계가 아니라 보완 관계

Redis의 자료구조 간단 정리

  • String → 인증 코드, 토큰
  • List → 작업 큐
  • Set → 중복 제거
  • Sorted Set → 랭킹 시스템
  • Hash → 객체 단위 저장

Redis는 단순 Key-Value를 넘어 자료구조 서버에 가깝다.


7. Redis 사용 시 주의할 점

⚠️ 메모리 관리

  • TTL 미설정 → 메모리 누수 위험
  • 무분별한 Key 생성 주의

⚠️ Key 네이밍 규칙

 
auth:email:{email}
auth:refresh:{userId}
rate:mail:{email}
  • Prefix로 역할 구분 필수

⚠️ Redis 장애 시 대비

  • 인증/보안 로직은 Redis 장애 시 실패 전략(Fail-safe) 고려

8. Docker로 Redis 실행 예시

 
redis:
  image: redis:7
  container_name: chwimeet-redis
  ports:
    - "6379:6379"
  command: redis-server --requirepass ${REDIS_PASSWORD}

 


9. Spring에서 Redis 연결 설

1) application.yml 예시

 
spring:
  data:
    redis:
      host: ${SPRING__REDIS__HOST}
      port: ${SPRING__REDIS__PORT}
      timeout: 10000
      password: ${SPRING__REDIS__PASSWORD}

2) 각 옵션 의미 (이 정도는 꼭 같이)

  • host / port: Redis 서버 주소/포트 (로컬/도커/EC2 등 환경 따라 달라짐)
  • password: requirepass 설정한 경우 필요 (운영환경은 거의 필수)
  • timeout: Redis 커넥션/명령 처리 대기 시간
    • 10,000ms(10초)는 “네트워크 불안/부하 상황”에서 너무 민감하게 실패하지 않게 여유를 준 설정
    • 대신 너무 크게 잡으면 장애 시 요청이 오래 붙잡힐 수 있으니 환경에 맞춰 조정

3) 환경변수 네이밍 팁 (너 지금 방식 좋음)

  • ${SPRING__REDIS__HOST} 처럼 더블 언더스코어로 계층 표현하면
    • .env, docker-compose, GitHub Actions secrets에서 깔끔하게 관리 가능
  • “민감정보(password)”는 .env/Secrets로만 관리하고 레포에 절대 하드코딩 금지

10. 정리

Redis는 단순한 캐시 서버가 아니라
인증, 보안, 성능 개선을 위한 핵심 인프라 컴포넌트라고 생각한다.

특히

  • 이메일 인증
  • JWT Refresh Token 관리
  • Rate Limit
  • 임시 상태 공유

같은 영역에서 Redis의 장점이 가장 잘 드러난다.

LIST