Redis key 네이밍 컨벤션 - 계층적 구조로 관리하기
문제
Redis key를 "user_123_session", "sess-user-123" 같이 제각각으로 만들다 보니 어떤 키가 있는지 파악이 안 되고, KEYS * 검색도 어렵다.
해결
const KEY_PREFIX = 'myapp';
export const keys = {
// 대화: myapp:conv:{id}
conversation: (id: string) => `${KEY_PREFIX}:conv:${id}`,
conversationMessages: (id: string) => `${KEY_PREFIX}:conv:${id}:messages`,
// 사용자: myapp:user:{id}
userSettings: (id: string) => `${KEY_PREFIX}:settings:${id}`,
userSession: (id: string) => `${KEY_PREFIX}:session:${id}`,
// 인덱스: myapp:conversations (전체 목록)
allConversations: () => `${KEY_PREFIX}:conversations`,
monthlyIndex: (ym: string) => `${KEY_PREFIX}:conv:month:${ym}`,
// 캐시: myapp:cache:{entity}:{id}
cacheProduct: (id: string) => `${KEY_PREFIX}:cache:product:${id}`,
};
// 사용
await redis.set(keys.conversation('abc123'), JSON.stringify(data));
await redis.del(keys.userSession('user1'));
핵심 포인트
- 콜론(
:)으로 계층을 구분하는 게 Redis 커뮤니티의 표준이다. RedisInsight 같은 GUI 도구가 이 구조를 트리로 보여준다. - 함수로 키를 생성하면 오타가 없고, IDE 자동완성이 된다. 문자열 리터럴을 직접 쓰면 나중에 리팩토링이 불가능하다.
- 접두사(
KEY_PREFIX)가 있으면 같은 Redis 인스턴스에서 여러 앱이 키 충돌 없이 공존할 수 있다.