본문 바로가기
JavaScript/Next

Upstash

by curious week 2025. 3. 5.

Upstash서버리스(Serverless) 환경에 최적화된 Redis 및 Kafka 기반 데이터베이스 서비스이다.
Next.js, Vercel, AWS Lambda 등과 함께 저비용, 저지연, 고성능으로 사용 가능하다.

언제 Upstash를 사용할까?

"서버리스 환경에서 Redis가 필요할 때"  Upstash가 가장 좋은 선택
"Vercel, Netlify, AWS Lambda에서 Redis를 간편하게 쓰고 싶을 때"
"비용을 절감하면서 빠른 Key-Value 저장이 필요할 때"
"Redis의 모든 기능(예: Pub/Sub, Streams)을 써야 한다면 Redis Cloud를 고려"

비용 효율적이고 사용이 간편하며 Next.js와 완벽하게 호환된다

Redis와 Kafka란? 더보기

더보기
더보기

1. Redis란?

"빠른 속도의 인메모리 데이터베이스 (Key-Value Store)"

  • Redis는 빠른 데이터 저장 & 캐싱이 필요할 때 적합
  • Redis는 주로 데이터 캐싱과 빠른 읽기/쓰기에 사용

Redis 특징

  • 인메모리(In-Memory): 데이터를 메모리에 저장하여 읽기/쓰기 속도가 매우 빠름
  • Key-Value Store: 데이터를 key-value(키-값) 형태로 저장
  • 퍼시스턴스(Persistence) 지원: 데이터를 디스크에 저장 가능 (RDB, AOF)
  • Pub/Sub 기능: 실시간 메시지 브로커 역할 가능
  • TTL 지원: 특정 시간이 지나면 자동 삭제되는 데이터 저장 가능
  • 분산 캐시: 여러 서버에서 공유 가능

Redis 주요 사용 사례

사용 사례 설명

데이터 캐싱 DB 부하 줄이기 (예: 사용자 세션 저장, API 응답 캐싱)
세션 관리 로그인한 사용자 정보 저장
Queue (메시지 큐) 단순한 작업 큐 (ex: 작업 예약, 비동기 처리)
실시간 분석 방문자 수 카운트, 실시간 데이터 저장
Pub/Sub 시스템 실시간 메시징 시스템 구축 가능

Redis 사용 예제

import { createClient } from 'redis';

const redis = createClient();
await redis.connect();

await redis.set('user:123', 'John Doe'); // 데이터 저장
const user = await redis.get('user:123'); // 데이터 조회
console.log(user); // John Doe

특징: 메모리에 저장하므로 데이터 읽기가 빠름.
단점: 많은 데이터를 저장하면 메모리 사용량 증가 (RAM 한정).


2. Kafka란?

"분산형 이벤트 스트리밍 플랫폼 (Event Streaming & Message Queue)"

  • Kafka는 이벤트 스트리밍과 메시지 큐
  • Kafka는 대량의 데이터 스트리밍이 필요할 때 적합

Kafka 특징

  • 분산 시스템: 여러 서버(클러스터)에서 동작 가능
  • 고성능: 대량의 데이터를 빠르게 처리 (Facebook, LinkedIn 등에서 사용)
  • 이벤트 스트리밍: 데이터가 연속적으로 들어오는 시스템에 적합
  • 내구성(Durability): 메시지를 디스크에 저장하여 안정적 운영 가능
  • 생산자(Producer) & 소비자(Consumer) 모델: 데이터를 발행(Publish)하고 구독(Subscribe)

Kafka 주요 사용 사례

사용 사례 설명

이벤트 스트리밍 실시간 데이터 처리 (ex: 실시간 추천 시스템, 금융 거래)
로그 수집 여러 서버에서 로그 데이터를 중앙 집중 관리
메시지 큐(Message Queue) 마이크로서비스 간 비동기 데이터 전송
IoT 데이터 처리 센서 데이터, 실시간 트래픽 분석
모니터링 시스템 서버 상태, 애플리케이션 로그 분석

Kafka 사용 예제

import { Kafka } from 'kafkajs';

const kafka = new Kafka({ clientId: 'my-app', brokers: ['localhost:9092'] });

const producer = kafka.producer();
await producer.connect();
await producer.send({
  topic: 'test-topic',
  messages: [{ value: 'Hello Kafka' }],
});

특징: 대량의 데이터를 빠르게 처리하고, 여러 Consumer가 데이터를 받아볼 수 있음.
단점: Redis보다 설정이 복잡하고 운영 비용이 큼.


3. 언제 Redis vs Kafka를 선택할까?

 "빠른 데이터 읽기/쓰기 (캐싱, 세션 저장)"  Redis
 "대량의 데이터를 스트리밍 방식으로 처리"  Kafka
 "이벤트 기반 메시지 시스템이 필요"  Kafka
 "단순한 Pub/Sub 기능이 필요"  Redis 가능 (하지만 제한적)

Redis는 데이터 캐싱과 세션 저장이 필요할 때 유용
Kafka는 실시간 데이터 스트리밍과 로그 분석이 필요할 때 적합


4. Redis & Kafka 함께 사용하기

 Redis: 빠른 읽기/쓰기 캐시 역할
 Kafka: 실시간 데이터 스트리밍 처리

예제: 웹사이트에서 사용자 활동을 Kafka로 수집하고, Redis에 캐싱하는 경우

  1. 사용자가 웹사이트 방문
  2. Redis에서 데이터 캐싱
  3. Kafka로 사용자 이벤트 전송 (예: 클릭 이벤트)
  4. Kafka에서 데이터를 분석 및 저장
// Redis에서 세션 정보 조회
const userSession = await redis.get(`session:${userId}`);
if (!userSession) {
  console.log('세션 없음, Redis에 저장');
  await redis.set(`session:${userId}`, 'UserData', { ex: 3600 });
}

// Kafka로 이벤트 전송
await kafkaProducer.send({
  topic: 'user-events',
  messages: [{ value: `User ${userId} visited the page` }],
});

이렇게 하면 빠른 응답 속도와 대량 데이터 처리를 동시에 해결할 수 있음


1. Upstash란?

주요 특징

  • 서버리스(Serverless) Redis / Kafka 제공
  • 자동 스케일링 (사용량이 적을 땐 비용 거의 없음)
  • Vercel, Netlify, Cloudflare Workers와 완벽 호환
  • REST API 및 SDK 지원 (Redis CLI, HTTP API, Upstash SDK 등)

Upstash가 필요한 경우

  • Next.js, Vercel, AWS Lambda 등의 서버리스 환경에서 Redis 사용
  • 비용 절감 (Redis 서버 유지비 절약)
  • 빠른 데이터 캐싱 및 세션 저장

2. Upstash의 장점 & 단점

서버리스 모델: 사용한 만큼만 요금 부과 (최대 10만 요청 무료) 무료 플랜 제한: 초당 100 요청 제한
Vercel, Cloudflare, AWS Lambda와 최적화 커넥션 한계: 장기적인 WebSocket 커넥션에 부적합
글로벌 배포 지원 (최적의 로케이션 자동 선택) 완전한 Redis 기능 X (일부 고급 기능 제한)
REST API 지원 (서버리스 환경에서 직접 요청 가능) 벤더 락인 가능성 (Upstash 종속성 증가)
Kafka 지원 (이벤트 기반 시스템 구축 가능) NoSQL 기반 (전통적인 SQL 기능 부족)

결론: 서버리스 환경에서 Redis를 쉽고 저렴하게 사용할 수 있지만,
고급 Redis 기능(예: Pub/Sub, Streams 등)을 많이 사용한다면 한계가 있을 수 있다.


3. Upstash와 유사한 서비스 비교

Upstash는 Redis 기반 서비스이지만, 다른 서버리스 NoSQL 및 캐시 서비스와도 비교 가능하다.

서비스 특징 장점 단점

Upstash 서버리스 Redis/Kafka 저비용, Vercel 호환 고급 Redis 기능 제한
Redis Cloud (RedisLabs) Fully Managed Redis 강력한 성능, AI 모델 캐싱 가격이 비쌈
Amazon ElastiCache AWS 관리형 Redis/Memcached AWS 통합, 안정성 높음 설정 복잡, 비쌈
Cloudflare KV 서버리스 Key-Value 스토리지 글로벌 배포, 저렴 쓰기 속도 느림
Supabase Postgres 기반 DB SQL 지원, Redis-like 기능 제공 서버리스 최적화 부족
Firebase Firestore NoSQL 문서 DB 실시간 데이터 동기화 제한된 쿼리 기능

Upstash는 "서버리스 Redis"가 필요할 때 최고의 선택이지만,
Firebase Firestore, Cloudflare KV 등도 캐시 역할을 수행할 수 있음.


4. Upstash 설정 및 사용법 (Next.js 예제)

1️⃣ Upstash 계정 생성 & Redis 인스턴스 만들기

  1. Upstash 회원가입
  2. "Create Database" → Redis 선택
  3. 지역(Region) 설정 후 배포
  4. UPSTASH_REDIS_REST_URL & UPSTASH_REDIS_REST_TOKEN 복사

2️⃣ Next.js에서 Upstash 사용하기

@upstash/redis 설치

npm install @upstash/redis

Redis 클라이언트 설정 (lib/redis.ts)

import { Redis } from '@upstash/redis'

export const redis = new Redis({
  url: process.env.UPSTASH_REDIS_REST_URL!,
  token: process.env.UPSTASH_REDIS_REST_TOKEN!,
})

3️⃣ Next.js API Route에서 Redis 사용

데이터 저장 (캐싱)

import { NextResponse } from 'next/server'
import { redis } from '@/lib/redis'

export async function GET() {
  await redis.set('message', 'Hello, Upstash!')
  return NextResponse.json({ success: true })
}

데이터 조회

export async function GET() {
  const message = await redis.get('message')
  return NextResponse.json({ message })
}

5. Upstash의 고급 기능

1️⃣ TTL(Time-to-Live) 설정 (자동 만료)

await redis.set('tempData', 'This will expire', { ex: 60 }) // 60초 후 삭제

2️⃣ 페이지 캐싱 (Next.js Middleware 활용)

import { NextResponse } from 'next/server'
import { redis } from '@/lib/redis'

export async function middleware(req) {
  const cachedPage = await redis.get(req.nextUrl.pathname)
  if (cachedPage) return new Response(cachedPage)

  const response = NextResponse.next()
  await redis.set(req.nextUrl.pathname, await response.text(), { ex: 300 }) // 5분 캐싱
  return response
}

 

 

 

 

'JavaScript > Next' 카테고리의 다른 글

Prismic  (0) 2025.03.06
전역 상태 관리 라이브러리 소개 및 사용 시기(useContext, Zustand, Jotai, Recoil, Redux Toolkit, Nuqs)  (0) 2025.03.05
Middleware 미들웨어 사용법  (0) 2025.03.05
Drizzle ORM  (0) 2025.02.12
Neon  (0) 2025.02.12