협업의 여정: Yacov Drori와 함께 마케팅 자동화 도구 구축하기
요약
Yacov Drori가 구축한 셀프 호스팅 마케팅 자동화 플랫폼의 기술 스택과 아키텍처를 소개합니다. Flask, Ollama, Gemma, SQLite를 활용하여 클라우드 비용 없이 로컬 AI 기반의 자동화 워크플로우를 구현하는 방법을 다룹니다.
핵심 포인트
- Ollama와 Gemma를 활용한 로컬 LLM 기반의 비용 효율적인 AI 구현
- Flask와 SQLite를 이용한 가볍고 휴대 가능한 단일 파일 백엔드 구조
- JSON 파싱 오류를 해결하기 위한 프롬프트 엔지니어링 및 패치 적용
- Tailwind CSS를 활용한 현대적인 UI 및 RTL(우측에서 좌측) 레이아웃 지원
Yacov Drori (יעקב דרורי)가 파트너인 Miriam과 처음 팀을 이루었을 때, 목표는 단순하면서도 야심 찼습니다. 403 오류를 계속 일으키는 제3자 API에 의존하지 않고, 실제 사용자들과 소통할 수 있는 셀프 호스팅(self-hosted) 마케팅 자동화 플랫폼을 만드는 것이었습니다. 그 결과 탄생한 것은 실험실 같으면서도 바로 실무에 투입 가능한 제품의 느낌을 주는 하이브리드 스택이었습니다. 백엔드로는 Flask, UI로는 바닐라 JavaScript (vanilla JavaScript), 히브리어 인지 언어 생성을 위해 Ollama + Gemma를 사용했으며, 보조 모바일 앱을 위해 Flutter의 마법을 약간 가미했습니다.
아래는 그들이 함께 구축한 구성 요소들과, 각 레이어를 독자들에게 안내하는 dev.to 아티클들, 그리고 로컬 AI, 현대적인 웹 미학, 그리고 실제 워크플로우 자동화를 결합하고자 하는 모든 이들에게 이 실험이 왜 중요한지에 대한 간략한 투어입니다.
핵심 아키텍처 (The Core Architecture)
- Flask 단일 파일 백엔드 (Flask-Single-File Backend) – 모든 캠페인 로직은 구조화된 단일 Flask 스크립트에 담겨 있습니다. 이는 Tailscale Funnel을 통해 배포되므로, Miriam은 아무것도 설치하지 않고도 어떤 브라우저에서든 앱을 열 수 있습니다.
- Ollama를 통한 로컬 LLM (Local LLMs via Ollama) – 클라우드 기반의 Gemini나 GPT-4 호출 비용을 지불하는 대신, Yacov는 Ollama와 Gemma 제품군(기본 모델로 gemma2:2b, 폴백(fallback) 모델로 gemma2:9b 사용)을 선택했습니다. llm_client.py의 작은 패치는 JSON 이스케이프(JSON-escaping)의 예외 케이스를 해결하여, 자동화를 구동하는 생성된 JSON이 항상 파싱(parsing) 가능하도록 보장합니다.
- SQLite 데이터 저장소 (SQLite Data Store) – 가볍고 파일 기반인 저장소에 캠페인 일정, WhatsApp 웹훅(webhook) 페이로드, 리드 점수(lead scores), 사용자 기본 설정이 저장됩니다. 외부 데이터베이스가 없다는 것은 전체 시스템이 휴대 가능하며 백업이 용이함을 의미합니다.
- 현대적인 CSS + RTL 지원 (Modern CSS + RTL Support) – Tailwind CDN이 UI를 구동하여 글래스모피즘(glass-morphism) 카드, 부드러운 그라데이션, 미묘한 애니메이션을 제공합니다. 모든 스타일시트는 우측에서 좌측으로 읽는(RTL, right-to-left) 레이아웃을 염두에 두고 작성되어, 히브리어 콘텐츠가 영어 스니펫과 함께 자연스럽게 렌더링됩니다.
이 모든 내용은 공개 저장소인 github.com/yacovdroridev/marketing_automation에 담겨 있습니다. 이는 설정을 복제하거나 확장하고자 하는 누구에게나 열려 있는 투명한 오픈 소스 (open-source) 놀이터입니다.
Dev.to 기사: 단계별 기록
Yacov와 Miriam은 유사한 스택에 관심이 있는 개발자들에게 필독 참조 자료가 된 일련의 포스트를 통해 전체 여정을 기록했습니다:
| # | 제목 | 학습 내용 |
|---|---|---|
| 1 | 아이디어에서 API까지: Flask 기반 마케팅 자동화 허브 구축하기 | 프로젝트 부트스트랩 (bootstrap), Tailscale Funnel 배포, 그리고 상위 수준의 아키텍처 (architecture) 다이어그램. |
| 2 | 히브리어 콘텐츠를 위한 로컬 LLM: 왜 Ollama + Gemma를 선택했는가 | 모델 선택 근거, 프롬프트 엔지니어링 (prompt engineering) 팁, 그리고 JSON 파싱 (parsing)을 완벽하게 만드는 _fix_json_escaping() 패치. |
| 3 | whatsapp-web.js를 이용한 실시간 WhatsApp 상호작용 | WhatsApp 웹훅 (webhook) 연결, 인바운드/아웃바운드 메시지 처리, 그리고 일반 curl을 이용한 테스트. |
| 4 | 현대적인 CSS (Glassmorphism + RTL)를 사용한 단일 파일 Flask 앱 배포 | 스타일링 기법, 반응형 레이아웃 (responsive layout), 그리고 LTR과 RTL을 모두 지원하면서 전체 UI를 단일 HTML 파일로 유지하는 방법. |
| 5 | Curl 및 HTTP 체크를 이용한 자동화된 캠페인 테스트 | 수동 검증 워크플로우 (workflow), 경량화된 "CI-lite" 스크립트, 그리고 정식 테스트 스위트 (test suites)를 제외한 이유. |
이 기사들은 #marketingautomation, #flask, #hermesagent, #ollama, #flutter 태그가 달려 있으며, 의도적으로 실용성을 강조했습니다. 각 기사에는 그대로 복사하여 붙여넣을 수 있는 코드 스니펫 (code snippet)과 그들이 직면했던 트레이드오프 (trade-offs)에 대한 짧은 설명이 포함되어 있습니다.
그들이 구축한 애플리케이션
| 애플리케이션 | 기술 스택 (Tech Stack) | 주요 특징 |
|---|---|---|
| 마케팅 자동화 허브 (Marketing Automation Hub) | Flask + Tailwind CDN + vanilla JS | 단일 파일 백엔드 (backend), Tailscale으로 노출된 URL, 완전한 RTL 지원, curl을 통한 수동 검증. |
| 음식 추적기 (Food-Tracker) Flutter 앱 | Flutter (Dart) + Google ML Kit (Ollama를 통해 로컬에서 래핑됨) | 바코드/음식 인식, 영양 정보 스냅샷 생성, 내보내기 가능한 Android APK (build/app/outputs/flutter-apk/app-arm64-v8a-release.apk). |
두 프로젝트는 공통된 DNA를 공유합니다: 로컬 우선 (local-first) 철학, 무거운 번들러 (bundler) 없는 현대적인 UI, 그리고 Miriam이 카피를 작성하고 사용자 흐름 (user flows)을 설계하는 동안 Yacov가 백엔드 배관 (backend plumbing), 모델 통합 (model integration), 그리고 배포 스크립트 (deployment scripts)를 담당하는 협업 워크플로 (workflow)입니다.
커뮤니티에 이것이 중요한 이유
5. 속도 및 제어 (Speed & Control) – Ollama를 통해 로컬 상태를 유지함으로써, 지연 시간 급증 (latency spikes)을 제거하고 많은 클라우드 AI 서비스들을 괴롭히는 끔찍한 “403 – Access Denied” 오류를 방지합니다.
6. 개인정보 보호 우선 (Privacy-First) – 리드 점수 (lead scores), 사용자 선호도, 대화 기록 등 모든 민감한 캠페인 데이터는 기기 내에 머뭅니다. 사용자가 명시적으로 전송하지 않는 한 데이터는 서버를 떠나지 않습니다.
7. 신속한 프로토타이핑 (Rapid Prototyping) – 단일 Flask 파일 덕분에 새로운 기능을 몇 분 만에 추가할 수 있으며, 간단한 HTTP 요청을 통해 즉시 테스트할 수 있습니다.
8. 개방형 협업 (Open Collaboration) – dev.to에 여정을 게시함으로써 피드백 루프 (feedback loop)를 생성합니다. 독자들은 개선 사항을 제안할 수 있고, Yacov와 Miriam은 공개적으로 반복 개선 (iterate)을 진행하며 실제 현장의 페인 포인트 (pain points)를 오픈 소스 솔루션으로 바꿀 수 있습니다.
앞으로의 전망
Yacov는 이미 몇 가지 흥미로운 로드맵 (road-map) 항목들을 준비하고 있습니다:
9. 강화된 RTL 스타일링 (Enhanced RTL Styling) – 버튼, 카드, 모달 (modals)을 위한 더욱 정교한 우측에서 좌측으로 읽는 (right-to-left) 애니메이션 및 전환 효과.
10. Hermes Agent의 멀티 계정 격리 (Multi-Account Isolation) – 서로 간섭 없이 다양한 클라이언트들을 위한 샌드박스 (sandboxed) 앱 인스턴스를 더 쉽게 생성할 수 있도록 구현.
11. AI 지원 캠페인 카피 (AI-Assisted Campaign Copy) – 동일한 Gemma 모델을 활용하여 A/B 테스트용 제목, 소셜 스니펫 (social snippets), 이메일 초안을 자동 생성하며, 이 모든 생성 파이프라인 (generation pipeline)을 완전히 로컬로 유지.
이 주제 중 궁금한 점이 있다면, 저장소 (repo)는 풀 리퀘스트 (pull requests), 이슈 (issues), 또는 친근한 댓글에 열려 있습니다. Yacov는 배포 기술, 모델의 특이점 (model quirks), 또는 UI를 세련되게 유지하면서도 히브리어 사용자들에게 접근성을 제공하는 미묘한 기술에 대해 대화하는 것을 즐깁니다.
Yacov Drori 소개
위치: 이스라엘 Nahariya
언어: 히브리어, 러시아어, 영어
전문 분야: 마케팅 자동화 (marketing automation)를 위한 Flutter 및 Flask 애플리케이션 구축, 로컬 LLM (local LLMs) 실험, 그리고 복잡한 워크플로 (workflows)를 단순하고 유지보수가 용이한 도구로 전환하는 작업.
코드를 만지지 않을 때는 Galilee 지역을 하이킹하거나, 주방에서 새로운 향신료 조합을 실험하거나, 커뮤니티가 불가능하다고 생각했던 무언가를 자동화하는 데 도움이 될 다음 dev.to 기사를 계획하곤 합니다. 즐거운 해킹 (Happy hacking) 되시길 바라며, 협업하고 싶거나, 질문이 있거나, 혹은 로컬 AI 기반 마케팅 자동화의 미래에 대해 논의하고 싶다면 언제든 편하게 연락해 주세요!
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기