Bootcamp/Fundamentals

Redis

개발자 오리 2026. 7. 23. 15:34

💡  오늘 학습 키워드

  • Redis

 

 

🎯  학습 내용 정리

서비스를 개발하다 보면 모든 데이터를 관계형 데이터베이스(RDB)에 저장하는 것이 항상 최선은 아니다. 로그인 세션, 장바구니, 인증번호, 조회수처럼 빠르게 변경되고 일정 시간이 지나면 사라져도 되는 데이터는 오히려 RDB보다 메모리에 저장하는 것이 훨씬 효율적이다.

 

 

Spring Boot 프로젝트에서는 일반적으로 MySQL, PostgreSQL과 같은 관계형 데이터베이스를 사용한다.

RDB는 데이터를 디스크(SSD/HDD)에 저장하기 때문에 서비스가 종료되어도 데이터가 유지되는 영속성(Persistence)을 제공한다.

하지만 다음과 같은 데이터는 특성이 다르다.

  • 로그인 세션
  • 인증번호(OTP)
  • Refresh Token
  • 장바구니
  • 조회수
  • 캐시 데이터

이러한 데이터는 다음 특징을 가진다.

  • 매우 자주 수정된다.
  • 빠른 읽기/쓰기가 중요하다.
  • 일정 시간이 지나면 삭제된다.
  • 영구 보관할 필요가 없다.

이러한 데이터를 매번 디스크에 저장하면 I/O 비용이 발생하여 성능이 저하된다.

이 문제를 해결하기 위해 사용하는 것이 인메모리 데이터베이스(In-Memory Database) 이다.

 

 

RedisREmote 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을 통해 손쉽게 활용할 수 있다.