@startuml !theme mono title AI Service 캐시 데이터 구조도 (Redis) ' ===== Redis 캐시 구조 ===== package "Redis Cache" { ' AI 추천 결과 캐시 entity "ai:recommendation:{eventId}" as recommendation_cache { **캐시 키**: ai:recommendation:{eventId} -- TTL: 3600초 (1시간) == eventId: UUID <> -- **trendAnalysis** industryTrends: JSON Array - keyword: String - relevance: Double - description: String regionalTrends: JSON Array seasonalTrends: JSON Array -- **recommendations**: JSON Array - optionNumber: Integer - concept: String - title: String - description: String - targetAudience: String - duration: JSON Object * recommendedDays: Integer * recommendedPeriod: String - mechanics: JSON Object * type: ENUM (DISCOUNT, GIFT, STAMP, etc.) * details: String - promotionChannels: String Array - estimatedCost: JSON Object * min: Integer * max: Integer * breakdown: Map - expectedMetrics: JSON Object * newCustomers: {min, max} * revenueIncrease: {min, max} * roi: {min, max} - differentiator: String -- generatedAt: Timestamp expiresAt: Timestamp aiProvider: ENUM (CLAUDE, GPT_4) } ' 작업 상태 캐시 entity "ai:job:status:{jobId}" as job_status_cache { **캐시 키**: ai:job:status:{jobId} -- TTL: 86400초 (24시간) == jobId: UUID <> -- status: ENUM <> - PENDING - PROCESSING - COMPLETED - FAILED progress: Integer (0-100) message: String createdAt: Timestamp } ' 트렌드 분석 캐시 entity "ai:trend:{industry}:{region}" as trend_cache { **캐시 키**: ai:trend:{industry}:{region} -- TTL: 86400초 (24시간) == cacheKey: String <> (industry + region 조합) -- **industryTrends**: JSON Array - keyword: String - relevance: Double (0.0-1.0) - description: String **regionalTrends**: JSON Array - keyword: String - relevance: Double - description: String **seasonalTrends**: JSON Array - keyword: String - relevance: Double - description: String } } ' ===== 캐시 관계 설명 ===== note right of recommendation_cache **AI 추천 결과 캐시** - Event Service에서 이벤트 ID로 조회 - 캐시 미스 시 AI API 호출 후 저장 - 1시간 TTL로 최신 트렌드 반영 - JSON 형식으로 직렬화 저장 end note note right of job_status_cache **작업 상태 캐시** - Kafka 메시지 수신 후 생성 - 비동기 작업 진행 상황 추적 - 24시간 TTL로 이력 보관 - Progress: 0(시작) → 100(완료) end note note right of trend_cache **트렌드 분석 캐시** - 업종/지역 조합으로 캐싱 - AI API 호출 비용 절감 - 24시간 TTL로 일간 트렌드 반영 - 추천 생성 시 재사용 end note ' ===== 캐시 의존 관계 ===== recommendation_cache ..> trend_cache : "uses\n(트렌드 데이터 참조)" job_status_cache ..> recommendation_cache : "tracks\n(추천 생성 작업 상태)" ' ===== 외부 시스템 참조 ===== package "External References" { entity "Event Service" as event_service { eventId: UUID -- (외부 서비스) } entity "Kafka Topic" as kafka_topic { ai-job-request -- jobId: UUID eventId: UUID } } event_service ..> recommendation_cache : "요청\n(GET /recommendation/{eventId})" kafka_topic ..> job_status_cache : "생성\n(비동기 작업 시작)" ' ===== 캐시 키 패턴 설명 ===== note bottom of recommendation_cache **캐시 키 예시** ai:recommendation:123e4567-e89b-12d3-a456-426614174000 **캐싱 전략**: Cache-Aside 1. 캐시 조회 시도 2. 미스 시 AI API 호출 3. 결과를 캐시에 저장 4. TTL 만료 시 자동 삭제 end note note bottom of trend_cache **캐시 키 예시** ai:trend:음식점:강남구 ai:trend:카페:성동구 **데이터 구조** - 업종별 주요 트렌드 키워드 - 지역별 소비 패턴 - 계절별 선호도 - 각 트렌드의 관련도 점수 end note ' ===== Redis 설정 정보 ===== legend right **Redis 캐시 설정** |항목|설정값| |호스트|${REDIS_HOST:localhost}| |포트|${REDIS_PORT:6379}| |타임아웃|3000ms| |최대 연결|8| **만료 정책** - 추천 결과: 1시간 (실시간성) - 작업 상태: 24시간 (이력 보관) - 트렌드: 24시간 (일간 갱신) **메모리 관리** - 만료 정책: volatile-lru - 최대 메모리: 1GB - 예상 사용량: 추천 50KB, 상태 1KB, 트렌드 10KB end legend @enduml