# ๊ณจ๋”” ๐Ÿ“’ โ€” ์—…๋ฌด ๋ธŒ๋ฆฌํ•‘ > ๊ด€๋ฆฌ์ž๋‹˜๊ป˜ ๋“œ๋ฆฌ๋Š” ๊ณจ๋”” ์šด์˜ ํ˜„ํ™ฉ ๋ณด๊ณ ์„œ์ž…๋‹ˆ๋‹ค. **๊ณจ๋””๋Š” ์ด ๋ฌธ์„œ๋ฅผ ์ฝ์ง€ ์•Š์Šต๋‹ˆ๋‹ค** โ€” ๊ด€๋ฆฌ์ž๋‹˜์ด ๊ทธ๋™์•ˆ ๊ณจ๋””์—๊ฒŒ ์‹œ์ผœ๋‘” ์—…๋ฌดยท๊ทœ์น™์„ ๋ณธ์ธ์ด ํ•œ๋ˆˆ์— ํ™•์ธยท์ ๊ฒ€ํ•˜๊ธฐ ์œ„ํ•œ ๋ฌธ์„œ์ž…๋‹ˆ๋‹ค. ์ƒˆ ์ง€์‹œยท๊ธฐ์กด ์ง€์‹œ ๋ณ€๊ฒฝ์ด ์žˆ์„ ๋•Œ๋งŒ ๊ฐฑ์‹ ํ•ฉ๋‹ˆ๋‹ค. > ๋งˆ์ง€๋ง‰ ๊ฐฑ์‹ : 2026-05-26 --- ## ํ•œ๋ˆˆ์— ๋ณด๊ธฐ ๊ณจ๋””๋Š” ๊ฐ€๊ณ„๋ถ€ ์ž๋™ ์ž…๋ ฅยท์ •๋ฆฌ๋ฅผ ์ฑ…์ž„์ง€๋Š” ์—์ด์ „ํŠธ์ž…๋‹ˆ๋‹ค. ์ง€๊ธˆ ์šด์˜ ์ค‘์ธ ์ผ์„ ํฐ ๊ฐˆ๋ž˜๋กœ ๋ณด๋ฉด ๋„ค ์ข…๋ฅ˜์ž…๋‹ˆ๋‹ค. 1. **์ž๋™์œผ๋กœ ๋„๋Š” ์—…๋ฌด ์„ธ ๊ฐ€์ง€** โ€” ๊ฒฐ์ œ๋ฌธ์ž ํ›„์ž‰ ๋™๊ธฐํ™”(๋งค์‹œ 4๋ฒˆ), ๊ฐ€ํฌ ์ž”์•ก ๋ฆฌ๋งˆ์ธ๋”(๋งค์›” 25์ผ), ์›”๊ฐ„ ๊ฒฐ์‚ฐ(๋งค์›” 1์ผ) 2. **์ˆ˜๋™์œผ๋กœ ๋ถ€๋ฅผ ์ˆ˜ ์žˆ๋Š” ๋ช…๋ น ์—ฌ๋Ÿ ๊ฐ€์ง€** โ€” ์ˆ˜๋™ ๋ถ„๊ฐœยท์ž”์•ก ์กฐํšŒยทrule ํŽธ์ง‘ ๋“ฑ 3. **ํ…”๋ ˆ๊ทธ๋žจ ์ž์—ฐ์–ด ๋Œ€ํ™”** โ€” ๊ณจ๋”” ๋ด‡์—๊ฒŒ "์ž”์•ก ์•Œ๋ ค์ค˜" "โ—‹โ—‹ ๋“ฑ๋กํ•ด์ค˜" ์‹์œผ๋กœ ๋ง ๊ฑธ๋ฉด ์•Œ์•„์„œ ์ฒ˜๋ฆฌ 4. **์ž๋™ ์•Œ๋ฆผ ๋‹ค์„ฏ ์ข…** โ€” ํ›„์ž‰์ด ๋ถ„๊ฐœ๋ฅผ ๊ฑฐ์ ˆํ–ˆ๊ฑฐ๋‚˜, ์ž๋™ ๋ถ„๊ฐœ ๋ณด์ •์ด ๋ฐœ๋™ํ–ˆ๊ฑฐ๋‚˜, ๊ฐ€ํฌ๋‹˜ ๋‹ต์‹ ์ด ์™”์„ ๋•Œ ๊ณจ๋””๊ฐ€ ๋จผ์ € ํ…”๋ ˆ๊ทธ๋žจ์œผ๋กœ ๋ง ๊ฑธ์–ด์˜ด ์ด ์ค‘ ๊ฐ€์žฅ ํฐ ์ž๋™ ์—…๋ฌด์ธ ๊ฒฐ์ œ๋ฌธ์ž ๋™๊ธฐํ™” ์•ˆ์—๋Š” ๋‹ค์„ฏ ๊ฐœ์˜ ์šฐ์„  ๋ฃฐ(์ •๊ธฐ๊ฒฐ์ œ ๋ถ„๊ฐœ)๊ณผ ๋„ค ๊ฐœ์˜ ์ž๋™ ๋ณด์ • ๋กœ์ง(์ž”์•ก ์ฐจ์ด๋กœ ๋ˆ„๋ฝ๋ถ„ ๋ถ„๊ฐœ)์ด ๋ฌปํ˜€ ๋Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜์— ์ฐจ๋ก€๋กœ ํ’€์–ด ์„ค๋ช…๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค. --- ## 1. ์ž๋™์œผ๋กœ ๋„๋Š” ์—…๋ฌด ### 1-1. ๊ฒฐ์ œ๋ฌธ์ž๋ฅผ ํ›„์ž‰์œผ๋กœ ์ž๋™ ์˜ฎ๊ธฐ๋Š” ์ผ #### ์–ธ์ œ ์–ด๋–ป๊ฒŒ ๋„๋Š”๊ฐ€ ๋งค์‹œ **0๋ถ„ยท15๋ถ„ยท30๋ถ„ยท45๋ถ„**์— macOS launchd๊ฐ€ `whooing_sync.py`๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰ ํ•œ ์‹œ๊ฐ„์— ๋„ค ๋ฒˆ, ํ•˜๋ฃจ 96๋ฒˆ ๋•๋‹ˆ๋‹ค. LLM ์„ธ์…˜์„ ๋ถ€ํŒ…ํ•˜์ง€ ์•Š๊ณ  ํŒŒ์ด์ฌ ์Šคํฌ๋ฆฝํŠธ๋งŒ ์‹คํ–‰ํ•˜๋Š” ๊ฐ€๋ฒผ์šด ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค โ€” ๊ณผ๊ฑฐ์—๋Š” OpenClaw cron(LLM ๊ฒฝ์œ )์œผ๋กœ ๋Œ๋ ธ์ง€๋งŒ ๋งค ์‹คํ–‰๋งˆ๋‹ค ์„ธ์…˜์„ ๋„์›Œ ํ† ํฐ ๋น„์šฉ์ด ์›” 7์ฒœ๋งŒ ํ† ํฐ๊นŒ์ง€ ์˜ฌ๋ผ๊ฐ„ ์ ์ด ์žˆ์–ด์„œ, 2026๋…„ 4์›” 24์ผ์— launchd ๋‹จ๋… ์šด์˜์œผ๋กœ ๋ฐ”๊ฟจ์Šต๋‹ˆ๋‹ค. ๊ทธ OpenClaw cron ์žก์€ `enabled:false`๋กœ ๋ฐ•์ œํ•ด๋’€๊ณ  ๋‹ค์‹œ ํ™œ์„ฑํ™”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. #### ๋ฌด์—‡์„ ํ•˜๋Š”๊ฐ€ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ํ•˜๋Š” ์ผ์€ ๋‹ค์„ฏ ๋‹จ๊ณ„๋กœ ์ •๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. **(1) iMessage DB์—์„œ ๊ฒฐ์ œ SMS ์ˆ˜์ง‘.** `imsg` CLI๋ฅผ ํ†ตํ•ด `~/Library/Messages/chat.db`๋ฅผ ์ฝ์–ด ์นด๋“œ์‚ฌยท์€ํ–‰ ๋ฐœ์‹ ๋ฒˆํ˜ธ์—์„œ ์˜จ ๋ฉ”์‹œ์ง€๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ์–ด๋–ค ๋ฐœ์‹ ๋ฒˆํ˜ธ๋ฅผ ์‹ ๋ขฐํ• ์ง€๋Š” `state/whooing_account_map.json`์— ๋งคํ•‘๋ผ ์žˆ๊ณ , ์ด ์ค‘ `confirmed:true`์ธ ๋ฒˆํ˜ธ๋งŒ ์ž๋™ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค. ํ™•์ธ ์•ˆ ๋œ ๋ฒˆํ˜ธ(์˜ˆ: ์ƒˆ๋กœ ๋“ฑ๋ก๋œ ์นด๋“œ์‚ฌ)๋Š” ํ•œ ๋ฒˆ ๋“ค์–ด์™”์„ ๋•Œ unmapped ๋กœ๊ทธ๋งŒ ๋‚จ๊ธฐ๊ณ  ์ž๋™ ์ „์†ก์€ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. **(2) ๊ฐ™์€ ๊ธˆ์•ก ์ž…โ†”์ถœ SMS๋ฅผ 5๋ถ„ ์•ˆ์— ์ง์ง€์–ด ์ด์ฒด๋กœ ํ•ฉ์„ฑ (ํŽ˜์–ด ๋งค์นญ).** ๋ณธ์ธ ๊ณ„์ขŒ ์‚ฌ์ด์—์„œ ๋ˆ์„ ์˜ฎ๊ธฐ๋ฉด ์นด๋“œ์‚ฌยท์€ํ–‰์ด ์–‘์ชฝ์—์„œ ๊ฐ๊ฐ SMS๋ฅผ ๋ณด๋‚ด๋Š”๋ฐ, ๊ทธ๊ฑธ ๊ทธ๋Œ€๋กœ ๋‘ ๊ฑด์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋ฉด ๊ฐ€๊ณ„๋ถ€์— ๊ฐ™์€ ๋ˆ์ด ๋‘ ๋ฒˆ ์žกํž™๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ 5๋ถ„ ์œˆ๋„์šฐ ์•ˆ์— ๊ฐ™์€ ๊ธˆ์•ก์˜ ์ž…๊ธˆยท์ถœ๊ธˆ SMS๊ฐ€ ์ง์ง€์–ด์ง€๋ฉด 1๊ฑด์˜ ์ž์‚ฐโ†”์ž์‚ฐ ์ด์ฒด๋กœ ํ•ฉ์„ฑํ•ด์„œ ๋ณด๋ƒ…๋‹ˆ๋‹ค. ์ง์„ ๋ชป ์ง  ์ž…์ถœ๊ธˆ์ด 5๋ถ„ ์ด๋‚ด๋ฉด hold ์ƒํƒœ๋กœ ๋‘๊ณ  ๋‹ค์Œ ์‚ฌ์ดํด์— ๋‹ค์‹œ ์ง์ง“๊ธฐ๋ฅผ ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค. **(3) ์šฐ์„  ๋ฃฐ ์ ์šฉ.** `state/whooing_overrides.json`์— ๋“ฑ๋ก๋œ ์ •๊ธฐ๊ฒฐ์ œยท์‹œ๊ฐ„๋Œ€ ๋ฃฐ์„ ์œ„์—์„œ ์•„๋ž˜๋กœ ํ‰๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์ฒซ ๋งค์นญ ๋ฃฐ์˜ ๋ถ„๊ฐœ ํ˜•์‹์œผ๋กœ ํ›„์ž‰์— ๋ณด๋ƒ…๋‹ˆ๋‹ค. ํ˜„์žฌ ๋‹ค์„ฏ ๊ฐœ๊ฐ€ ๋“ฑ๋ก๋ผ ์žˆ๋Š”๋ฐ, ๋‹ค์Œ ์ ˆ(1-2)์—์„œ ํ’€์–ด ์„ค๋ช…๋“œ๋ฆฝ๋‹ˆ๋‹ค. **(4) ๊ฐ€๋งน์  ๋งคํ•‘.** ์šฐ์„  ๋ฃฐ์— ์žกํžˆ์ง€ ์•Š์œผ๋ฉด `state/whooing_merchant_map.json`์˜ exactยทcontains ๋ฃฐ์„ ํ‰๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ: "์Šคํƒ€๋ฒ…์Šค" โ†’ ์‹๋น„. **(5) ๋ชจ๋ฅด๋ฉด "๊ธฐํƒ€๋น„์šฉ"์œผ๋กœ ๋ถ„๊ฐœ (default fallback).** ์šฐ์„  ๋ฃฐ๋„ ๊ฐ€๋งน์  ๋งคํ•‘๋„ ๋งค์นญ์ด ์—†์œผ๋ฉด `๊ธฐํƒ€๋น„์šฉ โ† {๊ฒฐ์ œ์ˆ˜๋‹จ}`์œผ๋กœ ์ž๋™ ๋ถ„๊ฐœํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฑด 2026-04-24์— ๊ด€๋ฆฌ์ž๋‹˜์ด ๊ฒฐ์ •ํ•˜์‹  ์ •์ฑ…์ž…๋‹ˆ๋‹ค. ๋ชจ๋ฅด๋Š” ์ธ๋ช… ์†ก๊ธˆ์ด ๋“ค์–ด์™”๋‹ค๊ณ  ํ•ด์„œ `๋ฐ•์˜์ถ˜ โ†’ ์‹๋น„` ๊ฐ™์€ exact ๋ฃฐ์„ ๋Š˜๋ฆฌ์ง€ ๋ง๊ณ , ์ผ๋‹จ ๊ธฐํƒ€๋น„์šฉ์œผ๋กœ ๋–จ์–ด๋œจ๋ฆฐ ๋‹ค์Œ ํ›„์ž‰ UI์—์„œ ์‚ฌํ›„ ์นดํ…Œ๊ณ ๋ฆฌ ์ด๋™ํ•˜๋ผ๋Š” ์›์น™์ž…๋‹ˆ๋‹ค. ๋‹จ ์ž…๊ธˆ(`deposit`) ์ข…๋ฅ˜๋Š” ์ด fallback ์—†์ด raw ํด๋ฐฑ์œผ๋กœ ๊ฐ‘๋‹ˆ๋‹ค โ€” ์ˆ˜์ตยท์ด์ฒดยทํ™˜๊ธ‰์„ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์–ด๋ ต๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ทธ ์™ธ์— SMS ์ž”์•ก๊ณผ ํ›„์ž‰ ์ž”์•ก ์ฐจ์ด๋กœ ์ž๋™ ๋ณด์ •ํ•˜๋Š” ๋กœ์ง ๋„ค ๊ฐ€์ง€๊ฐ€ ๋งค ์‚ฌ์ดํด ํ•จ๊ป˜ ๋•๋‹ˆ๋‹ค. ์ด๊ฑด 1-3์ ˆ์—์„œ ๋”ฐ๋กœ ํ’€์–ด ์„ค๋ช…๋“œ๋ฆฝ๋‹ˆ๋‹ค. #### ๊ด€๋ฆฌ์ž๋‹˜์ด ์‹œํ‚จ ํ•ต์‹ฌ ๊ทœ์น™ - **OpenClaw cron์œผ๋กœ ๋˜๋Œ๋ฆฌ์ง€ ๋ง ๊ฒƒ.** ๋งค ์‹คํ–‰ LLM ํ† ํฐ ๋น„์šฉ์ด ๋„ˆ๋ฌด ํผ. - **ํ…”๋ ˆ๊ทธ๋žจ ์•Œ๋ฆผ์— SMS ์›๋ฌธ์„ ๋ฐ•์ง€ ๋ง ๊ฒƒ.** 2026-05-10์— ํ•œ ๋ฒˆ ๊ณจ๋”” ๋ด‡์ด ๋™๊ฒฐ๋๋Š”๋ฐ, ์•Œ๋ฆผ ๋ณธ๋ฌธ์— ๊ฒฐ์ œ SMS ์›๋ฌธ์ด ๋“ค์–ด๊ฐ€์„œ ํ…”๋ ˆ๊ทธ๋žจ smishing ํ•„ํ„ฐ์— ์˜คํƒ๋œ ๊ฒŒ ์›์ธ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ์ดํ›„๋กœ ์•Œ๋ฆผ์—๋Š” ๋ผ๋ฒจยท์‹œ๊ฐยท๊ธˆ์•ก ๊ฐ™์€ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋งŒ ๋„ฃ์Šต๋‹ˆ๋‹ค. - **์ธ์ฆ๋ฒˆํ˜ธยท๊ฐ„ํŽธ์ธ์ฆ์„œยท๊ณ„์ขŒ๊ฐœ์„ค ์•ˆ๋‚ด ๋ฌธ์ž๋Š” ํ›„์ž‰์— ๋ณด๋‚ด์ง€ ์•Š์Œ.** `SKIP_PATTERNS`์— ๋“ฑ๋ก๋ผ ์žˆ์–ด์„œ, ๊ฒฐ์ œยท์ด์ฒด์™€ ๋ฌด๊ด€ํ•œ ๋ฌธ์ž๋Š” raw ํด๋ฐฑ์กฐ์ฐจ ๊ฐ€์ง€ ์•Š์Šต๋‹ˆ๋‹ค. - **๋ฏธํ™•์ธ ๋ฐœ์‹ ๋ฒˆํ˜ธ๋Š” ์ž๋™ ๋“ฑ๋ก X.** ์ƒˆ ๋ฐœ์‹ ๋ฒˆํ˜ธ์˜ ์ฒซ ๋ฉ”์‹œ์ง€๊ฐ€ ๋“ค์–ด์˜ค๋ฉด unmapped ๊ธฐ๋ก๋งŒ ๋‚จ๊ธฐ๊ณ , ๊ด€๋ฆฌ์ž๋‹˜์ด ์‹ค์ œ ๋‚ด์šฉ์„ ํ™•์ธํ•œ ๋’ค `confirmed:true`๋กœ ์Šน๊ฒฉํ•ด์•ผ ์ž๋™ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค. ์ž˜๋ชป๋œ ์ž๋™ ๋“ฑ๋ก์„ ๋ง‰๊ธฐ ์œ„ํ•จ์ž…๋‹ˆ๋‹ค. - **๊ฒฐ์ œ๋ฌธ์ž์™€ ๋ถ„๋ฅ˜๋ฅผ ๊ฐ™์ด ๋ณด๋‚ด๋„ ์ž๋™ ๋“ฑ๋กํ•˜์ง€ ์•Š์Œ.** "์Šคํƒ€๋ฒ…์Šค 5800์› ์‹๋น„๋กœ" ๊ฐ™์ด ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด๋„, "๋“ฑ๋กํ•ด์ค˜"๋ผ๋Š” ๋ช…์‹œ์  ์š”์ฒญ์ด ์—†์œผ๋ฉด ๊ณจ๋””๋Š” ์ž๋™๋™๊ธฐํ™”ยท๋ถ„๋ฅ˜ ํžŒํŠธ๋กœ๋งŒ ๊ธฐ๋กํ•˜๊ณ  ํ›„์ž‰์— ๋ณด๋‚ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. - **FDA ๋ˆ„๋ฝ ์‹œ ์กฐ์šฉํžˆ ๋ฌด๋™์ž‘.** launchd๋Š” Full Disk Access ๊ถŒํ•œ์„ ์ƒ์†๋ฐ›์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. macOS ์‹œ์Šคํ…œ ์„ค์ • โ†’ ๊ฐœ์ธ์ •๋ณด ๋ณดํ˜ธ ๋ฐ ๋ณด์•ˆ โ†’ ์ „์ฒด ๋””์Šคํฌ ์ ‘๊ทผ ๊ถŒํ•œ์— `/opt/homebrew/bin/imsg`๊ฐ€ ๋“ฑ๋ก๋ผ ์žˆ์–ด์•ผ Messages DB๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ˆ„๋ฝ๋˜๋ฉด stderr์— ์—๋Ÿฌ๋Š” ์ฐํžˆ์ง€๋งŒ stdout์€ "์ƒˆ ๊ฒฐ์ œ ๋ฉ”์‹œ์ง€ ์—†์Œ"์œผ๋กœ ๋๋‚˜๊ธฐ ๋•Œ๋ฌธ์— ์˜ค๋ฅ˜์ฒ˜๋Ÿผ ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋งฅ์„ ์˜ฎ๊ธฐ๊ฑฐ๋‚˜ imsg๋ฅผ ์žฌ์„ค์น˜ํ•˜๋ฉด ์žฌ๋“ฑ๋ก์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. --- ### 1-2. ์ง€๊ธˆ ๋“ฑ๋ก๋œ ์šฐ์„  ๋ฃฐ ๋‹ค์„ฏ ๊ฐœ `state/whooing_overrides.json`์— ์ •๊ธฐ๊ฒฐ์ œยท์‹œ๊ฐ„๋Œ€ ์กฐ๊ฑด ๋ถ„๊ฐœ ๋ฃฐ์ด ๋‹ค์„ฏ ๊ฐœ ๋ฐ•ํ˜€ ์žˆ์Šต๋‹ˆ๋‹ค. JSON ํŒŒ์ผ์„ ์ง์ ‘ ํŽธ์ง‘ํ•˜๋ฉด `whooing_sync.py`๊ฐ€ ๋งค ์‚ฌ์ดํด ๋‹ค์‹œ ์ฝ์–ด์„œ ์ ์šฉํ•˜๋ฏ€๋กœ, ์ฝ”๋“œ ์ˆ˜์ •์ด๋‚˜ launchd ์žฌ๊ธฐ๋™ ์—†์ด ์ฆ‰์‹œ ๋ฐ˜์˜๋ฉ๋‹ˆ๋‹ค. **1๋ฒˆ โ€” ์ฟ ํŒก ์ •๊ธฐ๊ฒฐ์ œ.** ์นด๋“œ์Šน์ธ์ด๊ณ  ๊ฐ€๋งน์ ์— "์ฟ ํŒก"์ด ๋“ค์–ด๊ฐ€๊ณ  ๊ธˆ์•ก์ด ์ •ํ™•ํžˆ **7,890์›**์ด๊ณ  ๋งค์›” **29์ผ**(์ฃผ๋ง์ด๋ฉด ๋‹ค์Œ ํ‰์ผ๊นŒ์ง€ ํ—ˆ์šฉ)์ด๋ฉด `์ง€์‹,๋ฌธํ™” โ† {๊ฒฐ์ œ์ˆ˜๋‹จ}` ๋ถ„๊ฐœ๋กœ ๋ณด๋ƒ…๋‹ˆ๋‹ค. ํ•ญ๋ชฉ๋ช…์€ `๊ณ„์ •๊ฒฐ์ œ_์ฟ ํŒก`. **2๋ฒˆ โ€” ํ‰์ผ ์ ์‹ฌ ์ธ๋ช…์†ก๊ธˆ.** ์ถœ๊ธˆ์ด๊ณ  ๊ฒฐ์ œ์ˆ˜๋‹จ์ด ํ•˜๋‚˜ยท์‹ ํ•œยท์นด๋ฑ… ์ค‘ ํ•˜๋‚˜์ด๊ณ  ๊ฐ€๋งน์ ์ด ํ•œ๊ธ€ 2~4์ž ์ธ๋ช…์ด๊ณ  ๊ฐ€๋งน์  ๋งคํ•‘์— ๋“ฑ๋ก ์•ˆ ๋ผ์žˆ๊ณ  **ํ‰์ผ 13:00~14:30 KST**์— ๋ฐœ์ƒํ•œ ๊ฑฐ๋ž˜๋ฉด `์‹๋น„ โ† {๊ฒฐ์ œ์ˆ˜๋‹จ}` ๋ถ„๊ฐœ๋กœ ๋ณด๋ƒ…๋‹ˆ๋‹ค. ํ•ญ๋ชฉ๋ช…์€ `์ ์‹ฌ์‹์‚ฌ`, ๋ฉ”๋ชจ๋Š” `{์ธ๋ช…}์—๊ฒŒ ์†ก๊ธˆ | {์›๋ฌธ}`. ๋™๋ฃŒ๋“ค๊ณผ ์ ์‹ฌ ๋”์น˜ํŽ˜์ด ์†ก๊ธˆ์„ ์ž๋™์œผ๋กœ ์‹๋น„๋กœ ์žก๊ธฐ ์œ„ํ•œ ๋ฃฐ์ž…๋‹ˆ๋‹ค. **3๋ฒˆ โ€” ํ‡ด์ง์—ฐ๊ธˆ ์ž๋™์ด์ฒด.** ์ถœ๊ธˆ์ด๊ณ  ํ•˜๋‚˜์€ํ–‰์ด๊ณ  ๋ฉ”๋ชจ์— "44891006239452"๊ฐ€ ํฌํ•จ๋˜๊ณ  ๊ธˆ์•ก์ด **100,000์›**์ด๊ณ  ๋งค์›” **25์ผ**(์ฃผ๋ง์ด๋ฉด ๋‹ค์Œ ํ‰์ผ)์ด๋ฉด `ํ•˜๋‚˜IRP(ํšจ์›) โ† ํ•˜๋‚˜์€ํ–‰(ํšจ์›)` ๋ถ„๊ฐœ. ํ•ญ๋ชฉ๋ช…์€ `ํ‡ด์ง์—ฐ๊ธˆ`. **4๋ฒˆ โ€” ํ”„๋ฆฌ๋“œ๋ผ์ดํ”„ ์ •๊ธฐ๋‚ฉ๋ถ€.** ์ถœ๊ธˆ์ด๊ณ  ํ•˜๋‚˜์€ํ–‰์ด๊ณ  ๋ฉ”๋ชจ์— "ํ”„๋ฆฌ๋“œ"๊ฐ€ ๋“ค์–ด๊ฐ€๊ณ  ๊ธˆ์•ก์ด **33,000์›**์ด๊ณ  ๋งค์›” **25์ผ**(์ฃผ๋ง์ด๋ฉด ๋‹ค์Œ ํ‰์ผ)์ด๋ฉด `์˜๋ฃŒ,๊ฑด๊ฐ•,๋ณดํ—˜ โ† ํ•˜๋‚˜์€ํ–‰(ํšจ์›)` ๋ถ„๊ฐœ. ํ•ญ๋ชฉ๋ช…์€ `ํ”„๋ฆฌ๋“œ๋ผ์ดํ”„`. **5๋ฒˆ โ€” ์šฐ์ฒด๊ตญ๋ณดํ—˜ ์ •๊ธฐ๋‚ฉ๋ถ€.** ์ถœ๊ธˆ์ด๊ณ  ํ•˜๋‚˜์€ํ–‰์ด๊ณ  ๋ฉ”๋ชจ์— "์šฐ์ฒด"๊ฐ€ ๋“ค์–ด๊ฐ€๊ณ  ๊ธˆ์•ก์ด **251,790์›**์ด๊ณ  ๋งค์›” **25์ผ**(์ฃผ๋ง์ด๋ฉด ๋‹ค์Œ ํ‰์ผ)์ด๋ฉด `์˜๋ฃŒ,๊ฑด๊ฐ•,๋ณดํ—˜ โ† ํ•˜๋‚˜์€ํ–‰(ํšจ์›)` ๋ถ„๊ฐœ. ํ•ญ๋ชฉ๋ช…์€ `๋ณดํ—˜๋ฃŒ`. **์ด ๋ฃฐ๋“ค์€ ๋™์‹œ์— ์ด์ƒ๊ฑฐ๋ž˜ ๊ฐ์ง€์—๋„ ์“ฐ์ž…๋‹ˆ๋‹ค.** ํŠนํžˆ 3ยท4ยท5๋ฒˆ์€ ๊ธˆ์•ก๊นŒ์ง€ ์ •ํ™•ํžˆ ์ผ์น˜ํ•ด์•ผ ๋งค์นญ๋ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ๊ธˆ์•ก์ด๋‚˜ ๊ฒฐ์ œ์ผ์ด ํ•œ ํ‘ผ์ด๋ผ๋„ ์–ด๊ธ‹๋‚˜๋ฉด ๋ฃฐ์— ์•ˆ ์žกํ˜€์„œ default fallback("๊ธฐํƒ€๋น„์šฉ")์œผ๋กœ ๋น ์ง€๊ณ , ์ด๋•Œ raw ํด๋ฐฑ ์•Œ๋ฆผ์ด ์ž๋™์œผ๋กœ ํ…”๋ ˆ๊ทธ๋žจ์œผ๋กœ ์˜ต๋‹ˆ๋‹ค. ์ฆ‰ "๋ณดํ—˜๋ฃŒ๊ฐ€ ๊ฐ‘์ž๊ธฐ ์ธ์ƒ๋๋‹ค" ๋˜๋Š” "์ •๊ธฐ๊ฒฐ์ œ๊ฐ€ ์ด์ƒํ•œ ๋‚  ๋น ์กŒ๋‹ค" ๊ฐ™์€ ๋ณ€ํ™”๋ฅผ ์ฆ‰์‹œ ๊ฐ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณดํ—˜๋ฃŒ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์ธ์ƒ๋๋‹ค๋ฉด ๋ฃฐ์˜ `amount_eq` ๊ฐ’๋งŒ ์ƒˆ ๊ธˆ์•ก์œผ๋กœ ๊ฐฑ์‹ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. --- ### 1-3. ์ž”์•ก ์ฐจ์ด๋กœ ์ž๋™ ๋ณด์ •ํ•˜๋Š” ๋ถ„๊ฐœ ๋„ค ์ข… ํ›„์ž‰์ด ์•Œ์•„์„œ ๋ถ„๊ฐœํ•˜์ง€ ๋ชปํ•˜๋Š” ์ผ€์ด์Šค(SMS๊ฐ€ ์˜ค์ง€ ์•Š๊ฑฐ๋‚˜, ๊ฒฐ์ œ๋Š” ๋๋Š”๋ฐ ๋ˆ„๋ฝ๋œ ์ผ€์ด์Šค ๋“ฑ)๋ฅผ ๋งค ์‚ฌ์ดํด ์ž”์•ก ๋น„๊ต๋กœ ์ž๋™ ๋ณด์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ™์€ ๋ณด์ •์ด ์ค‘๋ณต์œผ๋กœ ์ผ์–ด๋‚˜์ง€ ์•Š๋„๋ก `state/whooing_balance_alerts.json`์— carrier๋ณ„ ์ƒํƒœ๋ฅผ ๋ฐ•์•„ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. #### โ‘  ์นด๋ฑ… ์€ํ–‰์ด์ž ์ž๋™ ๋ถ„๊ฐœ ์นด์นด์˜ค๋ฑ…ํฌ๋Š” ์ด์ž๋‚˜ ์บ์‹œ๋ฐฑ์„ ์ค„ ๋•Œ ๋ณ„๋„ SMS๋ฅผ ๋ณด๋‚ด์ง€ ์•Š์„ ๋•Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ํ›„์ž‰์— ๋“ฑ๋ก๋œ ์นด๋ฑ… ์ž”์•ก์ด SMS ๊ธฐ๋ฐ˜์œผ๋กœ ์ถ”์ ๋˜๋Š” ์ž”์•ก๋ณด๋‹ค ์‚ด์ง ์ž‘์•„์ง€๋Š” ํ˜„์ƒ์ด ์ƒ๊น๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋งค ์‚ฌ์ดํด ๋น„๊ตํ•ด์„œ ํ›„์ž‰ ์ž”์•ก์ด SMS ์ž”์•ก๋ณด๋‹ค **5,000์› ์ด๋‚ด๋กœ ์ ์œผ๋ฉด** ๊ทธ ์ฐจ์•ก๋งŒํผ `์ด์ž / ๊ธฐํƒ€์ˆ˜์ต` (left=์นด์นด์˜ค๋ฑ…ํฌ, right=๊ธฐํƒ€์ˆ˜์ต)์œผ๋กœ ์ž๋™ ๋ถ„๊ฐœํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฑด ํšŸ์ˆ˜ยท๋‚ ์งœ ์ œํ•œ ์—†์ด ๋งค๋ฒˆ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ์ •์ƒ SMS deposit์ด ๋‚˜์ค‘์—๋ผ๋„ ๋“ค์–ด์˜ค๋ฉด ์ฐจ์ด๊ฐ€ 0์ด ๋ผ์„œ ์ž๋™ ๋ฏธ๋ฐœํ™”๋ฉ๋‹ˆ๋‹ค. ๋ถ„๊ฐœ ๊ฒฐ๊ณผ๋Š” "๐Ÿ’ฐ ์นด๋ฑ… ์€ํ–‰์ด์ž ์ž๋™ ๋ถ„๊ฐœ +N์›" ์•Œ๋ฆผ์œผ๋กœ ํ…”๋ ˆ๊ทธ๋žจ์— ์˜ต๋‹ˆ๋‹ค. #### โ‘ก ํ˜„๋Œ€์นด๋“œ ๋ฌธ์ž๋ฉ”์‹œ์ง€ ์ด์šฉ๋ฃŒ 300์› ์ž๋™ ๋ถ„๊ฐœ ํ˜„๋Œ€์นด๋“œ๋Š” ๋งค์›” ๋ฌธ์ž๋ฉ”์‹œ์ง€ ์ด์šฉ๋ฃŒ 300์›์„ ๋ถ€๊ณผํ•˜๋Š”๋ฐ, ๋ณ„๋„ ์Šน์ธ ์•Œ๋ฆผ SMS ์—†์ด ๋ˆ„์  ์‚ฌ์šฉ์•ก์—๋งŒ ์Šฌ์ฉ ๋ถ™์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ํ›„์ž‰ ์นด๋“œ ๋ถ€์ฑ„๊ฐ€ SMS ๋ˆ„์ ์•ก๋ณด๋‹ค **์ •ํ™•ํžˆ 300์›** ์ ์€ ์ผ€์ด์Šค๊ฐ€ ๋งค์›” ํ•œ ๋ฒˆ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ด ํŒจํ„ด์ด ๊ฐ์ง€๋˜๋ฉด `๋ฌธ์ž๋ฉ”์‹œ์ง€ ์ด์šฉ๋ฃŒ / ์ฃผ๊ฑฐ,ํ†ต์‹  โ† ํ˜„๋Œ€์นด๋“œ` ๋ถ„๊ฐœ๋กœ ์ž๋™ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์›” 1ํšŒ๋งŒ ์‹คํ–‰๋˜๋„๋ก `last_sms_fee_month` ์ƒํƒœ๋กœ ์ค‘๋ณต ๋ฐฉ์ง€. "๐Ÿ“จ ํ˜„๋Œ€์นด๋“œ ๋ฌธ์ž๋ฉ”์‹œ์ง€ ์ด์šฉ๋ฃŒ ์ž๋™ ๋ถ„๊ฐœ 300์›" ์•Œ๋ฆผ์ด ์˜ต๋‹ˆ๋‹ค. #### โ‘ข ํ˜„๋Œ€์นด๋“œ ๋ผ์ด๋‚˜์ƒ๋ช… ๋ณดํ—˜๋ฃŒ 31,100์› ์ž๋™ ๋ถ„๊ฐœ ๋ผ์ด๋‚˜์ƒ๋ช… ๋ณดํ—˜๋ฃŒ(31,100์›)๋Š” ํ˜„๋Œ€์นด๋“œ์— ๊ฒฐ์ œ๋˜๋Š”๋ฐ, ๊ฒฐ์ œ SMS๊ฐ€ ์ต์ผ ์ง€์—ฐ ๋„์ฐฉํ•˜๋Š” ํŒจํ„ด์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์นด๋“œ ๋ˆ„์  ์‚ฌ์šฉ์•ก์—๋Š” ๋‹น์ผ ๋ฐ˜์˜๋˜๊ธฐ ๋•Œ๋ฌธ์— ํ›„์ž‰ ๋ถ€์ฑ„์™€ SMS ๋ˆ„์ ์•ก ์‚ฌ์ด์— **์ •ํ™•ํžˆ 31,100์›** ์ฐจ์ด๊ฐ€ ์ƒ๊น๋‹ˆ๋‹ค. ์ด ํŒจํ„ด์ด ๊ฐ์ง€๋˜๋ฉด `๋ณดํ—˜๋ฃŒ / ์˜๋ฃŒ,๊ฑด๊ฐ•,๋ณดํ—˜ โ† ํ˜„๋Œ€์นด๋“œ`๋กœ ์ž๋™ ๋ถ„๊ฐœํ•ฉ๋‹ˆ๋‹ค. ์›” 1ํšŒ๋งŒ ์‹คํ–‰, `last_hyundai_insurance_month` ์ƒํƒœ๋กœ ์ค‘๋ณต ๋ฐฉ์ง€. "๐Ÿ›ก๏ธ ํ˜„๋Œ€์นด๋“œ ๋ณดํ—˜๋ฃŒ ์ž๋™ ๋ถ„๊ฐœ 31,100์›" ์•Œ๋ฆผ. ๊ทธ๋ฆฌ๊ณ  ๋‹ค์Œ๋‚  ๋ผ์ด๋‚˜์ƒ๋ช… 31,100์› SMS๊ฐ€ ๋Šฆ๊ฒŒ ๋„์ฐฉํ•˜๋ฉด ๊ทธ๊ฑด raw ์ „์†กํ•˜์ง€ ์•Š๊ณ  ์Šคํ‚ตํ•ฉ๋‹ˆ๋‹ค (์ด๋ฏธ ์ž๋™ ๋ณด์ •์œผ๋กœ ๋ถ„๊ฐœ๋๊ธฐ ๋•Œ๋ฌธ). `_should_skip_hyundai_insurance_duplicate` ํ•จ์ˆ˜๊ฐ€ ๊ฐ™์€ ๋‹ฌ ์•ˆ์—์„œ๋Š” ๊ฐ™์€ ๋ณดํ—˜๋ฃŒ SMS๋ฅผ ๋‘ ๋ฒˆ ๋ถ„๊ฐœํ•˜์ง€ ์•Š๋„๋ก ๋ง‰์Šต๋‹ˆ๋‹ค. #### โ‘ฃ ์—ฐ๋ฃŒ ๊ฐ€์ˆ˜๊ธˆ 150,000์› ์Šคํ‚ต ์ฃผ์œ ์†Œ์—์„œ ์นด๋“œ๋ฅผ ๊ฝ‚์œผ๋ฉด ๊ฒฐ์ œ ์ „์— ์šฐ์„  150,000์› ํ•œ๋„๋กœ ๊ฐ€์ˆ˜๊ธˆ์„ ์žก์•„๋‘ก๋‹ˆ๋‹ค (FUEL_PREAUTH_AMOUNT). ์‹ค์ œ ์ฃผ์œ  ๊ธˆ์•ก์œผ๋กœ ์ •์ •๋  ๋•Œ ์ƒˆ SMS๊ฐ€ ์˜ค๋Š”๋ฐ, ๊ฐ€์ˆ˜๊ธˆ 150,000์›์„ ๊ทธ๋Œ€๋กœ ๋ถ„๊ฐœํ•˜๋ฉด ์ด์ค‘๊ณ„์ƒ์ด ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ฃผ์œ ์†Œ ๊ฐ€๋งน์  + ๊ธˆ์•ก 150,000์› ํŒจํ„ด์€ ํ›„์ž‰์— ๋ณด๋‚ด์ง€ ์•Š๊ณ  ์Šคํ‚ตํ•ฉ๋‹ˆ๋‹ค. --- ### 1-4. ๊ฐ€ํฌ๋‹˜ ์ž”์•ก ๋ฆฌ๋งˆ์ธ๋”์™€ ์ž๋™๋ถ„๊ฐœ ๊ฐ€ํฌ๋‹˜ ์ฃผ๋จธ๋‹ˆ(ํ˜„๊ธˆ์„ฑ ์ž์‚ฐ ํ•ฉ๊ณ„)๋Š” SMS๋กœ ์ถ”์ ํ•  ์ˆ˜ ์—†์–ด์„œ ๊ฐ€ํฌ๋‹˜๊ป˜ ์ž”์•ก์„ ์ง์ ‘ ๋ฐ›์•„ ๋ฐ˜์˜ํ•˜๋Š” ์ฑ„๋„์ด ๋”ฐ๋กœ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฑด ๋ณ„๋„ cron์ด ์•„๋‹ˆ๋ผ **๊ฒฐ์ œ๋ฌธ์ž ๋™๊ธฐํ™” ์‚ฌ์ดํด์ด ๋๋‚  ๋•Œ๋งˆ๋‹ค ํ•จ๊ป˜ ํ˜ธ์ถœ**๋ฉ๋‹ˆ๋‹ค (`gahee_reminder.run()`). ์ฆ‰ ๋งค 15๋ถ„ ์‚ฌ์ดํด์— piggyback. ์‹ค์ œ๋กœ ๊ฐ€ํฌ๋‹˜๊ป˜ ๋ฉ”์‹œ์ง€๊ฐ€ ๊ฐ€๋Š” ๊ฑด ๋งค์›” 25์ผ 10์‹œ ์ดํ›„ ์ฒซ ์‚ฌ์ดํด์— ํ•œ ๋ฒˆ๋ฟ์ž…๋‹ˆ๋‹ค. #### ๋ฐœ์‹  ๊ฒŒ์ดํŠธ KST ๊ธฐ์ค€์œผ๋กœ ์˜ค๋Š˜์ด 25์ผ ์ด์ƒ์ด๊ณ  ํ˜„์žฌ ์‹œ๊ฐ„์ด 10์‹œ ์ด์ƒ์ด๊ณ  ์ด๋ฒˆ ๋‹ฌ์— ์•„์ง ๋ฐœ์‹ ํ•œ ์  ์—†์œผ๋ฉด(`last_sent_month`๋กœ ์ถ”์ ), ๊ฐ€ํฌ๋‹˜(`+821055595428`)๊ป˜ `state/gahee_reminder.json`์˜ `message_template`์„ iMessage๋กœ ํ•œ ๋ฒˆ ๋ณด๋ƒ…๋‹ˆ๋‹ค. 25์ผ์— Mac์ด ๊บผ์ ธ ์žˆ์—ˆ์œผ๋ฉด 26์ผ์ด๋“  28์ผ์ด๋“  ์ผœ์กŒ์„ ๋•Œ ๋ณด๋ƒ…๋‹ˆ๋‹ค. ๋‹ค์Œ ๋‹ฌ๋กœ ๋„˜์–ด๊ฐ€๋ฉด ์ด๋ฒˆ ๋‹ฌ์€ ํฌ๊ธฐ. #### ๋‹ต์‹  ์ฒ˜๋ฆฌ ๋ฐœ์‹  ํ›„์—๋Š” ๊ฐ€ํฌ๋‹˜ ๋‹ต์‹ ์„ ๋งค ์‚ฌ์ดํด ํด๋งํ•ฉ๋‹ˆ๋‹ค. ์ฒ˜๋ฆฌ๋Š” ๋‹จ๊ณ„์ ์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค. ๋จผ์ € ๋‹ต์‹ ์ด **์ด๋ฏธ์ง€ ์ฒจ๋ถ€**๋ฉด ์ž๋™๋ถ„๊ฐœ๋ฅผ ํ•˜์ง€ ์•Š๊ณ  ๊ณจ๋”” ํ…”๋ ˆ๊ทธ๋žจ์œผ๋กœ "์ด๋ฏธ์ง€ ๋‹ต์‹  โ€” ์ง์ ‘ ์ฒ˜๋ฆฌ ๋ถ€ํƒ" ์•Œ๋ฆผ๋งŒ ๋ณด๋ƒ…๋‹ˆ๋‹ค. ๊ด€๋ฆฌ์ž๋‹˜์ด ์ง์ ‘ ๋ณด๊ณ  ์ฒ˜๋ฆฌํ•˜๊ฑฐ๋‚˜ ๊ฐ€ํฌ๋‹˜๊ป˜ ํ…์ŠคํŠธ๋กœ ๋‹ค์‹œ ์š”์ฒญํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‹ต์‹ ์ด **ํ…์ŠคํŠธ ์—ฌ๋Ÿฌ ํ†ต**์ด๋ฉด ๋งˆ์ง€๋ง‰๋งŒ ๋ถ„๊ฐœํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€ํฌ๋‹˜์ด ์ž”์•ก์„ ์ˆ˜์ •ํ•ด์„œ ๋‹ค์‹œ ๋ณด๋‚ด๋Š” ๊ฒฝ์šฐ, ์ฒซ ๋ฉ”์‹œ์ง€๋กœ ์ž˜๋ชป ๋ถ„๊ฐœ๋˜๋Š” ์‚ฌ๊ณ ๋ฅผ ๋ง‰๊ธฐ ์œ„ํ•ด์„œ์ž…๋‹ˆ๋‹ค. ์ด์ „ N-1ํ†ต์€ ์›Œํ„ฐ๋งˆํฌ๋งŒ ๊ฐฑ์‹ ํ•˜๊ณ  ๋ณ„๋„ ์•Œ๋ฆผ์œผ๋กœ ์Šคํ‚ต ์‚ฌ์‹ค์„ ๋ณด๊ณ ํ•ฉ๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰ ํ…์ŠคํŠธ๋Š” ์ •๊ทœ์‹์œผ๋กœ `๋ผ๋ฒจ : ๊ธˆ์•ก` ํŽ˜์–ด๋ฅผ ์ถ”์ถœํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ: "๊ตญ๋ฏผ : 42,995 ์‹ ํ•œ : 4,161,585". ํŽ˜์–ด๊ฐ€ ํ•œ ๊ฐœ๋„ ์•ˆ ๋‚˜์˜ค๋ฉด ํฌ๋งท ์˜ค๋ฅ˜๋กœ ๋ณด๊ณ  ์ž๋™๋ถ„๊ฐœ๋ฅผ ์ค‘๋‹จํ•˜๊ณ  ํ…”๋ ˆ๊ทธ๋žจ์œผ๋กœ ์•Œ๋ฆฝ๋‹ˆ๋‹ค. ํŽ˜์–ด๊ฐ€ ํ•˜๋‚˜ ์ด์ƒ์ด๋ฉด ๋ชจ๋“  ํŽ˜์–ด์˜ ํ•ฉ๊ณ„๋ฅผ ๊ณ„์‚ฐํ•ด ํ›„์ž‰์˜ `๊ฐ€ํฌ์ฃผ๋จธ๋‹ˆ` ํ˜„์žฌ ์ž”๊ณ ์™€ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค. ์ฐจ์ด๊ฐ€ ์–‘์ˆ˜๋ฉด `๊ฐ€ํฌ์ฃผ๋จธ๋‹ˆ โ† ๊ฐ€ํฌ๋น„๋ฐ€์ฃผ๋จธ๋‹ˆ_์ˆ˜์ต`(์ˆ˜์ต), ์Œ์ˆ˜๋ฉด `๊ธฐํƒ€๋น„์šฉ โ† ๊ฐ€ํฌ์ฃผ๋จธ๋‹ˆ`(๋น„์šฉ), 0์ด๋ฉด ๋ถ„๊ฐœ ์ƒ๋žตํ•˜๊ณ  ์•Œ๋ฆผ๋งŒ ๋ณด๋ƒ…๋‹ˆ๋‹ค. ๋ฉ”๋ชจ๋ž€์—๋Š” ๋ผ๋ฒจ๋ณ„ ์ž”์•ก ์›๋ณธ์„ ๊ทธ๋Œ€๋กœ ๋ฐ•์Šต๋‹ˆ๋‹ค โ€” ์˜ˆ: `[์ž๋™] ๊ฐ€ํฌ ์ž”์•ก ๊ฐฑ์‹  | ๊ตญ๋ฏผ:42,995 ์‹ ํ•œ:4,161,585 ... | ํ•ฉ๊ณ„ X (์ด์ „ Y)` (200์ž truncate). #### ๊ด€๋ฆฌ์ž๋‹˜์ด ์‹œํ‚จ ํ•ต์‹ฌ ๊ทœ์น™ **์•ˆ์ „์žฅ์น˜ ๋ฐ•์ง€ ๋ง ๊ฒƒ.** 2026-05-21์— ๊ด€๋ฆฌ์ž๋‹˜์ด ๋ช…์‹œ์ ์œผ๋กœ ๊ฒฐ์ •ํ•˜์‹  ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค. ์ฐจ์•ก ์ž„๊ณ„์น˜(์˜ˆ: 100๋งŒ์› ์ด์ƒ์ด๋ฉด ๊ฑฐ๋ถ€), ๊ธˆ์•ก ์ƒํ•œ, diff threshold ๊ฐ™์€ ๊ฐ€๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜์ง€ ๋ง๊ณ  ๋ฌด์กฐ๊ฑด ๋ถ„๊ฐœํ•˜๋ผ๋Š” ์›์น™์ž…๋‹ˆ๋‹ค. ์ž˜๋ชป ๋ถ„๊ฐœ๋˜๋ฉด ํ›„์ž‰ UI์—์„œ ์‚ฌํ›„ ์ •์ •ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. **ํ˜„๊ธˆ์„ฑ ๊ณ„์ขŒ๋งŒ ๋ฐ˜์˜.** ๊ฐ€ํฌ๋‹˜ ํ‚ค์›€ ์˜ˆ์ˆ˜๊ธˆ์ด๋‚˜ ๋ฏธ์ˆ˜๊ธˆ์ฒ˜๋Ÿผ ์ฃผ์‹ ์ •๋ณด๋Š” ํ•ฉ๊ณ„์—์„œ ๋นผ๊ณ  ๋ฉ”๋ชจ์—๋„ ์•ˆ ์ ์Šต๋‹ˆ๋‹ค. **๋น„๊ต ๊ธฐ์ค€์€ ๋งค๋ฒˆ ํ›„์ž‰์—์„œ ์ƒˆ๋กœ ์กฐํšŒ.** ์ด์ „ ์ž”๊ณ  ๊ฐ’์„ ๋ฉ”๋ชจ๋ฆฌ์— ์บ์‹ฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค โ€” ๊ทธ ์‚ฌ์ด์— ๋ถ„๊ฐœ๊ฐ€ ๋ˆ„์ ๋˜๋ฉด ์ฆ‰์‹œ stale ์ƒํƒœ๊ฐ€ ๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. **๋ฐœ์‹  ๋ฌธ๊ตฌ ๋ณ€๊ฒฝ์€ state JSON ์ง์ ‘ ํŽธ์ง‘.** `state/gahee_reminder.json`์˜ `message_template`์„ ๋ฐ”๊พธ๋ฉด ๋‹ค์Œ ๋ฐœ์‹ ๋ถ€ํ„ฐ ์ƒˆ ๋ฌธ๊ตฌ๊ฐ€ ๋‚˜๊ฐ‘๋‹ˆ๋‹ค. ์ฝ”๋“œ ์žฌ๋ฐฐํฌ ๋ถˆํ•„์š”. ๋งŒ์•ฝ ๋ถ„๊ฐœ๊ฐ€ ํ›„์ž‰ API ์ผ์‹œ ์žฅ์• ๋กœ ์‹คํŒจํ•˜๋ฉด ์›Œํ„ฐ๋งˆํฌ๋ฅผ ๊ฐฑ์‹ ํ•˜์ง€ ์•Š์•„ ๋‹ค์Œ ์‚ฌ์ดํด(15๋ถ„ ํ›„)์— ๊ฐ™์€ ๋ฉ”์‹œ์ง€๋กœ ์žฌ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค. --- ### 1-5. ์›”๊ฐ„ ๊ฒฐ์‚ฐ ๋งค์›” **1์ผ 05:00 KST**์— OpenClaw cron(jobs.json์˜ `08e9a978`, agent=budget)์ด ๋ฐœํ™”ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ž‘์—…์€ ๋ณธ๋ฌธ์— ์ž์—ฐ์–ด ์š”์•ฝ์ด ํ•„์š”ํ•ด์„œ launchd๊ฐ€ ์•„๋‹Œ LLM cron์œผ๋กœ ๋Œ์•„๊ฐ‘๋‹ˆ๋‹ค. cron payload์— ์ ํžŒ step์„ ๊ณจ๋”” ์„ธ์…˜์ด ์ฐจ๋ก€๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. #### 1๋‹จ๊ณ„ โ€” inbox ์ฒ˜๋ฆฌ ๋งค์›” 1์ผ 04:30(๊ฒฐ์‚ฐ 30๋ถ„ ์ „)์— stock ์—์ด์ „ํŠธ๊ฐ€ ๋ณธ์ธ ์ฆ๊ถŒ ๊ณ„์ขŒ ์ž”์•ก์„ `securities_balance` envelope์œผ๋กœ ๊ณจ๋”” inbox(`agents/budget/inbox/incoming/`)์— ๋–จ์–ด๋œจ๋ฆฝ๋‹ˆ๋‹ค. ๊ฒฐ์‚ฐ ์‹œ์ž‘ ์‹œ์ ์— ๊ณจ๋””๊ฐ€ ์ด envelope์„ ์ฝ์–ด, payload์˜ `totals.total`๊ณผ ํ›„์ž‰ `์ฆ๊ถŒ(ํšจ์›)` ์ž์‚ฐ์˜ ์ฐจ์•ก์„ ๊ณ„์‚ฐํ•ด ์ž๋™ ๋ถ„๊ฐœํ•ฉ๋‹ˆ๋‹ค. ์ฐจ์•ก์ด ์–‘์ˆ˜๋ฉด `์ฆ๊ถŒ(ํšจ์›) / ์ฃผ์‹ํ‰๊ฐ€์ˆ˜์ต`, ์Œ์ˆ˜๋ฉด `์ฃผ์‹ํ‰๊ฐ€์†์‹ค / ์ฆ๊ถŒ(ํšจ์›)`. ์•ˆ์ „ ๊ฐ€๋“œ๋กœ `|์ฐจ์•ก|<1๋งŒ์›`์ด๋ฉด ๋…ธ์ด์ฆˆ๋กœ ๋ณด๊ณ  skipํ•˜๊ณ , `|์ฐจ์•ก|>1์–ต์›`์ด๋ฉด ๋ถ„๊ฐœ๋ฅผ ๊ฑฐ๋ถ€ํ•˜๊ณ  ํ…”๋ ˆ๊ทธ๋žจ alert๋ฅผ ๋ณด๋‚ด๊ณ  envelope์„ `failed/`๋กœ ์˜ฎ๊น๋‹ˆ๋‹ค. ์ฒ˜๋ฆฌ ๋๋‚œ envelope์€ `processed/`๋กœ ์ด๋™. ์ด์ „์—” 1ยท10ยท20์ผ ์„ธ ๋ฒˆ ์šด์˜์ด์—ˆ์œผ๋‚˜ 10์ผยท20์ผ์€ ๊ฒฐ์‚ฐ ๋ฉ”์ผ์ด ๋ฐœ์†ก ์•ˆ ๋ผ์„œ envelope๋งŒ inbox์— ์Œ“์ด๋Š” dead-end์˜€์Šต๋‹ˆ๋‹ค. 2026-05-11์— ๋งค์›” 1์ผ ํ•œ ๋ฒˆ์œผ๋กœ ๋‹จ์ผํ™”ํ–ˆ์Šต๋‹ˆ๋‹ค. #### 2๋‹จ๊ณ„ โ€” ๊ฒฐ์‚ฐ ์‹คํ–‰ `monthly_settlement.py`๊ฐ€ `whooing_balance.py --json`์„ ํ˜ธ์ถœํ•ด ํ˜„์žฌ ํ›„์ž‰ ์ž”์•ก ์Šค๋ƒ…์ƒท์„ ๋งŒ๋“ค๊ณ , `state/monthly_snapshots.json`์— ์ €์žฅ๋œ ์ „์›” ์Šค๋ƒ…์ƒท๊ณผ ๋น„๊ตํ•ด ๊ณ„์ •๋ณ„ ์ฆ๊ฐ์„ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. #### 3๋‹จ๊ณ„ โ€” ๋ณด๊ณ  Gmail๋กœ ๊ด€๋ฆฌ์ž๋‹˜๊ป˜ ๋ณธ๋ฌธ ๋ฉ”์ผ์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค (`gog gmail send --to mini.snowoyh@gmail.com`, ์ œ๋ชฉ `[์›”๊ฐ„๊ฒฐ์‚ฐ] YYYY๋…„ M์›” ์ž์‚ฐ ๋ณ€๋™`). ๋ณธ๋ฌธ์—” ๋ชจ๋“  ๊ณ„์ • ์ฆ๊ฐ์ด ์ ˆ๋Œ€๊ฐ’ ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌ๋ผ ์žˆ์Šต๋‹ˆ๋‹ค. ๋™์‹œ์— ๊ณจ๋”” ํ…”๋ ˆ๊ทธ๋žจ์œผ๋กœ๋Š” ์ˆœ์ž์‚ฐ ๋ณ€๋™ ํ•œ ์ค„ + ยฑ100๋งŒ์› ์ด์ƒ ๋ณ€๋™ top 5๋งŒ ์งง๊ฒŒ ์š”์•ฝํ•ด์„œ ๋ณด๋ƒ…๋‹ˆ๋‹ค. #### ์ถ”๊ฐ€ ํ”Œ๋ž˜๊ทธ - `--dry-run` โ€” ๋ฉ”์ผยทํ…”๋ ˆ๊ทธ๋žจ ์ „์†ก ์•ˆ ํ•˜๊ณ  ๋ณธ๋ฌธ๋งŒ stdout - `--no-send` โ€” ์ „์†ก ์ƒ๋žต, ์Šค๋ƒ…์ƒท ์ €์žฅ๊ณผ stdout๋งŒ (๋ณต๊ตฌยท์žฌ์‹คํ–‰์šฉ) - `--as-of YYYY-MM-DD` โ€” ๊ธฐ์ค€์ผ ๊ฐ•์ œ ์ง€์ • #### inbox ๊ด€๋ฆฌ ์ •์ฑ… - `processed/`์˜ envelope์€ mtime 30์ผ ์ดˆ๊ณผํ•˜๋ฉด ์ž๋™ ์‚ญ์ œ (์›”๊ฐ„๊ฒฐ์‚ฐ cron ์ง„์ž…๋ถ€์—์„œ ๋งค์›” GC) - `failed/`๋Š” 5๊ฑด ์ด์ƒ ์ ์ฒด๋˜๋ฉด ๊ฒฐ์‚ฐ ๋ฉ”์ผยทํ…”๋ ˆ๊ทธ๋žจ์— โš ๏ธ ํ•œ ์ค„ ์ถ”๊ฐ€ โ€” **์ž๋™ ์‚ญ์ œ๋Š” ์•ˆ ํ•จ**. ๊ด€๋ฆฌ์ž๋‹˜์ด ๊ฒ€ํ†  ํ›„ ์ˆ˜๋™ ์‚ญ์ œ - ๊ฐ™์€ envelope์ด ๋‘ ๋ฒˆ ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š๋„๋ก `state/inbox_state.json`์˜ `processed[]`์— ์ตœ๊ทผ 1000๊ฐœ message_id ๋ˆ„์  --- ## 2. ์ˆ˜๋™์œผ๋กœ ๋ถ€๋ฅผ ์ˆ˜ ์žˆ๋Š” ๋ช…๋ น ์ž๋™ ์—…๋ฌด ์™ธ์— ๊ด€๋ฆฌ์ž๋‹˜์ด ์ง์ ‘ ๋ถ€๋ฅผ ์ˆ˜ ์žˆ๋Š” ๋ช…๋ น์ด ์—ฌ๋Ÿ ๊ฐ€์ง€ ์žˆ์Šต๋‹ˆ๋‹ค. ### 2-1. ์ˆ˜๋™ ๋ถ„๊ฐœ 1๊ฑด โ€” `whooing_manual.py` iMessage ๊ฒฐ์ œ๋ฌธ์ž๋ฅผ ๊ฑฐ์น˜์ง€ ์•Š๊ณ  ํ•œ ๊ฑด์„ ์ง์ ‘ ํ›„์ž‰์— ๋ถ„๊ฐœํ•ฉ๋‹ˆ๋‹ค. ๋‘ ๊ฐ€์ง€ ๋ชจ๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. **Structured ๋ชจ๋“œ** โ€” ํ•ญ๋ชฉยท๊ธˆ์•กยท์ฐจ๋ณ€ยท๋Œ€๋ณ€์„ ์ง์ ‘ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ```bash python3 ~/.openclaw/agents/budget/workspace/skills/whooing-sync/scripts/whooing_manual.py \ --item "์Šคํƒ€๋ฒ…์Šค" --money 5800 --left "์‹๋น„" --right "์‹ ํ•œ์‹ ์šฉ(ํšจ์›)" \ [--date YYYYMMDD --memo "์˜ค์ „ ์ปคํ”ผ"] ``` `whooing_accounts.json` ์ฐจํŠธ์— ๋“ฑ๋ก๋œ ๊ณ„์ •๋ช…๋งŒ ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ฐจํŠธ์— ์—†๋Š” ์ด๋ฆ„์€ ํ›„์ž‰์ด ๊ฑฐ๋ถ€. **Raw ๋ชจ๋“œ** โ€” ์›๋ฌธ ๋ฉ”์‹œ์ง€๋ฅผ ๊ทธ๋Œ€๋กœ ๋ณด๋‚ด ํ›„์ž‰ ์ž์ฒด ํŒŒ์„œ์— ๋งก๊น๋‹ˆ๋‹ค. ```bash python3 .../whooing_manual.py --message "์Šคํƒ€๋ฒ…์Šค 5800์› ์‹ ํ•œ์‹ ์šฉ" ``` **์‚ฌ์ „ ํ™•์ธ** โ€” `--dry-run`์„ ๋ถ™์ด๋ฉด ์‹ค์ œ POST ์—†์ด ์–ด๋””๋กœ ๊ฐˆ์ง€๋งŒ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ์šฉ๋„๋Š” ์ž˜๋ชป ๋ถ„๊ฐœ๋œ ๊ฑด ์—ญ๋ถ„๊ฐœ, ์ฐจํŠธ ์™ธ ์ž…๋ ฅ ์ ๊ฒ€, ์นด๋“œ ์™ธ ์ˆ˜๋™ ์ž…๋ ฅ(ํ˜„๊ธˆ ๊ฑฐ๋ž˜ ๋“ฑ). ### 2-2. ์นด๋“œ ์ทจ์†Œยทํ™˜๋ถˆ ์ฒ˜๋ฆฌ ์นด๋“œ ๊ฒฐ์ œ ํ›„ ํ™˜๋ถˆยท์ทจ์†Œ๊ฐ€ ์ผ์–ด๋‚˜๋ฉด structured ๋ถ„๊ฐœ๋กœ ์ฒ˜๋ฆฌํ•˜์ง€ ๋ง๊ณ  **raw ๋ชจ๋“œ**(`--message`)๋กœ ์›๋ฌธ์„ ๊ทธ๋Œ€๋กœ ๋ณด๋‚ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ํ›„์ž‰์ด -๊ธˆ์•ก์œผ๋กœ ์ž๋™ ์ƒ์‡„ํ•ฉ๋‹ˆ๋‹ค. structured๋กœ ํ™˜๋ถˆ์„ ๋ถ„๊ฐœํ•˜๋ ค๊ณ  ํ•˜๋ฉด ์ด์ค‘๊ณ„์ƒ ์œ„ํ—˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. ### 2-3. ํ›„์ž‰ ์ž”์•ก ์กฐํšŒ โ€” `whooing_balance.py` ```bash python3 .../whooing_balance.py [--section-id ] [--as-of YYYY-MM-DD] [--json] ``` ํ›„์ž‰ OpenAPI(`bs.json`/`accounts.json`/`sections.json`)๋กœ ์ž์‚ฐยท๋ถ€์ฑ„ยท์ž๋ณธ ์ž”์•ก์„ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ์ถœ๋ ฅ์€ ๋งˆํฌ๋‹ค์šด์œผ๋กœ ์นดํ…Œ๊ณ ๋ฆฌ๋ณ„ ํ•ฉ๊ณ„์™€ ๊ณ„์ •๋ณ„ ๊ธˆ์•ก(0์› ๊ณ„์ •์€ ์ƒ๋žต, ๊ธˆ์•ก ๋‚ด๋ฆผ์ฐจ์ˆœ)์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ์ฝ๊ธฐ ์ „์šฉ์ด๋ฏ€๋กœ dry-run ๊ฐœ๋…์ด ์—†๊ณ  ๋ฐ”๋กœ ์‹คํ–‰ํ•ด๋„ ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€ํฌ์ฃผ๋จธ๋‹ˆ ์ฐจ์•ก ๊ณ„์‚ฐ, ์›”๊ฐ„ ๊ฒฐ์‚ฐ ๊ฒ€์ฆ, ์ž„์˜ ์‹œ์  ์Šค๋ƒ…์ƒท ๋“ฑ์— ์“ฐ์ž…๋‹ˆ๋‹ค. ์™ธ๋ถ€(๋ฉ”์ผยทํ…”๋ ˆ๊ทธ๋žจ ์™ธ)๋กœ ์ž”์•ก ๋ฐ์ดํ„ฐ๋ฅผ ๋‚ด๋ณด๋‚ด๋ ค๋ฉด ๊ด€๋ฆฌ์ž๋‹˜ ํ—ˆ๋ฝ์ด ๋จผ์ €์ž…๋‹ˆ๋‹ค. ### 2-4. inbox `securities_balance` ๋‹จ๋… ์ฒ˜๋ฆฌ โ€” `inbox_handler.py` ```bash python3 ~/.openclaw/agents/budget/workspace/skills/monthly-settlement/scripts/inbox_handler.py [--dry-run] ``` ์›”๊ฐ„๊ฒฐ์‚ฐ cron์ด ์ž๋™์œผ๋กœ ์ด๊ฑธ ํ˜ธ์ถœํ•˜์ง€๋งŒ, ์ ๊ฒ€์ด๋‚˜ ์žฌ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•  ๋•Œ ๋‹จ๋…์œผ๋กœ ๋ถ€๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. `--dry-run`์€ ๋ถ„๊ฐœ POST ์—†์ด ๊ฒ€์ฆ๋งŒ ํ•ฉ๋‹ˆ๋‹ค. ### 2-5. ์šฐ์„  ๋ฃฐ ์ถ”๊ฐ€ยท์ˆ˜์ •ยท์‚ญ์ œ โ€” `state/whooing_overrides.json` ์ง์ ‘ ํŽธ์ง‘ JSON ํŒŒ์ผ์„ ํ…์ŠคํŠธ ์—๋””ํ„ฐ๋กœ ์—ด์–ด์„œ ๋ฃฐ ๊ฐ์ฒด๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ์‚ญ์ œํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์ผ์‹œ ๋น„ํ™œ์„ฑํ™”๋Š” `enabled:false`, ์šฐ์„ ์ˆœ์œ„ ๋ณ€๊ฒฝ์€ ๋ฐฐ์—ด ์ˆœ์„œ๋กœ ํ•ฉ๋‹ˆ๋‹ค (์œ„์— ์žˆ๋Š” ๋ฃฐ์ด ๋จผ์ € ๋งค์นญ๋จ). `whooing_sync.py`๊ฐ€ ๋งค ์‚ฌ์ดํด ์žฌ๋กœ๋”ฉํ•˜๋ฏ€๋กœ ์ฝ”๋“œ ์ˆ˜์ •๋„ launchd ์žฌ๊ธฐ๋™๋„ ํ•„์š” ์—†์Šต๋‹ˆ๋‹ค. ๋ฃฐ ๋งค์ฒ˜ ํ‚ค๋Š” `kind`(card_approval/withdrawal ๋“ฑ), `merchant_contains`, `merchant_regex`, `merchant_unmapped`, `amount_eq`, `carrier_in`, `weekday_in`, `scheduled_day_of_month` + `weekend_policy`, `time_kst_between` ๋“ฑ์ž…๋‹ˆ๋‹ค. ๋ถ„๊ฐœ ๊ฒฐ๊ณผ(`post`)์—๋Š” `{merchant}`, `{raw}`, `{amount}`, `{carrier_account}` ๋ณ€์ˆ˜๊ฐ€ ์น˜ํ™˜๋ฉ๋‹ˆ๋‹ค. **์ •๊ธฐ๊ฒฐ์ œยท์ž๋™์ด์ฒดยท์‹œ๊ฐ„๋Œ€ ์กฐ๊ฑด ๋ถ„๊ฐœ๋Š” ์ „๋ถ€ ์—ฌ๊ธฐ.** ์ผ๋ฐ˜ ๊ฐ€๋งน์  ๋ถ„๋ฅ˜(์Šคํƒ€๋ฒ…์Šคโ†’์‹๋น„ ๋“ฑ)๋Š” `whooing_merchant_map.json`์— ๋‘ก๋‹ˆ๋‹ค. ### 2-6. ๊ฐ€๋งน์  ๋งคํ•‘ ์ถ”๊ฐ€ โ€” `state/whooing_merchant_map.json` ์ง์ ‘ ํŽธ์ง‘ exact / contains ๋ฃฐ๋กœ ๊ฐ€๋งน์ ๋ช…์„ ํ›„์ž‰ ๊ณ„์ •์— ๋งคํ•‘ํ•ฉ๋‹ˆ๋‹ค. ์ž์ฃผ ๊ฐ€๋Š” ์นดํŽ˜ยท๊ตํ†ตยทํ†ต์‹  ๊ฐ™์ด ๊ณ ์ •๋œ ๊ฐ€๋งน์ ์ด ํ›„๋ณด์ž…๋‹ˆ๋‹ค. **์ธ๋ช… ์†ก๊ธˆ์€ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.** 2026-04-24์— ๊ด€๋ฆฌ์ž๋‹˜์ด ๊ฒฐ์ •ํ•˜์‹  ์ •์ฑ…์ž…๋‹ˆ๋‹ค. ์ƒˆ ์ด๋ฆ„ ์†ก๊ธˆ์ด ๋“ค์–ด์™€๋„ ์†๋Œ€์ง€ ๋ง๊ณ  ๊ธฐํƒ€๋น„์šฉ fallback์— ๋งก๊ธด ๋‹ค์Œ ํ›„์ž‰ UI์—์„œ ์‚ฌํ›„ ์นดํ…Œ๊ณ ๋ฆฌ ์ด๋™. ### 2-7. ๋ฐœ์‹ ๋ฒˆํ˜ธ confirm ์Šน๊ฒฉ โ€” `state/whooing_account_map.json` ์ง์ ‘ ํŽธ์ง‘ ์ƒˆ ์นด๋“œ์‚ฌยท์€ํ–‰ ๋ฐœ์‹ ๋ฒˆํ˜ธ๊ฐ€ ๋“ค์–ด์™”์„ ๋•Œ ๋ฉ”์‹œ์ง€ ๋‚ด์šฉ์„ ํ™•์ธํ•˜๊ณ  ๋งคํ•‘์ด ์ •ํ™•ํ•˜๋‹ค๊ณ  ํŒ๋‹จ๋˜๋ฉด ํ•ด๋‹น ์—”ํŠธ๋ฆฌ์˜ `confirmed: false`๋ฅผ `true`๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๋‹ค์Œ ์‚ฌ์ดํด๋ถ€ํ„ฐ ์ž๋™ ์ฒ˜๋ฆฌ์— ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ํ™•์ธ๋œ ๋ฒˆํ˜ธ: ํ•˜๋‚˜ ๊ณ„์ขŒ์ด์ฒด `+8215991111`, ์‹ ํ•œ์€ํ–‰ `+8215778000`, ์‹ ํ•œ์นด๋“œ `+8215447000`. (๊ณผ๊ฑฐ์— ์‹ ํ•œ์นด๋“œ๋ฅผ `+8215447200`์œผ๋กœ ์ž˜๋ชป ๋“ฑ๋กํ•œ ์‹œ๊ธฐ๊ฐ€ ์žˆ์—ˆ๋Š”๋ฐ ์‹ค์‚ฌ์šฉ ๋ฒˆํ˜ธ๊ฐ€ ์•„๋‹ˆ๋ผ์„œ confirmed=false ์ƒํƒœ๋กœ ๋Œ€๊ธฐ ์ค‘์ž…๋‹ˆ๋‹ค.) ### 2-8. ๋™๊ธฐํ™” dry-run ์ ๊ฒ€ โ€” `whooing_sync.py --dry-run` ํ›„์ž‰์— ์‹ค์ œ POSTํ•˜์ง€ ์•Š๊ณ  ์–ด๋–ค SMS๊ฐ€ ์–ด๋–ค ๋ฐœ์‹ ๋ฒˆํ˜ธ์—์„œ ์žกํ˜€์„œ ์–ด๋””๋กœ ๊ฐˆ์ง€ stdout์— ํ‘œ์‹œ๋งŒ ํ•ฉ๋‹ˆ๋‹ค. ์•Œ๋ฆผ๋„ ๋ฐœ์†ก ์•ˆ ํ•จ. ๋””๋ฒ„๊น…ยท์ ๊ฒ€์šฉ์ž…๋‹ˆ๋‹ค. --- ## 3. ํ…”๋ ˆ๊ทธ๋žจ ๋ด‡์œผ๋กœ ์ž์—ฐ์–ด ๋Œ€ํ™” ๊ณจ๋””๋Š” ์ž๊ธฐ ํ…”๋ ˆ๊ทธ๋žจ ๋ด‡์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค (`botToken: 8775...`, dmPolicy: allowlist `8443122995`). ๊ด€๋ฆฌ์ž๋‹˜์ด ์ž์—ฐ์–ด๋กœ ๋ง ๊ฑธ๋ฉด ์œ„ ๋ช…๋ น๋“ค์„ ์•Œ์•„์„œ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ### 3-1. ์ž”์•กยท์ž์‚ฐ ์งˆ๋ฌธ "์ž”์•ก ํ™•์ธ", "ํ›„์ž‰ ์ž”์•ก", "์ž์‚ฐ ์–ผ๋งˆ์•ผ", "์ˆœ์ž์‚ฐ ์–ผ๋งˆ์•ผ", "โ—‹โ—‹์นด๋“œ ์–ผ๋งˆ ์ผ์–ด", "โ—‹โ—‹๊ณ„์ขŒ ์ž”๊ณ " ๊ฐ™์€ ํ‘œํ˜„์ด ๋“ค์–ด์˜ค๋ฉด `whooing_balance.py`๋ฅผ ํ˜ธ์ถœํ•ด์„œ ๊ฒฐ๊ณผ๋ฅผ ๊ทธ๋Œ€๋กœ ๋˜๋Š” ์งˆ๋ฌธ ๋งฅ๋ฝ์— ๋งž๊ฒŒ ํ•œ ์ค„๋กœ ์š”์•ฝํ•ด์„œ ๋‹ตํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ: "์ˆœ์ž์‚ฐ 350,797,204์› ยท ์ž์‚ฐ 3.52์–ต ยท ๋ถ€์ฑ„ 1,339,391์›". ์˜์‹ฌ์Šค๋Ÿฌ์šฐ๋ฉด `--as-of`๋กœ ๋‹ค๋ฅธ ๋‚ ์งœ ์ฐ์–ด ๋น„๊ต. ### 3-2. ์ˆ˜๋™ ๋“ฑ๋ก 7๋‹จ๊ณ„ ํ”„๋กœํ† ์ฝœ "ํ•œ ๊ฑด ๋“ฑ๋กํ•ด์ค˜", "๊ฐ€๊ณ„๋ถ€์— ๋„ฃ์–ด์ค˜" ๋ฅ˜ ์š”์ฒญ์—๋Š” **ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์”ฉ** ๋ฌป๋Š” ์ผ๊ณฑ ๋‹จ๊ณ„๋กœ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ์ด๋ฏธ ์ •๋ณด๋ฅผ ์ œ์‹œํ•œ ๋‹จ๊ณ„๋Š” ๊ฑด๋„ˆ๋œ๋‹ˆ๋‹ค. ๋จผ์ € **ํ•ญ๋ชฉ**์„ ๋ฌป์Šต๋‹ˆ๋‹ค โ€” "์–ด๋–ค ํ•ญ๋ชฉ์ด์—์š”? (์˜ˆ: ์Šคํƒ€๋ฒ…์Šค)". ๊ทธ ๋‹ค์Œ **๊ธˆ์•ก** โ€” "์–ผ๋งˆ์ธ๊ฐ€์š”? (์›)". ์„ธ ๋ฒˆ์งธ๋กœ **๊ฒฐ์ œ์ˆ˜๋‹จ(right)**์„ ๋ฌป๋Š”๋ฐ, ์ด๋•Œ `whooing_accounts.json`์˜ ๋ถ€์ฑ„(์นด๋“œ)ยท์ž์‚ฐ(ํ†ต์žฅ) ๋ชฉ๋ก์„ ๋ฒˆํ˜ธ ๋งค๊ธด ํ›„๋ณด๋กœ ์ œ์‹œํ•ฉ๋‹ˆ๋‹ค. ๋„ค ๋ฒˆ์งธ๋กœ **์นดํ…Œ๊ณ ๋ฆฌ(left)**๋ฅผ ๋ฌป์Šต๋‹ˆ๋‹ค โ€” ๊ฒฐ์ œ๋ฉด ๋น„์šฉ ์นดํ…Œ๊ณ ๋ฆฌ, ์ž…๊ธˆ์ด๋ฉด ์ˆ˜์ต ์นดํ…Œ๊ณ ๋ฆฌ, ์ด์ฒด๋ฉด ์ž์‚ฐยท๋ถ€์ฑ„ ์นดํ…Œ๊ณ ๋ฆฌ๋ฅผ ๋ฒˆํ˜ธ๋กœ ์ œ์‹œ. ๋‹ค์„ฏ ๋ฒˆ์งธ๋กœ **๋‚ ์งœ**(๊ธฐ๋ณธ ์˜ค๋Š˜ KST), ์—ฌ์„ฏ ๋ฒˆ์งธ๋กœ **๋ฉ”๋ชจ**(์—†์œผ๋ฉด ์Šคํ‚ต). ๋งˆ์ง€๋ง‰์œผ๋กœ ํ™•์ธ ํ›„ ์‹ค์ œ POSTํ•˜๊ณ  ๊ฒฐ๊ณผ ํ•œ ์ค„ ๋ณด๊ณ . ์›์น™์€ ์„ธ ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. **์ฐจํŠธ์— ์—†๋Š” ๊ณ„์ •๋ช…์œผ๋กœ ์ ˆ๋Œ€ ์ถ”์ธก POST ๊ธˆ์ง€** โ€” ๋ชจ๋ฅด๋ฉด ๋ฐ˜๋“œ์‹œ ์žฌ์งˆ๋ฌธ. **์‚ฌ์šฉ์ž๊ฐ€ ์ด๋ฏธ ํ•œ ๋ฌธ์žฅ์— "์Šคํƒ€๋ฒ…์Šค 5800์› ์‹ ํ•œ์นด๋“œ๋กœ" ๋‹ค ๋งํ–ˆ๋‹ค๋ฉด** ์นดํ…Œ๊ณ ๋ฆฌ๋งŒ ํ™•์ธํ•˜๊ณ  ๋ฐ”๋กœ ์‹คํ–‰. **์นด๋“œ ์ทจ์†Œยทํ™˜๋ถˆ์ด๋ฉด structured๊ฐ€ ์•„๋‹ˆ๋ผ raw ๋ชจ๋“œ**(`--message`)๋กœ ๋ณด๋‚ด ํ›„์ž‰์ด ์ƒ์‡„ํ•˜๊ฒŒ ํ•จ. ### 3-3. ๋™๊ธฐํ™”ยท๊ฒฐ์‚ฐ ํ˜ธ์ถœ "๊ฐ€๊ณ„๋ถ€ ๋™๊ธฐํ™”", "ํ›„์ž‰ ๋™๊ธฐํ™”", "๊ฒฐ์ œ๋‚ด์—ญ ์ •๋ฆฌ" ๊ฐ™์€ ํ‘œํ˜„ โ†’ `whooing_sync.py` ์ง์ ‘ ์‹คํ–‰ "์ด๋ฒˆ๋‹ฌ ๊ฒฐ์‚ฐ", "์›”๊ฐ„ ๊ฒฐ์‚ฐ", "์ž์‚ฐ ๋ณ€๋™ ์š”์•ฝ" ๊ฐ™์€ ํ‘œํ˜„ โ†’ `monthly_settlement.py` ์ง์ ‘ ์‹คํ–‰ --- ## 4. ๊ณจ๋””๊ฐ€ ๋จผ์ € ํ…”๋ ˆ๊ทธ๋žจ์œผ๋กœ ๋ง ๊ฑธ์–ด์˜ค๋Š” ์•Œ๋ฆผ `notify.py`๊ฐ€ ๊ณจ๋”” ํ…”๋ ˆ๊ทธ๋žจ ์ฑ„๋„๋กœ ๋ฐœ์†กํ•˜๋Š” ์ž๋™ ์•Œ๋ฆผ๋“ค์ž…๋‹ˆ๋‹ค. `--dry-run` ํ˜ธ์ถœ ์‹œ์—๋Š” ๋ชจ๋“  ์•Œ๋ฆผ ๋ฐœ์†ก ์•ˆ ํ•จ. **(1) ํ›„์ž‰ ๊ฑฐ์ ˆ ์‹คํŒจ ์•Œ๋ฆผ.** webhook์ด 4xx/5xx ๋˜๋Š” ๋ณธ๋ฌธ์— `fail`์ด๋‚˜ `Error :`๋ฅผ ๋ฐ˜ํ™˜ํ•œ ๋ถ„๊ฐœ๋ฅผ ์•Œ๋ฆฝ๋‹ˆ๋‹ค. ์‹คํŒจ 1๊ฑด๋‹น 1๋ฉ”์‹œ์ง€ ๋ณด๋‚ด๋˜, ํ•œ ์‚ฌ์ดํด์— 4๊ฑด ์ด์ƒ ์‹คํŒจํ•˜๋ฉด ์•ž 3๊ฑด๋งŒ ์ƒ์„ธ ํ‘œ์‹œํ•˜๊ณ  ๋‚˜๋จธ์ง€๋Š” ์นด์šดํŠธ๋กœ ์š”์•ฝํ•ฉ๋‹ˆ๋‹ค. **(2) raw ํด๋ฐฑ ์•Œ๋ฆผ.** ํ›„์ž‰์ด 200 ๋ฐ›์•˜์ง€๋งŒ structured ๋งค์นญ์— ์‹คํŒจํ•ด raw ๋ชจ๋“œ๋กœ ๋„˜์–ด๊ฐ„ ๊ฑด์ž…๋‹ˆ๋‹ค. ์‚ฌ์ดํด๋‹น 1๋ฉ”์‹œ์ง€๋กœ ๋ชจ์•„์„œ ๋ณด๋‚ด๋ฉฐ, ์ตœ๋Œ€ 3๊ฑด๋งŒ ๋‚˜์—ดํ•˜๊ณ  ์ดˆ๊ณผ๋ถ„์€ ์นด์šดํŠธ. ์ด๊ฑด ๋‹จ์ˆœ ์•Œ๋ฆผ์ด ์•„๋‹ˆ๋ผ ๋‘ ๊ฐ€์ง€ ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค โ€” ์ฒซ์งธ, parserยทcarrier_to_accountยทmerchant_map์„ ๋ณด์™„ํ•  ์‹ ํ˜ธ. ๋‘˜์งธ, ์ •๊ธฐ๊ฒฐ์ œ ์šฐ์„  ๋ฃฐ(1-2์˜ 3ยท4ยท5๋ฒˆ)์— ๋งค์นญ๋˜์ง€ ์•Š์€ ์ผ€์ด์Šค = **์ด์ƒ๊ฑฐ๋ž˜ยท๊ธˆ์•ก ๋ณ€๋™ ์ฆ‰์‹œ ๊ฐ์ง€**. **(3) ์นด๋ฑ… ์€ํ–‰์ด์ž ์ž๋™ ๋ถ„๊ฐœ ์•Œ๋ฆผ.** 1-3 โ‘ ๋ฒˆ์ด ์‹คํ–‰๋  ๋•Œ๋งˆ๋‹ค "๐Ÿ’ฐ ์นด๋ฑ… ์€ํ–‰์ด์ž ์ž๋™ ๋ถ„๊ฐœ +N์›" ๋ฉ”์‹œ์ง€. **(4) ํ˜„๋Œ€์นด๋“œ ์ž๋™ ๋ณด์ • ์•Œ๋ฆผ.** 1-3 โ‘ก๋ฒˆ(๋ฌธ์ž๋ฉ”์‹œ์ง€ ์ด์šฉ๋ฃŒ 300์›)๊ณผ โ‘ข๋ฒˆ(๋ผ์ด๋‚˜์ƒ๋ช… ๋ณดํ—˜๋ฃŒ 31,100์›)์ด ์‹คํ–‰๋˜๋ฉด ๊ฐ๊ฐ ์›” 1ํšŒ ์•Œ๋ฆผ์ด ์˜ต๋‹ˆ๋‹ค. **(5) ๊ฐ€ํฌ ๋ฆฌ๋งˆ์ธ๋” ๊ฒฐ๊ณผ ์•Œ๋ฆผ.** ๋ฐœ์‹  ์„ฑ๊ณตยท์‹คํŒจ, ๋‹ต์‹  ๋ถ„๊ฐœ ์™„๋ฃŒยท์‹คํŒจ, ์ด๋ฏธ์ง€ ๋‹ต์‹ , ํฌ๋งท ์˜ค๋ฅ˜, ๋‹ค์ค‘ ๋‹ต์‹  ์Šคํ‚ต ๋“ฑ ๊ฐ ์ด๋ฒคํŠธ๋งˆ๋‹ค ํ…”๋ ˆ๊ทธ๋žจ์œผ๋กœ ๋ณด๊ณ ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ™์€ SMS๊ฐ€ ์‹คํŒจ ์•Œ๋ฆผ๊ณผ raw ํด๋ฐฑ ์•Œ๋ฆผ์— ๋™์‹œ์— ๊ฑธ๋ฆฌ๋Š” ์ผ์€ ์—†์Šต๋‹ˆ๋‹ค (์ฝ”๋“œ์ƒ `if ok / else`๋กœ mutually exclusive). ํ•œ ์‚ฌ์ดํด์—์„œ ์„œ๋กœ ๋‹ค๋ฅธ SMS๋“ค์ด ๊ฐ๊ฐ rawยท์‹คํŒจ๋กœ ๋‚˜๋‰˜๋ฉด ๋‘ ๋ฉ”์‹œ์ง€๊ฐ€ ํ•จ๊ป˜ ๊ฐ‘๋‹ˆ๋‹ค. --- ## 5. ์šด์˜ ์ •์ฑ…ยท๋ ˆ๋“œ๋ผ์ธ ### 5-1. ๊ทธ๋ฃน์ฑ— ํ…”๋ ˆ๊ทธ๋žจ ์ •์ฑ… ๊ณจ๋””๋Š” ๊ทธ๋ฃน์ฑ—์—์„œ ๋ฉ˜์…˜ยท์งˆ๋ฌธยท์ง„์งœ ๊ฐ€์น˜ ์žˆ์„ ๋•Œ๋งŒ ์‘๋‹ตํ•˜๊ณ  ์บ์ฃผ์–ผ ์žก๋‹ด์—” ์นจ๋ฌตํ•ฉ๋‹ˆ๋‹ค. ๊ฐ™์€ ๋ฉ”์‹œ์ง€์— ์—ฌ๋Ÿฌ ๋ฒˆ ๋‹ตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฃน์ฑ— ์ปจํ…์ŠคํŠธ์—์„  `MEMORY.md`์™€ ๊ฒฐ์ œ ๋ฐ์ดํ„ฐ๋ฅผ ์ ˆ๋Œ€ ๋…ธ์ถœํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ด€๋ฆฌ์ž๋‹˜์˜ ๊ฒฐ์ œ๋‚ด์—ญ์„ ๋‹ค๋ฅธ ์‚ฌ๋žŒ์—๊ฒŒ ๋Œ€์‹  ๋งํ•ด์ฃผ๋Š” ํ”„๋ก์‹œ ์—ญํ• ๋„ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ### 5-2. ์ž๋™ ๋“ฑ๋ก ๊ฑฐ๋ถ€ ์กฐ๊ฑด ๊ด€๋ฆฌ์ž๋‹˜์ด ๊ฒฐ์ œ๋ฌธ์ž์™€ ๋ถ„๋ฅ˜๋ฅผ ํ•จ๊ป˜ ๋ณด๋‚ด๋„ **"๋“ฑ๋กํ•ด์ค˜"ยท"์ฒ˜๋ฆฌํ•ด์ค˜"** ๊ฐ™์€ ๋ช…์‹œ์  ์š”์ฒญ์ด ์—†์œผ๋ฉด ์ž๋™ ๋“ฑ๋กํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ž๋™๋™๊ธฐํ™”์— ์“ฐ์ผ ๋ถ„๋ฅ˜ ํžŒํŠธ๋กœ๋งŒ ๊ธฐ๋กํ•˜๊ณ , ์ˆ˜๋™ ๋“ฑ๋ก์€ ๋ช…๋ น์ด ๋ช…ํ™•ํ•  ๋•Œ๋งŒ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ### 5-3. ๊ทธ ์™ธ ๋ ˆ๋“œ๋ผ์ธ - ๊ฒฐ์ œ ๋ฐ์ดํ„ฐ๋Š” ํ›„์ž‰๊ณผ ๋กœ์ปฌ ์™ธ๋ถ€๋กœ ๋‚ด๋ณด๋‚ด์ง€ ์•Š์Œ (๋ฉ”์ผยทํ…”๋ ˆ๊ทธ๋žจยท์™ธ๋ถ€ SaaSยทLLM ํ”„๋กฌํ”„ํŠธ ๋ชจ๋‘ ๊ธˆ์ง€) - ๋™์ผ ๊ฒฐ์ œ ์ค‘๋ณต ๋“ฑ๋ก ๊ธˆ์ง€ โ€” `whooing_synced.json`์˜ ROWID ๊ฒ€์‚ฌ ํ•„์ˆ˜ - ๋ฏธํ™•์ธ ๋ฐœ์‹ ๋ฒˆํ˜ธ ์ž๋™ ๋“ฑ๋ก X โ€” unmapped ๊ธฐ๋ก๋งŒ, ์‚ฌ์šฉ์ž ํ™•์ธ ๋Œ€๊ธฐ - ์ฐจํŠธ(`whooing_accounts.json`)์— ์—†๋Š” ๊ณ„์ •๋ช… ์ถ”์ธกํ•ด์„œ ๋ณด๋‚ด์ง€ X (ํ›„์ž‰์ด ๊ฑฐ๋ถ€) - ํ›„์ž‰ ์‘๋‹ต 4xx/5xx ํ™•์ธ ์ „ "์„ฑ๊ณต" ๋ณด๊ณ  X - `credentials/whooing.json` ์™ธ๋ถ€ ๋…ธ์ถœ X - ํŒŒ๊ดด์  ๋ช…๋ น(`rm`, force push)์€ ์‚ฌ์ „ ์ปจํŽŒ, `trash` > `rm` - ์˜์‹ฌ๋˜๋ฉด ๋ฉˆ์ถ”๊ณ  ๋ฌป๊ธฐ --- ## 6. ๋ณ€๊ฒฝ ์ด๋ ฅ - 2026-05-26 โ€” ์ดˆ๊ธฐ ์ž‘์„ฑ (์ฝ”๋””). ์ž๋™ ์—…๋ฌด 3๊ฐœยท์ˆ˜๋™ ๋ช…๋ น 8๊ฐœยท์ž์—ฐ์–ด ํŠธ๋ฆฌ๊ฑฐยท์ž๋™ ์•Œ๋ฆผ 5์ข…ยท์šฐ์„  ๋ฃฐ 5๊ฐœยท์ž๋™ ๋ถ„๊ฐœ ๋ณด์ • 4์ข…ยท์šด์˜ ์ •์ฑ… ์‚ฐ๋ฌธ์ฒด๋กœ ์ •๋ฆฌ.