2026. 7. 22. 16:08ㆍ부트캠프/TIL(Today I Learned)
오늘의 학습일지
날짜: 2026.07.22
오늘의 학습 키워드
- In-Memory Database
- Redis
- NoSQL
- Cache(캐싱)
- Key-Value
- String
- List(Linked List)
- Docker
- Redis Insight
- LPUSH / RPUSH / LPOP / RPOP
- MSET / MGET
- INCR / DECR
오늘 배운 점
오늘은 Redis가 왜 필요한지부터 설치, 그리고 가장 기본적인 자료형인 String과 List까지 공부했다.
기존에 Spring Boot 프로젝트를 만들면서 사용했던 MySQL이나 PostgreSQL 같은 관계형 데이터베이스는 모두 영속성(Persistence) 을 목적으로 사용한다.
프로그램이 종료되어도 데이터가 파일 시스템에 저장되어 있기 때문에 계속 유지된다.
하지만 서비스에서는 항상 영구적으로 저장해야 하는 데이터만 존재하는 것은 아니었다.
예를 들면
- 로그인 세션
- JWT 토큰
- 이메일 인증번호
- 장바구니
- 조회수
- 방문자 수
같은 데이터는 계속 변경되고 삭제되는 데이터들이다.
이런 데이터를 계속 디스크에 저장하면 속도가 느려질 수 있다.
그래서 등장하는 것이 Redis이다.
Redis는 In-Memory Database 이다.
메모리에 데이터를 저장하기 때문에 읽기와 쓰기 속도가 매우 빠르다.
대신 메모리에 저장하기 때문에 프로그램이 종료되면 데이터가 사라질 수 있다.
Redis는 이름 그대로
REmote DIctionary Server
이며,
Java로 생각하면
Map<String, Object>
하나를 아주 거대하게 만든 데이터베이스라고 이해하면 된다.
Redis에는 테이블도 없고 SQL도 없다.
모든 데이터는
Key -> Value
형태로 저장된다.
예를 들어
SET user:name geonwoo
GET user:name
처럼 값을 저장하고 가져올 수 있다.
String 자료형
오늘 가장 먼저 배운 자료형은 String이다.
거의 모든 데이터를 문자열로 저장할 수 있다는 것을 알게 되었다.
로그인 토큰
SET refresh:user:1 JWT_TOKEN
로그아웃하면
DEL refresh:user:1
으로 삭제하면 된다.
이메일 인증번호
SET email:user@gmail.com 834215 EX 300
5분 후 자동 삭제된다.
조회수
INCR post:15:view
조회될 때마다 숫자가 증가한다.
좋아요도
INCR post:15:like
취소하면
DECR post:15:like
을 사용한다.
여러 개 저장하기
MSET
user:name alex
user:email alex@example.com
조회
MGET
user:name
user:email
한 번에 여러 개를 가져올 수 있다.
처음에는 String이라서 글자만 저장하는 줄 알았는데
JSON
이미지
HTML
JWT
이메일
파일 정보
또 String 하나에 최대 512MB 까지 저장 가능하다는 것도 새롭게 알게 되었다.
Redis 설치
Redis는
- Windows
- Ubuntu
- Mac
모두 설치할 수 있지만
실무에서는 대부분 Docker를 사용한다고 한다.
이번 실습에서도
services:
redis-stack:
image: redis/redis-stack
을 이용하여 Redis Stack을 실행했다.
Docker Compose를 이용하면 매우 간단하게 Redis 환경을 구성할 수 있었다.
또한
REDIS_ARGS:
--requirepass systempass
옵션으로 비밀번호를 설정할 수 있다는 것도 배웠다.
Redis Insight
Redis에는 전용 관리 도구인 Redis Insight가 있다.
localhost:8001
으로 접속하면
저장된 데이터를 GUI 형태로 확인할 수 있다.
IntelliJ Database 기능으로도 연결할 수 있었지만
Redis Insight가 훨씬 보기 편했다.
List 자료형
강의에서
Redis List는 Linked List 구현체이다.
라는 말을 했는데 처음에는 무슨 뜻인지 이해되지 않았다.
알고 보니
Java의
ArrayList
처럼 배열 구조가 아니라
LinkedList
처럼
A -> B -> C -> D
노드가 연결된 형태라는 의미였다.
그래서 Redis List는
앞이나 뒤에서 데이터를 넣고 빼는 작업이 매우 빠르다.
예를 들어
LPUSH fruits apple
LPUSH fruits banana
LPUSH fruits orange
를 실행하면
orange
banana
apple
순서로 저장된다.
반대로
RPUSH fruits kiwi
를 하면
맨 뒤에 추가된다.
즉
LPUSH
는 왼쪽에 넣기
RPUSH
는 오른쪽에 넣기이다.
데이터를 꺼낼 때는
LPOP
RPOP
을 사용한다.
GET을 사용할 수 없는 이유
여기서 가장 궁금했던 부분이 있었다.
왜
GET user:list
를 하면 오류가 날까?
이유는 Redis는 자료형마다 사용할 수 있는 명령어가 다르기 때문이다.
예를 들어
SET
GET
은 String 자료형 전용이다.
반면
List는
LPUSH
RPUSH
LPOP
RPOP
LRANGE
LLEN
같은 List 전용 명령어만 사용할 수 있다.
즉
GET user:list
는 사용할 수 없다.
반대로
LPOP user:name
도 사용할 수 없다.
자료형이 다르기 때문이다.
List 활용
Redis List는
스택(Stack)
큐(Queue)
구조를 구현할 때 많이 사용된다.
예를 들어
작업 대기열이라면
LPUSH jobs "메일 발송"
LPUSH jobs "결제 처리"
LPUSH jobs "푸시 알림"
처럼 저장하고
RPOP jobs
으로 하나씩 작업을 꺼낼 수 있다.
이런 이유 때문에 Redis List는 Linked List 구조가 적합한 것이다.
기타 명령어
리스트의 크기
LLEN user:list
전체 조회
LRANGE user:list 0 3
배열처럼
0번부터 3번까지 가져오는 방식이었다.
범위를 초과해도 오류가 발생하지 않는다는 점도 확인했다.
어려웠던 점
- Redis가 왜 필요한지 처음에는 잘 와닿지 않았다.
- "문자열만 저장하는데 어디에 쓰지?"라는 의문이 있었다.
- List가 Linked List라는 설명이 처음에는 이해되지 않았다.
- String과 List 명령어가 서로 호환되지 않는 이유도 헷갈렸다.
내일 할 것
- Redis List 명령어 더 실습하기
- Hash 자료형 공부하기
- Set 자료형 공부하기
- Sorted Set(ZSet) 공부하기
- Spring Boot에서 RedisTemplate 사용해 보기
- Redis를 이용한 캐싱과 세션 관리 예제 구현해 보기
정리
Redis는 데이터를 오래 보관하기 위한 데이터베이스가 아니라, 자주 변경되는 데이터를 빠르게 저장하고 조회하기 위한 In-Memory NoSQL 데이터베이스이며, 상황에 맞는 자료형(String, List 등)을 선택해 사용하는 것이 핵심이라는 점을 배웠다.
'부트캠프 > TIL(Today I Learned)' 카테고리의 다른 글
| [내일배움캠프_사전캠프_8기] TIL Days-24 캐싱개념, 캐싱전략 (0) | 2026.07.24 |
|---|---|
| [내일배움캠프_사전캠프_8기] TIL Days-21 Docker, Redis, MSA 진짜 시작 (0) | 2026.07.21 |
| [내일배움캠프_사전캠프_8기]_Days_19 TIL_ 팀 프로젝트-발표 (0) | 2026.07.20 |
| [내일배움캠프_사전캠프_8기]_Days_18 TIL_ 팀 프로젝트-Day10 (0) | 2026.07.15 |
| [내일배움캠프_사전캠프_8기]_Days_17 TIL_ 팀 프로젝트-Day9 (0) | 2026.07.14 |