# πŸ— μ‹œμŠ€ν…œ μ•„ν‚€ν…μ²˜ 이 λ¬Έμ„œλŠ” ν”„λ‘œμ νŠΈμ˜ 기술적 ꡬ쑰, 데이터 흐름, 핡심 λ‘œμ§μ„ μ„€λͺ…ν•©λ‹ˆλ‹€. ## πŸ“‹ λͺ©μ°¨ 1. [전체 μ•„ν‚€ν…μ²˜](#전체-μ•„ν‚€ν…μ²˜) 2. [λ©”μ‹œμ§€ 처리 흐름](#λ©”μ‹œμ§€-처리-흐름) 3. [μ‚¬μš©μž ν”„λ‘œν•„ μ‹œμŠ€ν…œ](#μ‚¬μš©μž-ν”„λ‘œν•„-μ‹œμŠ€ν…œ) 4. [예치금 μ‹œμŠ€ν…œ 둜직](#예치금-μ‹œμŠ€ν…œ-둜직) 5. [ν”„λ‘œμ νŠΈ ꡬ쑰](#ν”„λ‘œμ νŠΈ-ꡬ쑰) 6. [λ³΄μ•ˆ](#λ³΄μ•ˆ) --- ## 전체 μ•„ν‚€ν…μ²˜ Cloudflare μ—μ½”μ‹œμŠ€ν…œμ„ 기반으둜 ν•œ μ„œλ²„λ¦¬μŠ€ κ΅¬μ‘°μž…λ‹ˆλ‹€. | μ»΄ν¬λ„ŒνŠΈ | 기술 μŠ€νƒ | μ—­ν•  | |----------|-----------|------| | **Runtime** | Cloudflare Workers | 메인 둜직 μ‹€ν–‰, μ›Ήν›… 처리 | | **Database** | Cloudflare D1 (SQLite) | μ‚¬μš©μž, λŒ€ν™” μš”μ•½, 예치금 데이터 μ €μž₯ | | **Cache/RateLimit** | Cloudflare KV | API μš”μ²­ μ œν•œ, 단기 데이터 캐싱 | | **AI** | OpenAI API (GPT-4o-mini) | μžμ—°μ–΄ 처리, 도ꡬ 호좜(Function Calling) | | **Email** | Cloudflare Email Workers | 은행 SMS(이메일) μˆ˜μ‹  및 νŒŒμ‹± | --- ## λ©”μ‹œμ§€ 처리 흐름 ```mermaid graph TD User[μ‚¬μš©μž] -->|Message| Telegram Telegram -->|Webhook| Worker[Cloudflare Worker] Worker -->|1. Validate| Security[Security Check] Worker -->|2. Buffer| D1[Message Buffer] Worker -->|3. AI Request| OpenAI[OpenAI API] OpenAI -->|Function Call?| Tools[Tool Execution] Tools -->|Result| OpenAI OpenAI -->|Response| Worker Worker -->|Reply| Telegram Worker -->|4. Profile Update?| SummaryService ``` 1. **검증**: `X-Telegram-Bot-Api-Secret-Token`을 ν†΅ν•œ μš”μ²­ 인증 2. **버퍼링**: μ‚¬μš©μž λ©”μ‹œμ§€λ₯Ό D1 `message_buffer` ν…Œμ΄λΈ”μ— μž„μ‹œ μ €μž₯ 3. **AI 처리**: μ»¨ν…μŠ€νŠΈμ™€ ν•¨κ»˜ OpenAI 호좜. ν•„μš” μ‹œ 도ꡬ(날씨, 도메인 λ“±) μ‹€ν–‰ 4. **μš”μ•½**: λ©”μ‹œμ§€κ°€ 일정 수(예: 20개) μŒ“μ΄λ©΄ λ°±κ·ΈλΌμš΄λ“œμ—μ„œ ν”„λ‘œν•„ μš”μ•½ μ‹€ν–‰ --- ## μ‚¬μš©μž ν”„λ‘œν•„ μ‹œμŠ€ν…œ (Rolling Summary) 토큰 λΉ„μš©μ„ μ ˆμ•½ν•˜λ©΄μ„œ λ¬΄ν•œν•œ λŒ€ν™” λ§₯락을 μœ μ§€ν•˜κΈ° μœ„ν•΄ **μŠ¬λΌμ΄λ”© μœˆλ„μš°** 방식을 μ‚¬μš©ν•©λ‹ˆλ‹€. ``` [λ©”μ‹œμ§€ 버퍼] (0~19개) β”‚ β–Ό 20개 도달 μ‹œ [톡합 뢄석 μ‹€ν–‰] β”‚ ← κΈ°μ‘΄ μš”μ•½λ³Έ 3개 + μƒˆ λ©”μ‹œμ§€ 20개 β–Ό [μƒˆλ‘œμš΄ μš”μ•½ 생성] β”‚ β–Ό [Summaries ν…Œμ΄λΈ”] (μ΅œμ‹  3개만 μœ μ§€) [v4 (New)] [v3] [v2] ... (v1 μ‚­μ œ) ``` 이 방식은 λ‹¨μˆœνžˆ λŒ€ν™”λ₯Ό μš”μ•½ν•˜λŠ” 것을 λ„˜μ–΄, μ‚¬μš©μžμ˜ **관심사, 말투, μ£Όμš” 정보**λ₯Ό μΆ”μΆœν•˜μ—¬ ν”„λ‘œν•„ν™”ν•©λ‹ˆλ‹€. --- ## 예치금 μ‹œμŠ€ν…œ 둜직 μ‚¬μš©μž 신고와 은행 μ•Œλ¦Ό(SMS)을 μ–‘λ°©ν–₯으둜 λ§€μΉ­ν•˜μ—¬ λˆ„λ½ μ—†λŠ” μž…κΈˆ 처리λ₯Ό 보μž₯ν•©λ‹ˆλ‹€. ### 데이터 λͺ¨λΈ - **`bank_notifications`**: 은행 SMS νŒŒμ‹± 데이터 (Raw Data) - **`deposit_transactions`**: μ‚¬μš©μž μž…κΈˆ μš”μ²­ (Pending/Confirmed) - **`user_deposits`**: μ‚¬μš©μžλ³„ μž”μ•‘ ### λ§€μΉ­ ν”„λ‘œμ„ΈμŠ€ 1. **μ‚¬μš©μž μ‹ κ³  μ‹œ**: `bank_notifications`μ—μ„œ 동일 κΈˆμ•‘/μž…κΈˆμžλͺ…μ˜ 미처리 건 검색 β†’ 있으면 μ¦‰μ‹œ 승인 2. **SMS μˆ˜μ‹  μ‹œ**: `deposit_transactions`μ—μ„œ `pending` μƒνƒœμ˜ μš”μ²­ 검색 β†’ 있으면 μ¦‰μ‹œ 승인 3. **λ§€μΉ­ μ‹€νŒ¨ μ‹œ**: 각각 λŒ€κΈ° μƒνƒœλ‘œ μ €μž₯λ˜μ–΄, μΆ”ν›„ μƒλŒ€λ°© 데이터가 λ“€μ–΄μ˜€λ©΄ 맀칭됨 --- ## ν”„λ‘œμ νŠΈ ꡬ쑰 ``` src/ β”œβ”€β”€ index.ts # μ—”νŠΈλ¦¬ν¬μΈνŠΈ (Router) β”œβ”€β”€ security.ts # λ³΄μ•ˆ (Webhook 검증, Rate Limit) β”œβ”€β”€ commands.ts # λͺ…λ Ήμ–΄ ν•Έλ“€λŸ¬ (/start, /reset λ“±) β”œβ”€β”€ routes/ # 라우트 ν•Έλ“€λŸ¬ (Webhook, API) β”œβ”€β”€ services/ # λΉ„μ¦ˆλ‹ˆμŠ€ 둜직 β”‚ β”œβ”€β”€ conversation-service.ts # λŒ€ν™” 및 AI 처리 β”‚ β”œβ”€β”€ user-service.ts # μ‚¬μš©μž 관리 β”‚ β”œβ”€β”€ summary-service.ts # ν”„λ‘œν•„ μš”μ•½ β”‚ β”œβ”€β”€ bank-sms-parser.ts # SMS νŒŒμ‹± (Regex + AI) β”‚ └── ... β”œβ”€β”€ tools/ # Function Calling 도ꡬ듀 β”‚ β”œβ”€β”€ domain-tool.ts β”‚ β”œβ”€β”€ deposit-tool.ts β”‚ └── ... └── utils/ # μœ ν‹Έλ¦¬ν‹° (Logger, Retry λ“±) ``` --- ## λ³΄μ•ˆ 1. **Webhook Secret**: 타이밍 곡격 λ°©μ§€ 비ꡐ(Timing-safe comparison) 적용 2. **Rate Limiting**: KVλ₯Ό μ‚¬μš©ν•˜μ—¬ μ‚¬μš©μžλ³„ λΆ„λ‹Ή μš”μ²­ 수 μ œν•œ 3. **API Key 관리**: λͺ¨λ“  ν‚€λŠ” `wrangler secret` λ˜λŠ” Vaultλ₯Ό 톡해 κ΄€λ¦¬λ˜λ©° μ½”λ“œμ— λ…ΈμΆœλ˜μ§€ μ•ŠμŒ 4. **SQL Injection λ°©μ§€**: D1의 PreparedStatement (`bind`) μ‚¬μš©