์ด ๋๋ ํ ๋ฆฌ์ ํฌ๋กค๋ฌ๋ ์ฌ์ฉ์๊ฐ ๊ตฌ๋ ํ ์น์ฌ์ดํธ(ํ์ฌ: ๋๊ตญ๋ SW๊ต์ก์ ๊ณต์ง์ฌํญ) ๋ฅผ ์ฃผ๊ธฐ์ ์ผ๋ก ํฌ๋กค๋งํ๊ณ , ์๋ก ์ฌ๋ผ์จ ๊ฒ์๊ธ์ ํต์ฌ ๋ด์ฉ์ ์์ฝํด์ ๋ฐฑ์๋๋ก ์ ๋ฌํ๋ ์ญํ ์ ํฉ๋๋ค.
-
๊ตฌ๋ ์ ๋ณด ์กฐํ
services/subscription_client.fetch_subscriptions()- ๋ฐฑ์๋
GET /internal/subscriptionsํธ์ถ - ๊ฐ ๊ตฌ๋
์ ๋ํด
id,user_id,site_url,site_alias,keyword,urgent,last_seen_post_id์ ๋ณด๋ฅผ ๊ฐ์ ธ์ต๋๋ค.
-
์ฌ์ดํธ ํฌ๋กค๋ง
main.process_subscription(sub)์์DonggukSwBoardCrawler์ฌ์ฉfetch_post_list(site_url)๋ก ๊ณต์ง ๋ชฉ๋ก(์ต์ โ๊ณผ๊ฑฐ)์ ๊ฐ์ ธ์ค๊ณ , ๊ฐ ๊ฒ์๊ธ์id,url,title,date๋ฅผ ์์งํฉ๋๋ค.
-
์ ๊ฒ์๋ฌผ ํํฐ๋ง
last_seen_post_id๊ธฐ์ค์ผ๋ก ์ด์ ์ ๋ณธ ๊ฒ์๊ธ๊น์ง๋ ๊ฑด๋๋ฐ๊ณ , ๊ทธ ์ดํ์ ์ฌ๋ผ์จ ๊ฒ์๊ธ๋งfilter_new_posts()๋ก ์ถ๋ฆฝ๋๋ค.- ์ฒซ ์คํ(
last_seen_post_id == None)์ผ ๋๋ ์๋ฆผ์ ๋ง๋ค์ง ์๊ณ , ๊ฐ์ฅ ์ต์ ๊ฒ์๊ธ์id๋ฅผ ๊ธฐ์ค์ ์ผ๋ก ์ ์ฅ๋ง ํฉ๋๋ค.
-
ํค์๋ ํํฐ + ์์ฝ ์์ฑ
- ์ ๊ฒ์๋ฌผ๋ค์ ๋ํด
fetch_post_content(post["url"])๋ก ๋ณธ๋ฌธ ์ ์ฒด๋ฅผ ํฌ๋กค๋ง. - ๊ตฌ๋
์ ์ค์ ๋
keyword๊ฐ ์ ๋ชฉ/๋ณธ๋ฌธ์ ํฌํจ๋ ๋๋ง ์ฒ๋ฆฌ (keyword_match). services/summarizer.summarize(text)๋ฅผ ํธ์ถํด ์์ฝ ์์ฑGEMINI_API_KEY๊ฐ ์ค์ ๋์ด ์์ผ๋ฉด Gemini API(gemini-2.5-flash) ๋ก ๊ณต์ง ๋ณธ๋ฌธ์์ ์ ๋ชฉ/์๊ฐ/์ฅ์ ์ค์ฌ์ผ๋ก ์์ฝ- ํค๊ฐ ์๊ฑฐ๋ ์ค๋ฅ ์์๋ ํ ์คํธ ์๋ถ๋ถ๋ง ์๋ผ์ ํด๋ฐฑ.
- ์ ๊ฒ์๋ฌผ๋ค์ ๋ํด
-
์๋ฆผ ์์ฑ + last_seen ๊ฐฑ์
services/notification_client.create_alert(alert_payload)- ๋ฐฑ์๋
POST /internal/alertsํธ์ถ โSummary/์๋ฆผ ๋ ์ฝ๋ ์์ฑ.
- ๋ฐฑ์๋
- ๋ชจ๋ ์ ๊ฒ์๋ฌผ์ ์ฒ๋ฆฌํ ๋ค, ๊ฐ์ฅ ์ต์ ๊ฒ์๊ธ์ ID๋ก
update_subscription_last_seen(subscription_id, latest_id)์คํ
โPATCH /internal/subscriptions/{id}/last_seen๋ก ๋ง์ง๋ง ๋ณธ ๊ฒ์๋ฌผ ID ์ ๋ฐ์ดํธ.
main.debug_fetch_first_post() ๋ฅผ ํตํด:
- ์ฒซ ๋ฒ์งธ ๊ตฌ๋
์
site_url์์ ๊ฒ์๋ฌผ ๋ชฉ๋ก๊ณผ ์ฒซ ๊ฒ์๋ฌผ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ณ , - ์ฒซ ๊ฒ์๋ฌผ ๋ณธ๋ฌธ ์ผ๋ถ์
summarize()๊ฒฐ๊ณผ๋ฅผ ์ฝ์์ ์ถ๋ ฅํด์
ํฌ๋กค๋ง + ์์ฝ์ด ์ ์ ๋์ํ๋์ง ๋น ๋ฅด๊ฒ ํ์ธํ ์ ์์ต๋๋ค.