본문 바로가기
개발/devOps

Redis Key Naming: 성능과 유지보수를 동시에 잡는 방법(실전 개발자의 필수 가이드) 🎯

by coking 2024. 11. 23.

들어가며

Redis를 처음 접하면 많은 분들이 이렇게 생각하시죠.
"그냥 데이터 넣고 빼면 되는 거 아냐? 키 이름이 뭐가 중요해?"

하지만 실제 프로덕션 환경에서는 조금 다릅니다. 수천, 수만 개의 키가 쌓이기 시작하면... 😱
잘 설계된 키 네이밍은 여러분의 구원자가 될 수 있습니다!

이런 경험 있으신가요? 🤔

# 어느 날 갑자기 마주친 Redis 키들
u1
temp_data_15
x_55_info
mysterious_key_123

이런 키들이 수백 개라면? 디버깅할 때 눈물이 앞을 가릴 겁니다...
자, 이제 제대로 된 키 네이밍 전략을 알아볼까요?

Redis Key 설계의 황금률 ⭐️

1. 계층 구조를 활용하세요

// 기본 패턴
`object-type:id:field`

// 예시
`user:1001:profile`
`product:5001:details`

2. 데이터의 성격을 명확히 하세요

// 임시 데이터
`temp:verification:user:1001`  // 24시간 후 삭제될 인증 코드

// 영구 데이터
`user:1001:profile`  // 사용자 프로필 정보

3. 검색이 용이하게 만드세요

// 특정 서비스의 모든 키를 찾기 쉽게
`service:shopping:*`  // SCAN 명령어로 쉽게 찾을 수 있음

실전 활용 예시 (현직 개발자의 노하우) 💡

1. 전자상거래 시스템

// 상품 정보 관리
const productKeys = {
  details: (id: string) => `product:${id}:info`,    // 상품 기본 정보
  stock: (id: string) => `product:${id}:stock`,     // 재고 정보
  price: (id: string) => `product:${id}:price`,     // 가격 이력
}

// 장바구니 관리
const cartKeys = {
  items: (userId: string) => `cart:user:${userId}:items`,   // 장바구니 아이템
  total: (userId: string) => `cart:user:${userId}:total`,   // 총 금액
}

2. 실시간 분석 시스템

// 일별 통계 데이터
const statsKeys = {
  daily: (date: string, metric: string) => `stats:daily:${date}:${metric}`,
  hourly: (date: string, hour: string, metric: string) => 
    `stats:hourly:${date}:${hour}:${metric}`
}

// 실시간 카운터
const counterKeys = {
  likes: (postId: string) => `counter:likes:post:${postId}`,
  views: (videoId: string) => `counter:views:video:${videoId}`
}

실제 구현 예시 (현업에서 바로 쓰는 코드) 🔥

class RedisKeyManager {
  private readonly prefix: string;

  constructor(service: string) {
    this.prefix = `service:${service}`;  // 서비스별 구분을 위한 prefix
  }

  // 사용자 관련 키
  user = {
    profile: (userId: string) => 
      `${this.prefix}:user:${userId}:profile`,

    sessions: (userId: string) => 
      `${this.prefix}:user:${userId}:sessions`,

    cart: (userId: string) => 
      `${this.prefix}:user:${userId}:cart`
  }

  // 상품 관련 키
  product = {
    info: (productId: string) => 
      `${this.prefix}:product:${productId}:info`,

    stock: (productId: string) => 
      `${this.prefix}:product:${productId}:stock`
  }

  // 통계 관련 키
  stats = {
    daily: (metric: string, date: string) => 
      `${this.prefix}:stats:daily:${date}:${metric}`,

    realtime: (metric: string) => 
      `${this.prefix}:stats:realtime:${metric}`
  }
}

// 사용 예시
const shopKeys = new RedisKeyManager('shop');

// 사용자 프로필 키
console.log(shopKeys.user.profile('1001'));  
// => "service:shop:user:1001:profile"

// 상품 재고 키
console.log(shopKeys.product.stock('5001'));  
// => "service:shop:product:5001:stock"

실전 꿀팁 🍯

  1. 서비스 규모별 전략

    • 소규모: 단순한 키 구조로 시작
    • 중규모: 계층화된 키 구조 도입
    • 대규모: 서비스별 prefix 추가
  2. 성능 고려사항

    • 너무 긴 키 이름은 메모리 낭비
    • 너무 짧으면 의미 파악 어려움
    • 적절한 길이: 20-40자 내외
  3. 협업 시 주의사항

    • 팀 내 네이밍 컨벤션 문서화
    • 주석으로 키 사용 목적 명시
    • 정기적인 키 패턴 리뷰

마치며 ✨

Redis 키 네이밍은 작은 차이가 큰 결과를 만듭니다.
지금 당장은 번거롭게 느껴질 수 있지만, 이런 체계적인 접근이 여러분의 프로젝트를 한 단계 더 성장시킬 것입니다.

"좋은 설계는 한번의 수고로움, 나쁜 설계는 영원한 고통" - 개발자 명언


도움이 되셨다면 좋아요와 공유 부탁드립니다! 💕
궁금한 점은 댓글로 남겨주세요.

댓글