✨ 배경
Upstash 프리티어는 계정당 DB 1개 제한. 현재 .env (prod) 와 .env.dev 가 동일 Upstash DB 를 공유하고 있어 두 환경의 Redis 데이터가 뒤섞임.
✨ 문제
같은 DB 를 공유하는 이상 격리 없이는 다음 문제가 상시 존재:
- 방문자 통계 오염 —
visitors:hll:YYYY-MM-DD 키가 prod/dev 공용. GET /api/admin/stats/visitors 응답이 두 환경 트래픽 합산으로 나옴.
- 정산 락 충돌 —
CYCLE_LOCK_KEY (settlement-payout), SYNC_LOCK_KEY (settlement-sync) 를 두 환경 cron 이 서로 뺏음. 한쪽이 락 잡으면 다른쪽 cron 이 스킵.
- Payple 인증 캐시 오염 —
payple-billing/payple-refund/payple-settlement 의 AUTH_CACHE_KEY 가 공유. prod 데모/실서비스 토큰이 dev 요청에 반환될 위험.
register-token 블랙리스트 공유 — 결제 리다이렉트 토큰 blacklist 가 섞임.
- 그 외
user-activity throttle, payple 카운터 등도 공용.
✨ 해결 방향
process.env.NODE_ENV 기반으로 모든 Redis 키에 자동 prefix (prod: / dev:) 를 붙임. Upstash DB 는 그대로 하나, 논리적으로만 완전 격리.
// src/utils/redis-key.ts (신규)
const REDIS_KEY_NS = process.env.NODE_ENV === 'production' ? 'prod:' : 'dev:';
export const k = (key: string): string => `${REDIS_KEY_NS}${key}`;
각 caller 에서 키 생성 지점 (상수 정의 or 인라인 구성) 을 k(...) 로 감쌈. redisClient.* 호출 자체는 변경 없음.
✨ 개발 목록
✨ 기타
- Redis 안의 기존 (prefix 없는) 키들은 만료 (HLL 400d, 캐시 짧게) 되면 자연 소멸. 즉시 정리하려면
SCAN + DEL 필요하지만 오염 위험 크지 않아 방치 가능.
- 이 PR 배포 즉시 방문자 카운트는 새 prefix 로 시작 → dev/prod 각자 카운트 별도 누적. 기존 공용 키의 카운트는 참조 불가.
- 향후 유료 이전 / 계정 분리로 DB 를 실제로 나눠도 prefix 는 그대로 남겨두면 무해. 롤백 리스크 낮음.
✨ 배경
Upstash 프리티어는 계정당 DB 1개 제한. 현재
.env(prod) 와.env.dev가 동일 Upstash DB 를 공유하고 있어 두 환경의 Redis 데이터가 뒤섞임.✨ 문제
같은 DB 를 공유하는 이상 격리 없이는 다음 문제가 상시 존재:
visitors:hll:YYYY-MM-DD키가 prod/dev 공용.GET /api/admin/stats/visitors응답이 두 환경 트래픽 합산으로 나옴.CYCLE_LOCK_KEY(settlement-payout),SYNC_LOCK_KEY(settlement-sync) 를 두 환경 cron 이 서로 뺏음. 한쪽이 락 잡으면 다른쪽 cron 이 스킵.payple-billing/payple-refund/payple-settlement의AUTH_CACHE_KEY가 공유. prod 데모/실서비스 토큰이 dev 요청에 반환될 위험.register-token블랙리스트 공유 — 결제 리다이렉트 토큰 blacklist 가 섞임.user-activitythrottle,payple카운터 등도 공용.✨ 해결 방향
process.env.NODE_ENV기반으로 모든 Redis 키에 자동 prefix (prod:/dev:) 를 붙임. Upstash DB 는 그대로 하나, 논리적으로만 완전 격리.각 caller 에서 키 생성 지점 (상수 정의 or 인라인 구성) 을
k(...)로 감쌈.redisClient.*호출 자체는 변경 없음.✨ 개발 목록
src/utils/redis-key.ts헬퍼 추가src/utils/visitor-tracking.ts—buildHllKey결과에 prefixsrc/utils/user-activity.ts— throttle 키에 prefixsrc/settlements/utils/register-token.ts— blacklist 키에 prefixsrc/settlements/utils/payple.ts— 카운터/락 키에 prefixsrc/settlements/utils/payple-billing.ts— auth cache 키에 prefixsrc/settlements/utils/payple-refund.ts— auth cache 키에 prefixsrc/settlements/utils/payple-settlement.ts— auth cache 키에 prefixsrc/settlements/services/settlement-payout.service.ts—CYCLE_LOCK_KEY에 prefixsrc/settlements/services/settlement-sync.service.ts—SYNC_LOCK_KEY/ lastKey 키에 prefixpnpm build통과✨ 기타
SCAN + DEL필요하지만 오염 위험 크지 않아 방치 가능.