TRENDSHIFT #3 딥다이브 · 2026-03-25 분석

MoneyPrinterV2 딥다이브
— LLM + 브라우저 자동화로 YouTube Shorts부터 콜드 이메일까지 4가지 수익 파이프라인

주제 생성 → 스크립트 → TTS → 이미지 → 영상 합성 → 업로드까지 전 과정을 자동화하는 Python CLI 애플리케이션. 로컬 LLM(Ollama)으로 API 비용 없이 실행 가능. FujiwaraChoki/MoneyPrinterV2 · ⭐30.7k · Python 95.7% · AGPL-3.0
목차
  1. 프로젝트 한줄 요약
  2. 왜 주목받는가
  3. 기술 스택 전체 지도
  4. 아키텍처 심화 분석
  5. 디렉토리 구조 해부
  6. 학습 포인트 (기술별)
  7. 하드웨어 / 시스템 요구사항
  8. 직접 해볼 수 있는 실습 과제
  9. 관련 기술 심화 학습 로드맵
  10. 핵심 키워드 사전
  11. 참고 링크

1프로젝트 한줄 요약

MoneyPrinterV2가 정확히 무엇을 하는 물건인가

MoneyPrinterV2(MPV2)는 LLM과 브라우저 자동화를 결합하여 YouTube Shorts 영상 제작·업로드, 트위터 봇, 아마존 제휴 마케팅, 로컬 비즈니스 콜드 이메일까지 4가지 온라인 수익 파이프라인을 자동화하는 Python CLI 애플리케이션입니다.

로컬 LLM(Ollama)으로 API 비용 없이 전체 파이프라인을 실행할 수 있습니다. GitHub 스타: 30.7k(2026-06-04 기준), 포크: 2,600+.

한 컷 비유

"콘텐츠 공장을 Python 스크립트 하나로 돌리는 것"

보통 YouTube Shorts 하나를 만들려면 주제 조사 → 대본 작성 → 성우 녹음 → 이미지 제작 → 편집 → 업로드를 각각 해야 합니다. MPV2는 이 모든 단계를 파이프라인으로 연결해 자동 실행합니다.

핵심 특징은 로컬 LLM(Ollama)으로 API 비용 없이 실행할 수 있다는 점입니다. GPU만 있으면 OpenAI API 요금 없이 스크립트·메타데이터·이미지 프롬프트를 모두 생성합니다. 동시에 이 프로젝트는 "이렇게 만들면 안 된다"는 안티패턴도 배울 수 있는 교육적 사례이기도 합니다.

2왜 주목받는가

트렌딩 이유와 경쟁 제품 대비 장점
기존 방식의 한계
수동 콘텐츠 제작은 반복 노동의 연속이다

YouTube Shorts 채널을 운영하려면 매일 주제 선정 → 스크립트 → TTS → 이미지 → 편집 → 업로드를 반복해야 합니다. Opus Clip 같은 상용 도구는 기존 영상을 자르는 데 특화되어 있고, 처음부터 콘텐츠를 생성하는 자동화는 비용이 큽니다.

MoneyPrinterV2의 해법
4가지 채널을 단일 CLI에서 완전 자동화 — 로컬 LLM으로 무료 실행

YouTube(영상 생성+업로드)·Twitter(트윗 봇)·Amazon(제휴 마케팅)·Outreach(콜드 이메일)를 하나의 CLI에서 통합 관리합니다. Ollama를 통한 로컬 LLM으로 API 비용 없이 전체 파이프라인이 동작합니다.

경쟁 제품 비교

비교 대상MoneyPrinterV2 장점
MoneyPrinterTurbo (harry0703)4가지 수익 채널(YouTube+Twitter+제휴+Outreach) vs 영상 생성만
Opus Clip / 상용 도구완전 무료 + 로컬 실행 가능 (Ollama)
수동 YouTube Shorts 제작스크립트→TTS→이미지→자막→합성→업로드 전 자동화
개별 봇 스크립트단일 CLI에서 4개 워크플로 통합 관리

3기술 스택 전체 지도

백엔드 / 미디어 처리 / 자동화 / 인프라

핵심 로직 (Python 3.12)

카테고리기술역할
LLMOllama (로컬)주제·스크립트·메타데이터·이미지 프롬프트 생성
이미지 생성Gemini API9:16 비율 이미지 생성
TTSKittenTTS (kitten-tts-mini-0.8)스크립트 → WAV 음성 합성 (24kHz)
STTfaster-whisper / AssemblyAI음성 → 자막(SRT) 변환
영상 합성MoviePy + FFmpeg + ImageMagick이미지+오디오+자막 합성 → MP4
브라우저 자동화Selenium + Firefox (GeckoDriver)YouTube 업로드, Twitter 포스팅, Amazon 스크래핑
웹 스크래핑Go 바이너리 (google-maps-scraper)Google Maps 비즈니스 데이터 수집
이메일yagmail (Gmail SMTP)콜드 이메일 자동 발송
스케줄링schedule 라이브러리CRON 유사 주기적 실행

4아키텍처 심화 분석

시스템 구조도 + 핵심 설계 패턴 5가지
┌─────────────────────────────────────────────────────────┐ │ main.py (CLI 메뉴) │ │ [1] YouTube [2] Twitter [3] Affiliate [4] Outreach │ └─────┬──────────┬──────────┬───────────┬─────────────────┘ │ │ │ │ ▼ ▼ ▼ ▼ ┌──────────┐ ┌────────┐ ┌───────┐ ┌──────────┐ │YouTube.py│ │Twitter │ │AFM.py │ │Outreach │ │ │ │ .py │ │ │ │ .py │ └────┬─────┘ └───┬────┘ └──┬────┘ └────┬─────┘ │ │ │ │ ▼ ▼ ▼ ▼ ┌─────────────────────────────────────────────────────────┐ │ 공유 인프라 계층 │ │ llm_provider (Ollama) │ Tts.py (KittenTTS) │ │ Selenium/Firefox (브라우저 자동화) │ │ config.py (config.json 로드) │ │ cache.py (JSON 파일 기반 상태 관리) │ │ constants.py (셀렉터, 경로 상수) │ └─────────────────────────┬───────────────────────────────┘ ▼ ▼ ┌────────────┐ ┌────────────┐ │ MoviePy │ │ yagmail │ │ FFmpeg │ │ (SMTP) │ │ Pillow │ └────────────┘ └────────────┘

핵심 설계 패턴

① 파이프라인 패턴 (YouTube 영상 생성)

각 단계가 이전 단계의 출력을 입력으로 받아 순차 처리합니다: 주제 생성 → 스크립트 → 메타데이터 → 이미지 프롬프트 → 이미지 생성 → TTS 음성 합성 → 자막(SRT) 생성 → 영상 합성(이미지+오디오+자막) → Selenium으로 YouTube 업로드

② Strategy 패턴 (STT 프로바이더)

if stt_provider == "local_whisper":
    generate_subtitles_local_whisper()
else:
    # AssemblyAI 사용

config.jsonstt_provider 값에 따라 로컬 Whisper 또는 AssemblyAI로 분기합니다.

③ Selenium 프로필 재사용

# Firefox 프로필 재사용 — 로그인 세션 유지
options = Options()
options.add_argument('-profile')
options.add_argument(fp_profile_path)
if headless:
    options.add_argument("--headless")
driver = webdriver.Firefox(options=options)

Firefox 프로필을 사전 설정하여 로그인 세션을 유지합니다. 쿠키/세션 관리 없이 브라우저 자동화가 가능한 실용적 패턴입니다.

④ 안티패턴 학습 — Configuration Getter

안티패턴 주의
매 호출마다 config.json을 새로 읽는 30개 getter 함수

30개 이상의 개별 getter가 매번 파일을 열어서 읽습니다. 호출마다 디스크 I/O가 발생합니다. 실제 프로덕션에서는 싱글톤이나 @lru_cache로 개선해야 합니다. 이 패턴을 "무엇을 하면 안 되는지" 학습하는 데 활용할 수 있습니다.

# 현재: 매번 파일 I/O
def get_ollama_model():
    with open("config.json") as f:
        return json.load(f)["ollama_model"]

# 개선안: 캐싱
import functools

@functools.lru_cache(maxsize=1)
def _load_config():
    with open("config.json") as f:
        return json.load(f)

def get_ollama_model():
    return _load_config()["ollama_model"]

⑤ 파일 기반 상태 관리

데이터베이스 없이 JSON 파일로 모든 상태를 관리합니다. 업로드된 영상 목록·트윗 히스토리·계정 정보(UUID 기반)·캐시 데이터를 파일로 유지합니다. 간단한 프로토타입에는 유효하지만 확장성에는 한계가 있는 패턴입니다.

5디렉토리 구조 해부

단순하고 평평한 구조
MoneyPrinterV2/ ├── config.example.json # 설정 템플릿 (API 키, 모델 선택, 이메일 등) ├── requirements.txt # Python 의존성 18개 ├── LICENSE # AGPL-3.0 │ ├── src/ │ ├── main.py # 진입점 — CLI 메뉴, 계정 관리, 워크플로 오케스트레이션 │ ├── config.py # config.json 읽기 전용 getter 30개+ │ ├── constants.py # CSS 셀렉터, 경로, 매직넘버 상수 │ ├── llm_provider.py # Ollama 클라이언트 래퍼 (모델 선택, 텍스트 생성) │ ├── cache.py # JSON 파일 기반 캐시 유틸리티 │ ├── cron.py # CLI 인자 기반 스케줄 실행 진입점 │ │ │ ├── art.py # 이미지 생성 유틸리티 │ ├── post_bridge_integration.py # PostBridge 크로스포스팅 연동 │ ├── status.py # 상태 조회 유틸리티 │ ├── utils.py # 공통 유틸리티 함수 │ │ │ └── classes/ │ ├── YouTube.py # 핵심 — 영상 파이프라인 전체 (생성→합성→업로드) │ ├── Twitter.py # 트위터 봇 (포스팅, 계정 관리) │ ├── AFM.py # Affiliate Marketing (Amazon 스크래핑 + 피치 생성) │ ├── Outreach.py # 콜드 이메일 (Go 스크래퍼 + yagmail) │ ├── Tts.py # KittenTTS 래퍼 (24kHz WAV 출력) │ └── PostBridge.py # TikTok/Instagram 크로스포스팅 │ ├── scripts/ # 셸 스크립트 (자동화/유틸리티) ├── docs/ # 문서 └── .mp/ # 런타임 생성 — 임시 이미지, 오디오, 영상 파일
파일핵심 기능복잡도
YouTube.py영상 전체 파이프라인★★★★★
Outreach.pyGo 빌드 + 스크래핑 + 이메일★★★★
AFM.pyAmazon 스크래핑 + 피치 생성★★★
Twitter.py트윗 포스팅★★
main.pyCLI 메뉴 + 오케스트레이션★★★

6학습 포인트 (기술별)

이 레포에서 무엇을 배울 수 있는가

LLM 통합 (Ollama)

Ollama REST API를 Python에서 사용하는 패턴, 프롬프트 엔지니어링(문장 수 제한·JSON 형식 출력 강제·언어 지정), 모델 동적 선택(런타임에 사용 가능한 모델 조회)을 배웁니다.

# 모델 목록 조회 + 텍스트 생성
models = ollama.list()["models"]
response = ollama.chat(
    model=selected_model,
    messages=[{"role": "user", "content": prompt}]
)
return response["message"]["content"].strip()

영상 합성 (MoviePy + Pillow)

MoviePy로 이미지 시퀀스 → 영상 변환, 9:16 세로 비율 크롭 계산, 배경음악과 TTS 오디오 믹싱(볼륨 비율 조절), SRT 자막 오버레이, FFmpeg 백엔드 활용을 익힙니다.

# 9:16 세로 비율 크롭
clip = crop(clip, width=clip.w, height=round(clip.w / 0.5625))

# 오디오 믹싱
bg_music = bg_music.volumex(0.1)  # 배경음 10%로
final_audio = CompositeAudioClip([tts_audio, bg_music])

브라우저 자동화 (Selenium)

Firefox 프로필 기반 세션 유지, YouTube Studio 업로드 자동화(파일 피커·메타데이터·공개 설정), 다중 셀렉터 폴백 전략(XPath → CSS → ID 순차 시도)을 배웁니다.

TTS (KittenTTS)

경량 로컬 TTS 모델 사용법, soundfile로 WAV 파일 쓰기(24kHz), faster-whisper로 로컬 STT 처리를 익힙니다.

크로스 언어 통합 (Python + Go)

subprocess로 외부 Go 바이너리를 실행하는 크로스 언어 통합 패턴, 정규식 기반 이메일 추출, yagmail로 Gmail SMTP 발송(앱 비밀번호 활용)을 배웁니다.

용어 설명
AGPL-3.0 라이선스
Affero General Public License. GPL의 변형으로, 네트워크 서비스로 소프트웨어를 제공해도 소스 공개 의무가 발생합니다. 이 레포의 코드를 SaaS로 서비스하려면 전체 소스를 공개해야 합니다.

7하드웨어 / 시스템 요구사항

추가 소프트웨어가 여럿 필요한 프로젝트
항목최소 사양권장 사양
Python3.12 필수3.12
RAM8GB16GB (Ollama + MoviePy 동시)
GPU없어도 가능 (CPU 추론)NVIDIA 8GB+ VRAM (Ollama 가속)
디스크10GB (모델 + 임시파일)20GB+
OSLinux / macOS / WindowsLinux 권장 (FFmpeg 호환성)
추가 SWFirefox, FFmpeg, ImageMagick+ Go (Outreach 기능)
계정YouTube/Twitter 로그인된 Firefox 프로필+ Gmail 앱 비밀번호

8직접 해볼 수 있는 실습 과제

난이도별 5개 실습
과제 1 · 초급

Ollama 연동 기본기 ★☆☆☆☆

Ollama를 설치하고 Python에서 ollama.chat() API로 간단한 텍스트 생성기를 만듭니다. 주제를 입력하면 3문장 스크립트를 생성하고, ollama.list()로 사용 가능한 모델 목록을 출력합니다.

목표: "여행 팁" 주제를 입력하면 YouTube Shorts 스크립트 3문장을 자동 생성하는 Python 스크립트
과제 2 · 초급~중급

MoviePy 영상 합성기 ★★☆☆☆

이미지 3장 + MP3 파일을 받아서 자동으로 세로(9:16) 슬라이드쇼 영상을 생성하는 스크립트를 작성합니다. 이미지별 표시 시간 = 총 오디오 길이 ÷ 이미지 수. Pillow로 1080x1920 리사이즈 + 센터 크롭.

과제 3 · 중급

Selenium YouTube 업로더 ★★★☆☆

Firefox 프로필을 활용하여 YouTube Studio에 영상을 자동 업로드하는 스크립트를 만듭니다. 비공개(unlisted) 설정으로 업로드하고 제목·설명 자동 입력 후 업로드 완료 URL을 추출합니다.

과제 4 · 고급

전체 파이프라인 재구현 + 아키텍처 개선 ★★★★☆

MPV2의 YouTube 파이프라인을 처음부터 재구현하되 아키텍처를 개선합니다: 설정 관리를 Pydantic Settings로 교체, 각 단계를 독립 클래스로 분리(SRP), 에러 발생 시 재시도 로직(tenacity), 비동기 이미지 생성 병렬화.

과제 5 · 고급

FastAPI 웹 대시보드 추가 ★★★★★

CLI 대신 웹 UI로 관리하는 대시보드를 구축합니다: FastAPI + React 대시보드, WebSocket으로 영상 생성 진행률 실시간 표시, SQLite로 영상 히스토리 관리(JSON → DB 마이그레이션), Celery + Redis 백그라운드 작업 큐.

9관련 기술 심화 학습 로드맵

6주 커리큘럼

1주차: Python 자동화 기초

Selenium WebDriver 기초(로그인·폼 입력·파일 업로드), schedule 라이브러리로 주기적 작업 실행, subprocess로 외부 프로세스 관리, JSON 파일 기반 상태 관리

2주차: AI/LLM 통합

Ollama 설치 및 모델 관리(ollama pull, ollama run), Python ollama 라이브러리 심화(스트리밍·시스템 프롬프트), 프롬프트 엔지니어링(출력 형식 제어), LiteLLM으로 다양한 LLM 프로바이더 전환

3주차: 미디어 처리

MoviePy 심화(트랜지션·텍스트 오버레이·크로마키), Pillow(이미지 리사이즈·크롭·필터·텍스트 렌더링), FFmpeg CLI 직접 사용(코덱·비트레이트·해상도), KittenTTS / Coqui TTS / Edge TTS 비교

4주차: 웹 스크래핑 & 이메일

Selenium vs Playwright vs Puppeteer 비교, undetected_chromedriver로 봇 탐지 우회, 정규식 심화(이메일·URL·전화번호 추출), yagmail / smtplib로 이메일 자동화

5주차: 아키텍처 개선

Pydantic Settings로 설정 관리 현대화, Factory·Strategy 패턴 실전 적용, asyncio + aiohttp로 병렬 이미지 생성, Docker 컨테이너화(Ollama + 앱 + Firefox headless)

6주차: 프로덕션 레벨 업그레이드

FastAPI로 REST API 래핑, Celery + Redis 작업 큐, SQLAlchemy/SQLite로 JSON 캐시 교체, GitHub Actions CI/CD 파이프라인

10핵심 키워드 사전

이 레포를 이해하는 데 필수적인 용어 15개
키워드설명
Ollama로컬에서 LLM을 실행하는 오픈소스 프레임워크. llama·mistral 등 다양한 모델 지원
KittenTTS경량 로컬 TTS 엔진. kitten-tts-mini-0.8 모델로 24kHz WAV 출력
faster-whisperOpenAI Whisper의 CTranslate2 최적화 버전. 로컬 STT 처리
MoviePyPython 영상 편집 라이브러리. FFmpeg를 백엔드로 사용하여 영상 합성·자르기·오디오 믹싱
Selenium브라우저 자동화 프레임워크. WebDriver로 실제 브라우저를 프로그래밍 방식으로 제어
GeckoDriverFirefox용 WebDriver 구현체. Selenium이 Firefox를 제어할 때 사용하는 드라이버
Firefox ProfileFirefox 사용자 프로필 디렉토리. 쿠키·로그인 세션이 저장되어 자동화 시 로그인 상태 유지
SRT (SubRip Text)자막 파일 형식. HH:MM:SS,mmm 타임스탬프와 텍스트로 구성
yagmailGmail 전용 Python 이메일 라이브러리. smtplib보다 간결한 API로 이메일 발송
undetected_chromedriverSelenium 봇 탐지를 우회하는 Chrome WebDriver 래퍼
AGPL-3.0네트워크 서비스로 제공해도 소스 공개 의무가 발생하는 라이선스
VADVoice Activity Detection. faster-whisper의 음성 구간 검출 기능. 무음 건너뛰어 정확도 향상
Pipeline Pattern각 처리 단계가 이전 단계의 출력을 입력으로 받아 순차 처리하는 소프트웨어 설계 패턴
lru_cachePython 내장 함수 결과 캐싱 데코레이터. MPV2의 config getter 안티패턴을 개선하는 핵심 도구
subprocessPython에서 외부 프로세스(Go 바이너리 등)를 실행하는 모듈. 크로스 언어 통합에 활용

11참고 링크

공식 문서 및 학습 자료