| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 | 31 |
Tags
- 1px border
- Websocket
- &연산
- jwt
- 문서번호
- 전역변수
- font-size
- 데이터베이스 #try #이중
- github
- 당근마켓
- 타입스크립트
- TypeScript
- 0.5px border
- 0.75px border
- angular
- Strict
- 컴포넌튼
- 으
- entity
- ZOOM
- Props
- 클론코딩
- literal
- 서버리스 #
- es6
- npm
- 10px
- 0.25px border
- TS
- ES5
Archives
- Today
- Total
복잡한뇌구조마냥
[DB] Redis 본문
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
'BE > DB' 카테고리의 다른 글
| [DB] Cache Stampede ( 캐시 스탬피드 ) (0) | 2025.12.10 |
|---|---|
| [DB] 데이터 무결성(Integrity)의 종류와 제약조건 정리 (0) | 2025.11.02 |
| [DB] 트랜잭션(Transaction)과 ACID 특성 정리 (0) | 2025.10.29 |
| [DB] 벡터 데이터베이스(Vector DB) (0) | 2025.09.22 |
| [SQL] 명령어 분류 - DDL / DML / DCL / TCL (0) | 2025.09.22 |