🗄️ 데이터베이스

Upstash

Upstash

서버리스 Redis/Kafka. REST API 제공, 엣지 친화적.

📖 상세 설명

Upstash는 서버리스 환경에 최적화된 Redis와 Kafka 클라우드 서비스입니다. HTTP/REST API를 제공하여 기존 TCP 기반 Redis 클라이언트 없이도 엣지 환경(Vercel Edge Functions, Cloudflare Workers)에서 쉽게 사용할 수 있습니다.

주요 특징으로는 요청 기반 과금(사용한 만큼만 비용 지불), 자동 스케일링, 글로벌 복제(낮은 지연시간), TLS 암호화 등이 있습니다. Redis 외에도 QStash(메시지 큐), Vector(벡터 DB) 서비스도 제공합니다.

서버리스 아키텍처에서 콜드 스타트 문제 없이 세션 관리, 캐싱, rate limiting 등을 구현하는 데 적합합니다.

💻 코드 예제

// Upstash Redis with REST API
import { Redis } from '@upstash/redis'

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

// Edge Function에서 캐시 사용
export default async function handler(req) {
  const userId = req.query.id

  // 캐시 확인
  const cached = await redis.get(`user:${userId}`)
  if (cached) {
    return Response.json(cached)
  }

  // DB 조회 후 캐시 저장 (60초 TTL)
  const user = await fetchUserFromDB(userId)
  await redis.setex(`user:${userId}`, 60, user)
  return Response.json(user)
}

// Rate Limiting with Upstash
import { Ratelimit } from "@upstash/ratelimit"

const ratelimit = new Ratelimit({
  redis: redis,
  limiter: Ratelimit.slidingWindow(10, "10 s"), // 10초에 10회
})

export async function middleware(req) {
  const ip = req.ip ?? "127.0.0.1"
  const { success } = await ratelimit.limit(ip)

  if (!success) {
    return new Response("Too Many Requests", { status: 429 })
  }
}

🗣️ 실무 대화 예시

프론트엔드 개발자: "Vercel Edge Function에서 Redis 쓰려는데 연결이 안 돼요."

백엔드 개발자: "Edge 런타임은 TCP 연결이 안 돼서 일반 Redis 클라이언트가 작동 안 해요. Upstash 쓰면 HTTP REST로 통신해서 됩니다."

프론트엔드 개발자: "성능은 괜찮아요?"

백엔드 개발자: "글로벌 리전 지원해서 지연시간 10ms 미만이에요. 서버리스라 콜드 스타트도 없고요."

면접관: "서버리스 환경에서 상태 관리를 어떻게 하나요?"

지원자: "Upstash Redis를 사용합니다. HTTP REST API를 제공해서 Edge Function에서도 사용 가능하고, 요청 기반 과금이라 서버리스의 비용 효율성을 유지할 수 있습니다."

면접관: "세션 관리 구현 경험이 있나요?"

지원자: "네, JWT + Upstash 조합으로 리프레시 토큰을 저장하고, TTL로 자동 만료 처리했습니다. Rate limiting도 @upstash/ratelimit 라이브러리로 쉽게 구현했습니다."

리뷰어: "여기서 매 요청마다 Redis 인스턴스를 새로 생성하고 있네요."

개발자: "서버리스라 어쩔 수 없는 거 아닌가요?"

리뷰어: "파일 최상단에서 한 번 생성하면 웜 스타트 시 재사용돼요. 함수 밖으로 빼주세요. 비용이랑 성능 둘 다 좋아집니다."

개발자: "아, 그렇군요. 모듈 레벨로 이동하겠습니다."

⚠️ 주의사항

🔗 관련 용어

📚 더 배우기