
"위험한 지름길보다 잘 관리된 길을 택하라": 웹 스크레이핑(Web Scraping)을 버리고 공식 RSS와 Gemini 기반의 AI 앱으로
요약
웹 스크레이핑의 불안정성 대신 공식 RSS 피드와 Gemini 2.5 Flash를 활용하여 구축한 자동 AI 트렌드 분석 시스템 'Puoppo'의 설계 철학을 소개합니다. 데이터 파이프라인의 안정성과 유지보수 효율성을 최우선으로 고려한 기술적 선택을 다룹니다.
핵심 포인트
- 웹 스크레이핑의 IP 차단 및 레이아웃 변경 문제를 RSS 피드 활용으로 해결
- Gemini 2.5 Flash를 통한 고속 뉴스 수집 및 요약 파이프라인 구축
- Python, Flask, RSS 파싱을 이용한 경량화된 시스템 설계
- 도메인 지식을 바탕으로 한 안정적인 데이터 제어 중심의 설계 철학
RSS × Gemini 2.5 Flash로 구축한 자동 AI 트렌드 분석 시스템 "Puoppo"의 설계 철학 및 실질적 솔루션
GitHub Repository: tosane932 / puoppo_app
1. 서론
일본에서 활동 중인 트럭 운전사이자, 물류 도메인 지식을 활용하여 웹 엔지니어(Web Engineer)로 전환하기 위해 Python을 독학하고 있는 개발자입니다.
이 글에서는 제가 Python 공부 42시간째에(IT 배경 지식이나 이전 개발 경험 없이) 구축한 자동 AI 트렌드 분석 시스템인 "Puoppo"의 설계 철학 및 기술적 선택에 대해 공유하고자 합니다.
단기적인 유행을 쫓는 눈속임이 아니라, 결코 해지지 않는 믿음직한 청바지처럼 "현장의 도메인 데이터를 안정적으로 제어하는 것"에 초점을 맞춘 시대를 초월하는 설계 철학을 바탕으로 시스템을 구축했습니다.
2. 문제 정의 및 시스템 개요
배경 및 문제
매일 기술 트렌드와 뉴스를 수집할 때, 여러 소스를 방문하고 노이즈가 섞인 긴 기사들을 소화하는 것이 주요 병목 현상이 되었습니다. 저는 매일 아침 제한된 시간(예: 일본식 오믈렛을 만드는 데 걸리는 몇 분) 내에 고밀도의 1차 정보를 소비할 수 있는 메커니즘이 필요했습니다.
솔루션
주요 사양
- 성능: 키워드 입력부터 수집 및 요약까지의 전체 파이프라인을 약 10~15초 내에 실행합니다.
- UI/UX: 검색에서 결과로 직선 연결되는 단순한 1컬럼 UI를 통해 사용자의 혼란을 제거했습니다.
기술 스택 (Tech Stack)
- 언어 / 프레임워크 (Language / Framework): Python 3 / Flask
- 핵심 로직 (Core Logic): RSS 피드 파싱 (RSS Feed Parsing, 동적 엔드포인트 제어)
- LLM 통합 (LLM Integration): Gemini API (
gemini-2.5-flash) - 프론트엔드 (Frontend): HTML / Jinja2 / JavaScript (프레임워크 미사용)
- 환경 (Environment): Ubuntu (Lubuntu) / VS Code / .venv
3. 데모
실제 실행 환경과 UI 디자인은 아래 데모 영상(YouTube: 7분 49초)에서 확인할 수 있습니다.
(이미지를 클릭하면 YouTube에서 시청할 수 있습니다)
4. 현장 관점에서의 기술적 선택 및 트레이드오프 (Technical Choices & Trade-offs)
① 스크레이핑(Scraping)의 한계와 "안전한 엔드포인트"로서의 RSS 채택
초기 설계에서는 주요 뉴스 사이트로부터 직접적인 웹 스크레이핑 (Web Scraping)을 테스트했으나, IP 차단과 레이아웃 변경으로 인한 유지보수 비용이 큰 장애물로 작용했습니다.
차단을 기술적으로 "우회"하려고 시도하는 대신, 언론사가 제공하는 공식 RSS 피드를 활용하는 방향으로 전환했습니다.
이 결정은 실무 물류 경험에서 비롯되었습니다: "잘 관리된 신뢰할 수 있는 길을 택하는 것이 지름길을 강제로 이용하는 것보다 전반적인 효율성(속도) 면에서 더 낫다." 이를 통해 안전하고 신뢰할 수 있는 데이터 파이프라인 (Data Pipeline)을 즉시 구축할 수 있었습니다.
② 10시간 구축을 위한 Flask 선택
이 시스템의 핵심 가치는 즉각적인 데이터 흐름입니다: 동적 키워드로부터 데이터를 수집(Aggregating)하고, 이를 LLM (대규모 언어 모델)에 전달하여 결과를 반환하는 과정입니다.
이 단계에서는 인증 (Authentication)과 ORM (Object-Relational Mapping)이 불필요했기에, 빠른 라우팅 (Routing) 설정이 가능한 마이크로 프레임워크 (Micro-framework)인 Flask를 선택했습니다. 과도한 엔지니어링 (Over-engineering)을 걷어냄으로써, 단 하루(~10시간) 만에 프로토타입을 출시할 수 있었습니다.
③ Gemini 2.5 Flash를 통한 비용 및 속도 최적화
단일 요청에 최대 100개의 기사 텍스트 컨텍스트 (Context)를 주입하기 위해서는 방대한 토큰 (Token) 용량을 가진 LLM 모델이 필요했으며, 이에 따라 Gemini는 명확한 선택지였습니다.
또한, 개인 프로젝트로서 빠른 응답 시간 (10~15초)과 뛰어난 가성비 사이의 균형을 맞추기 위해, 2026년 5월 기준 선택된 경량 모델인 gemini-2.5-flash를 선정했습니다.
④ 디자인을 걷어내고 1컬럼 UI에 집중
최신 JavaScript 프레임워크 (React/Vue)를 사용하여 컴포넌트 아키텍처 (Component Architecture)를 구축하는 대신, 순수 HTML/CSS로 구현했습니다.
복잡한 UI 레이아웃에 자원을 소모하는 것을 배제함으로써, "사용자가 스크롤을 멈추지 않고 정확한 정보를 머릿속에 매끄럽게 흡수할 수 있도록 하는" 순수한 유틸리티 (Utility) 기능에 우선순위를 두었습니다.
5. 🚀 설정 지침 (Mac / Linux)
가상 환경 (Virtual Environment)에서 로컬로 실행하는 단계 (Linux / macOS):
# 1. 저장소 복제 (Clone the repository)
git clone https://github.com/tosane932/puoppo_app.git
cd puoppo_app
...
6. 🚀 설정 지침 (Windows)
Windows에서 로컬로 실행하는 단계:
# 1. 저장소 복제 (Clone the repository)
git clone https://github.com/tosane932/puoppo_app.git
cd puoppo_app
...
7. 향후 로드맵 (기술 심화 및 역량 증명)
현재의 기능은 초기 요구사항을 충족하고 신뢰할 수 있는 결과를 제공하지만, 저는 시스템을 프로덕션 수준(production-ready)의 품질로 격상시키기 위해 2026년 말까지 2단계의 리팩터링 (refactoring) 과정을 계획하고 있습니다.
① 결합도가 높은 아키텍처의 디커플링 (Decoupling)
현재 Flask에 집중되어 있는 로직(RSS 파싱, LLM 제어, 뷰 제어)을 정리하고 분리하여, 클린 아키텍처 (Clean Architecture)에서 영감을 받은 디커플링된 계층형 아키텍처 (layered architecture)로 전환할 것입니다.
② 자동화된 테스트 인프라 구축
외부 API (Gemini) 또는 RSS 피드 형식의 변화에 적응하기 위해, Pytest를 사용하여 단위 테스트 (unit tests) 및 모의 테스트 (mock tests)를 도입하고, 지속적 통합 (CI) 중심의 견고한 코드베이스를 구축할 것입니다.
8. 결론
"Puoppo"를 개발하면서 저는 미니멀리즘 (minimalism)의 힘을 다시 한번 확인했습니다. 즉, 오버엔지니어링 (over-engineering)이나 유행하는 기술 스택 (tech stacks)에 휘둘리지 않고, "눈앞의 특정 문제를 해결하기 위해 필요한 구성 요소만을 단순하게 결합하는 것"의 중요성입니다.
뉴스를 찾는 데 낭비되는 시간을 줄이고, 생성된 리소스를 사용하여 다음에 무엇을 만들지 결정하는 것—이 시스템은 저에게 엔지니어링의 진정한 즐거움을 일깨워 줍니다.
GitHub 저장소: tosane932 / puoppo_app
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기