MMeshOps
Redis 실전: 서비스 장애를 막는 안전한 캐싱과 상태 관리
1예상 8중급

왜 Redis는 PostgreSQL 이후에 배워야 할까?

Redis를 첫 번째 저장소로 사용하면 안 되는 이유와 PostgreSQL과의 역할 분담에 대해 알아봅니다.

우리가 프로그래밍을 처음 배우면 보통 PostgreSQL이나 MySQL 같은 관계형 데이터베이스(RDBMS)를 가장 먼저 다루게 됩니다. 그리고 서비스가 조금씩 커지면 선배 개발자나 자료에서 "이젠 Redis를 써야 할 때다"라는 말을 듣게 되죠.

왜 처음부터 빠르고 강력하다는 Redis를 배우지 않고, 항상 PostgreSQL 다음 단계로 다루는 것일까요? 이번 에피소드에서는 Redis가 가진 근본적인 성격과 역할 분담의 이유를 알아봅니다.

주 저장소와 보조 저장소의 차이

데이터베이스를 집에 비유해 봅시다. PostgreSQL은 튼튼한 금고와 같습니다. 속도는 조금 느릴 수 있지만 정전이 되거나 사고가 나도 안의 내용물이 안전하게 보존됩니다. 반면 Redis는 책상 위에 놓인 작업용 화이트보드입니다. 바로 쓰고 지우기에는 엄청나게 빠르지만, 누군가 보드를 닦아버리거나 정전이 발생하면 적혀있던 내용이 날아갈 위험이 있습니다.

이러한 차이 때문에 우리는 데이터를 성격에 따라 분리해서 저장해야 합니다. 주 저장소(Primary Store)는 데이터의 영구적인 보존과 무결성을 책임집니다. 반면 보조 저장소(Secondary Store)는 빠른 접근과 임시 저장을 담당하죠.

PostgreSQL vs Redis 특징 비교

특징PostgreSQL (주 저장소)Redis (보조 저장소)
저장 매체디스크 (Disk)메모리 (RAM)
데이터 영속성매우 높음 (안전함)휘발성 (날아갈 수 있음)
처리 속도보통 (디스크 I/O 발생)매우 빠름 (마이크로초 단위)
주요 용도회원 정보, 결제 내역, 게시글 원본캐싱, 임시 세션, 실시간 랭킹

메모리 기반 데이터베이스의 한계

Redis는 데이터를 하드디스크가 아닌 RAM(Random Access Memory)에 저장합니다. RAM은 CPU와 매우 가깝게 동작하기 때문에 디스크보다 압도적으로 빠르죠. 하지만 RAM은 디스크에 비해 가격이 매우 비싸고 용량이 적습니다.

따라서 모든 데이터를 Redis에 넣으려고 하면 막대한 인프라 비용이 발생합니다. 이것이 바로 Redis를 메인 데이터베이스로 사용하지 않는 또 다른 현실적인 이유입니다.

데이터의 역할 분담

가장 이상적인 아키텍처는 중요한 영구 데이터는 PostgreSQL에 안전하게 저장하고, 자주 조회하면서 변동이 빠른 임시 데이터만 Redis로 복사해 빠르게 서비스하는 것입니다. 이를 통해 안전성과 성능이라는 두 마리 토끼를 모두 잡을 수 있습니다.

왜 PostgreSQL 이후에 배워야 할까?

Redis는 훌륭한 도구이지만, 그 자체만으로는 온전한 서비스를 구성하기 어렵습니다. 만약 데이터가 날아갔을 때 언제든 복구할 수 있는 "원본"이 없다면, Redis가 재시작되는 순간 서비스 전체의 데이터가 증발하는 대형 사고가 발생하게 됩니다.

그래서 안전한 원본 저장소를 다루는 법을 먼저 깨우친 후에야, 그 원본을 보호하면서 속도를 끌어올리기 위한 보조 도구로서 Redis를 올바르게 활용할 수 있습니다.

주 저장소와 보조 저장소의 협력 패턴

async function getUserProfile(userId) {
  // 1. 먼저 빠른 Redis(보조 저장소)에서 데이터를 찾아본다
  const cachedProfile = await redis.get(`user:${userId}`);
  
  if (cachedProfile) {
    return JSON.parse(cachedProfile); // 빠르게 바로 응답!
  }
  
  // 2. 만약 Redis에 없다면, 느리지만 확실한 PostgreSQL(주 저장소)에서 원본을 조회한다
  const dbProfile = await db.query('SELECT * FROM users WHERE id = $1', [userId]);
  
  // 3. 다음 조회를 위해 원본 데이터를 Redis에 복사해둔다
  await redis.set(`user:${userId}`, JSON.stringify(dbProfile));
  
  return dbProfile;
}

위 코드처럼 Redis는 항상 뒤에 든든한 주 저장소를 두고, 이를 보조하는 형태로 사용될 때 가장 빛을 발합니다. 이러한 협력 패턴을 "캐시 어사이드(Cache Aside)" 방식이라고 부르며, 실무에서 가장 흔하게 접하는 구조입니다.

Redis는 무적의 만능 도구가 아니다

초보 개발자들은 Redis의 엄청난 속도에 매료된 나머지 모든 데이터를 Redis에 넣고 싶어하는 유혹에 빠지기 쉽습니다. 하지만 아키텍처 설계에서 만능 도구란 없습니다. 어떤 데이터를 디스크에 넣고 어떤 데이터를 메모리에 넣을지 선별하는 안목을 기르는 것이 이 강의의 핵심 목표입니다.

개념 퀴즈

퀴즈 답을 맞춰야 학습 완료가 됩니다.

다음 중 Redis를 가장 올바르게 이해하고 사용한 상황은 무엇인가요?

3줄 요약

  1. 1PostgreSQL은 데이터의 영속성과 무결성을 보장하는 안전한 주 저장소(Primary Store)입니다.
  2. 2Redis는 메모리(RAM)를 사용하여 압도적으로 빠르지만, 데이터가 휘발될 수 있는 보조 저장소(Secondary Store)입니다.
  3. 3Redis는 항상 주 저장소의 원본 데이터를 보호하고 서비스 속도를 높이는 캐싱 도구로 협력할 때 가장 강력합니다.