@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 <<PK>>
        --
        **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<String, Integer>
          - 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 <<PK>>
        --
        status: ENUM <<NOT NULL>>
          - 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 <<PK>>
          (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
