← Projects
Data · Serverless

지배뉴스 — 서버리스 뉴스 도미넌스

RSS 5,000건을 벡터로 군집화해 "오늘의 이슈 지형"을 보여주는 서버리스 앱 (운영비 0원 목표)

소속
무한네트웍스
기간
2024.06 – 2025.04
역할
기획 · 풀스택 · 운영
기여도
100%
React NativePythonQdrantGPT APICloudflare R2 (CDN)
01

Overview

RSS 기반으로 매일 수천 건의 기사를 수집·벡터화하고, 카테고리별로 군집화해 "지금 어떤 이슈가 지배적인지"를 트리맵(도미넌스)으로 보여주는 React Native 뉴스 앱입니다. Google Play에 출시했습니다.

02

Background

뉴스는 넘치지만 "오늘 무엇이 중요한가"를 한눈에 보긴 어렵습니다. 또한 개인 프로젝트로서 서버 운영비 없이 지속 가능한 구조가 필요했습니다.

03

Problem

서버 비용 없이 매일 데이터를 갱신해 앱에 제공해야 했고, RSS의 비정형 데이터(이미지 URL 미제공 등) 정제와 유사 기사 군집화·대표 주제 명명이 과제였습니다.

04

My Role

  • 데이터 수집~정제~업로드 전 파이프라인(Python) 설계·구현
  • Qdrant 벡터DB 기반 군집화 및 GPT 기반 대표 주제 명명
  • React Native 앱 및 서버리스 배포 아키텍처 설계·운영
05

Architecture

서버를 두지 않고, 로컬 스케줄러가 매일 파이프라인을 돌려 결과 JSON을 Cloudflare R2(CDN)에 업로드합니다. 네이티브 앱은 CDN의 정적 데이터만 읽어 동작하므로 상시 서버가 필요 없습니다.

rss.py — RSS 5,000건 수집imgDownload.py — 100 스레드 헤드라인 이미지 크롤링input.py — Qdrant 벡터 적재cluster.py — 6개 카테고리 × 10개 군집화gpt.py — 군집별 대표 주제 명명 (GPT)treemap.py — 도미넌스 트리맵 데이터 생성upload_to_r2.py — Cloudflare R2(CDN) 업로드React Native 앱이 CDN 데이터 소비
06

Key Features

  • 6개 카테고리(정치·경제·사회·과학·문화·국제) 이슈 분포 트리맵
  • 매일 자동 갱신되는 군집 뉴스
  • 서버리스 구조로 상시 서버 비용 0원
07

Technical Decisions

WebServer 대신 CDN 정적 데이터 + 네이티브 소비
왜 → 클라우드 서버라도 상시 비용이 발생하므로, 운영비 0원 목표를 위해 서버리스로 설계했습니다.
RSS 이미지가 비정형이라 별도 크롤러 구현
왜 → RSS가 정형 이미지 URL을 주지 않아, 100 스레드 크롤러로 헤드라인 이미지를 별도 수집했습니다.
군집 대표명을 GPT로 명명
왜 → 전문기사 role 프롬프트로 통찰적 주제명을 부여해 가독성을 높였습니다.
08

Troubleshooting

문제 · RSS 피드가 정형 이미지 URL을 제공하지 않음
해결 · 기사 본문에서 헤드라인 이미지를 수집하는 멀티스레드 크롤러 구현.
문제 · 상시 서버 없이 매일 데이터 갱신 필요
해결 · 로컬 PC 스케줄러(매일 10시, Windows 레지스트리 등록) + R2 업로드로 무중단 갱신.
09

Result

  • Google Play 정식 출시
  • 서버리스 구조로 운영비를 최소화하며 매일 자동 갱신 운영
10

What I Learned

  • 비정형 데이터 정제 파이프라인과 벡터 군집화의 실전 적용
  • 비용 제약을 아키텍처(서버리스+CDN)로 푸는 설계 사고