💡 오늘 학습 키워드
- Redis
🎯 학습 내용 정리
서비스를 개발하다 보면 모든 데이터를 관계형 데이터베이스(RDB)에 저장하는 것이 항상 최선은 아니다. 로그인 세션, 장바구니, 인증번호, 조회수처럼 빠르게 변경되고 일정 시간이 지나면 사라져도 되는 데이터는 오히려 RDB보다 메모리에 저장하는 것이 훨씬 효율적이다.
Spring Boot 프로젝트에서는 일반적으로 MySQL, PostgreSQL과 같은 관계형 데이터베이스를 사용한다.
RDB는 데이터를 디스크(SSD/HDD)에 저장하기 때문에 서비스가 종료되어도 데이터가 유지되는 영속성(Persistence)을 제공한다.
하지만 다음과 같은 데이터는 특성이 다르다.
- 로그인 세션
- 인증번호(OTP)
- Refresh Token
- 장바구니
- 조회수
- 캐시 데이터
이러한 데이터는 다음 특징을 가진다.
- 매우 자주 수정된다.
- 빠른 읽기/쓰기가 중요하다.
- 일정 시간이 지나면 삭제된다.
- 영구 보관할 필요가 없다.
이러한 데이터를 매번 디스크에 저장하면 I/O 비용이 발생하여 성능이 저하된다.
이 문제를 해결하기 위해 사용하는 것이 인메모리 데이터베이스(In-Memory Database) 이다.
Redis란 REmote DIctionary Server의 약자로 대표적인 In-Memory Key-Value Database이다.
Java의 Map<String, Object>처럼 Key를 이용해 데이터를 저장하고 조회한다.
예를 들어 문자열 하나를 저장하는 것은 다음과 같다.
SET greeting "Hello Redis"
GET greeting
SQL을 사용하는 관계형 데이터베이스와 달리 Redis는 SQL 없이 명령(Command) 기반으로 동작한다.
Redis의 가장 큰 특징은 메모리(RAM)에 데이터를 저장한다는 것이다.
RDB는 다음과 같이 진행된다.
Application
↓
Database
↓
SSD / HDD
- 영속성 제공
- 디스크 I/O 발생
- 상대적으로 느림
Redis는 다음과 같이 진행된다.
Application
↓
Redis
↓
RAM
- 메모리에 저장
- 디스크 접근이 거의 없음
- 매우 빠른 읽기/쓰기
대신 메모리는 휘발성이기 때문에 서버가 종료되면 데이터가 사라질 수 있다.
그래서 Redis는 다음과 같은 데이터를 저장하는 데 적합하다.
- Session
- Cache
- Refresh Token
- 인증번호
- 장바구니
- 조회수
- 랭킹
관계형 데이터베이스는 SQL을 사용한다.
SELECT * FROM users;
반면 Redis는 SQL 대신 명령(Command)을 사용한다.
SET name alex
GET name
Redis는 대표적인 NoSQL Database이다.
현재 NoSQL은 Not Only SQL을 의미하며, 관계형 데이터베이스의 한계를 보완하기 위해 등장하였다.
대표적인 NoSQL 종류는 다음과 같다.
| 종류 | 특징 |
| Key-Value | Key와 Value 저장 |
| Document | JSON 형태 저장 |
| Column Family | 컬럼 단위 저장 |
| Graph | 관계 중심 저장 |
Redis는 이 중 Key-Value Store에 해당한다.
Redis는 다양한 서비스에서 활용된다.
대표적인 사례는 다음과 같다.
1) Session Storage
여러 서버가 동일한 로그인 정보를 공유한다.
User
↓
Server A
Server B
Server C
↓
Redis(Session)
2) Cache
자주 조회되는 데이터를 Redis에 저장하여 DB 조회를 줄인다.
Client
↓
Redis Cache
↓ (없으면)
Database
3) Leaderboard
게임 점수
실시간 순위
좋아요 순위
4) Rate Limiter
짧은 시간 동안 과도한 API 요청을 제한한다.
5) 방문자 수 집계
조회수
좋아요
실시간 인기글
Redis 설치 방법은 크게 세 가지가 있다.
- Linux / WSL 설치
- macOS(Homebrew)
- Docker
실무에서는 Docker 사용을 가장 많이 권장한다.
예를 들어 Docker Compose는 다음과 같이 작성한다.
services:
redis-stack:
image: redis/redis-stack
container_name: redis-stack-compose
restart: always
environment:
REDIS_ARGS: "--requirepass systempass"
ports:
- "6379:6379"
- "8001:8001"
실행은 다음과 같다.
docker compose up -d
Redis는 단순 문자열뿐 아니라 다양한 자료구조를 제공한다.
1) String
가장 기본적인 자료형이다.
SET user:name alex
GET user:name
증가 및 감소도 가능하다.
INCR counter
DECR counter
활용 예시
- 조회수
- 방문자 수
- 토큰
- 인증번호
2) List
Linked List 형태로 데이터를 저장한다.
LPUSH users alex
RPUSH users brad
LPOP users
RPOP users
활용 예시
- 최근 검색어
- 메시지 큐
- Timeline
3) Set
중복 없는 집합이다.
SADD java alex
SADD java brad
SMEMBERS java
활용 예시
- 중복 방문자
- 좋아요 사용자
- 태그
4) Hash
객체 저장에 가장 많이 사용하는 자료형이다.
HSET user:1 name alex age 25
HGET user:1 name
Java 객체 하나를 저장하는 것과 매우 유사하다.
장바구니처럼
상품 → 수량
형태를 저장할 때 많이 사용한다.
5) Sorted Set
점수(score)를 함께 저장하는 Set이다.
ZADD ranking 100 alex
ZADD ranking 90 brad
ZRANGE ranking 0 10
활용 예시
- 랭킹
- Leaderboard
- 인기 게시글
공통 명령어도 존재한다.
1) 삭제
DEL key
2) TTL 설정
EXPIRE key 30
30초 후 자동 삭제된다.
3) 모든 Key 조회
KEYS *
다만 운영환경에서는 KEYS * 대신 SCAN 사용을 권장한다. KEYS는 모든 키를 한 번에 탐색하므로 데이터가 많은 환경에서는 Redis를 블로킹할 수 있다.
4) 전체 삭제
FLUSHDB
Spring Boot에서 Redis 사용하기 위해서 의존성을 추가해준다.
implementation 'org.springframework.boot:spring-boot-starter-data-redis'
application.yml을 작성한다.
spring:
data:
redis:
host: localhost
port: 6379
username: default
password: systempass
Spring Data Redis는 Spring Data JPA와 매우 유사한 방식으로 사용할 수 있다.
먼저 객체를 생성한다.
@RedisHash("item")
public class Item {
@Id
private Long id;
private String name;
private String description;
private Integer price;
}
Repository는 다음과 같이 작성한다.
public interface ItemRepository
extends CrudRepository<Item, Long> {
}
사용법도 JPA와 거의 동일하다.
itemRepository.save(item);
itemRepository.findById(1L);
itemRepository.deleteById(1L);
Redis에서는 내부적으로 Hash 자료형을 이용하여 객체를 저장한다.
Repository는 CRUD에는 편리하지만 Redis의 다양한 자료구조를 활용하기에는 한계가 있다.
이때 사용하는 것이 RedisTemplate이다.
예를 들어 문자열을 사용하는 경우에는 StringRedisTemplate을 사용할 수 있다.
@Autowired
private StringRedisTemplate redisTemplate;
문자열 저장은 다음과 같다.
ValueOperations<String, String> ops =
redisTemplate.opsForValue();
ops.set("hello", "redis");
ops.get("hello");
Set 자료형도 사용할 수 있다.
SetOperations<String, String> ops =
redisTemplate.opsForSet();
ops.add("hobbies", "coding");
직접 RedisTemplate을 만들어보자.
복잡한 객체를 저장하려면 직접 RedisTemplate을 등록하면 된다.
@Bean
public RedisTemplate<String, ItemDto> itemRedisTemplate(
RedisConnectionFactory connectionFactory) {
RedisTemplate<String, ItemDto> template =
new RedisTemplate<>();
template.setConnectionFactory(connectionFactory);
template.setKeySerializer(RedisSerializer.string());
template.setValueSerializer(RedisSerializer.json());
return template;
}
이후에는 객체를 그대로 저장할 수 있다.
ValueOperations<String, ItemDto> ops =
itemRedisTemplate.opsForValue();
ops.set("item:1", itemDto);
직렬화를 JSON으로 설정하면 Redis 내부에서도 사람이 읽기 쉬운 형태로 저장된다.
RedisRepository와 RedisTemplate를 비교해보면 다음과 같다.
| RedisRepository | RedisTemplate |
| Spring Data 방식 | Redis 명령 직접 사용 |
| CRUD 구현이 간단 | 다양한 자료구조 활용 가능 |
| 객체 중심 | Redis 중심 |
| JPA와 사용법이 유사 | Redis의 모든 기능 활용 가능 |
간단한 객체 저장은 RedisRepository가 적합하다.
Redis의 자료구조를 적극적으로 활용해야 한다면 RedisTemplate이 더 적합하다.
Redis는 단순히 빠른 데이터베이스가 아니라 메모리를 활용하여 성능을 극대화하기 위한 데이터 저장소이다.
특히 캐시, 세션, 인증 토큰, 장바구니, 조회수, 랭킹처럼 빠른 응답과 빈번한 데이터 변경이 필요한 영역에서 강력한 성능을 발휘한다.
Spring Boot에서는 RedisRepository를 통해 JPA처럼 간편하게 사용할 수도 있고, RedisTemplate을 통해 Redis의 다양한 자료구조를 직접 활용할 수도 있다. 프로젝트의 요구사항에 맞는 방식을 선택하면 Redis의 장점을 최대한 활용할 수 있다.
📚 한줄 정리
Redis는 메모리 기반의 Key-Value NoSQL 데이터베이스로 캐시, 세션, 인증 토큰, 장바구니처럼 빠른 읽기/쓰기와 일시적인 데이터 처리가 필요한 상황에서 뛰어난 성능을 제공하며, Spring Boot에서는 RedisRepository와 RedisTemplate을 통해 손쉽게 활용할 수 있다.
'Bootcamp > Fundamentals' 카테고리의 다른 글
| 대규모 시스템 설계와 RabbitMQ (0) | 2026.07.27 |
|---|---|
| Redis를 활용한 Session Clustering, Leaderboard 그리고 Cache (0) | 2026.07.24 |
| CI/CD와 GitLab CI + AWS ECS 자동배포 (1) | 2026.07.22 |
| Docker와 Docker Compose (0) | 2026.07.21 |
| Event Driven Architecture와 Kubernetes (0) | 2026.07.05 |