공부 하기 싫어서 만든 프로젝트: 지구 패치노트
오늘도 평화로운 지구서버
정부 지원 사업의 사업 계획서를 제출한 지 벌써 2주가 지났다.
솔직히 이제 와서 내가 할 수 있는 건 기도 메타 말고는 없어서..마음이나 비울 겸 RHCSA 공부나 집중하려고 했다.
하지만 워낙에 Worst Case Scenario를 달고 다니는 개발자인지라… “떨어지면 진짜 어떡하지?” 라는 불안감이 주기적으로 뒷목을 쳐대는 바람에, 뭐라도 만들면서 머리를 비우지 않으면 미쳐버릴 것 같았다.
그러던 와중에 우연히 무슨 오로라 현상을 보고 “지구 서버 또 에러 났네…” 하는 쇼츠를 봤다.
순간, 뭔가 이걸로 재밌는 걸 만들어 볼 수 있지 않을까 하는 생각이 들었다.
‘현실 뉴스를 진짜 [지구 온라인]이라는 게임의 패치노트처럼 동기화해서 정리해 주는 서비스가 있으면 재밌지 않을까?’
실용성은 밥 말아먹은 아이디어지만, 어차피 내 불안함을 잠재울 장난감이 필요했다. 겸사겸사 이 서비스에서 알아서 쇼츠까지 찍어내게 만들면… 꽤나 훌륭한 삽질이자 공부가 될 것 같았다.
사실 기획을 구체화하며 찾아보니, 이미 비슷한 컨셉으로 지도를 두고 그 위에 세상 모든 뉴스를 띄워주는 서비스라던가, 유튜브에 “지구 패치노트”라는 이름으로 올라온 쇼츠들이 몇 개 있긴 했다. 하지만 죄다 1, 2년 전쯤 사람 손을 갈아 넣다가 동영상 한두 개쯤 올리고 폐사(?)한 채 방치되어 있었다.
그래도, 나름의… 차별점(웹 - 쇼츠 연계?)은 있다고 생각했으니 그냥 GO 했다.
1. 지구 패치노트
“세상의 딱딱한 뉴스를, 마치 우리가 플레이하는 거대한 온라인 게임의 ‘서버 패치노트’처럼 읽어준다면?” 이 쓰잘떼기 없는 상상에서 출발한 프로젝트가 바로 지구 패치노트 다.
- 미국의 H-1B 비자 규제 강화는 => “해외 전문직 클래스 너프”
- 한국의 석유화학 산업 지원은 => “특정 직업군 2.1조 원 대규모 버프”
- 지구 온난화는 => “임계 온도 도달까지 남은 D-Day 카운트다운”
대충 이런 식으로 위트 있고 살짝은 냉소적인 게임 용어로 둔갑시켜 보여주는 서비스다.
이 컨셉에 꽂히자마자 가장 먼저 한 짓거리는 역시 도메인 사냥이었다.
뭔가 있어 보이는 도메인을 뒤지다가 patchnote.earth 라는 기가 막힌 도메인이 떡하니 비어있는 것을 발견했다.
.earth 최상위 도메인 자체가 워낙 희귀템이다 보니 1년 유지비가 무려 6만 원이나 했다. 결제 버튼 앞에서 잠시 지갑이 덜덜 떨리긴 했지만(…), 프로젝트의 근본을 이보다 더 완벽하게 설명할 순 없었기에 눈 딱 감고 질러버렸다.
결과적으로는 아주 대만족 중이다.
난 항상 프로젝트를 시작하기 전에 도메인을 먼저 사버린다. 그럼… 일단은 끝까지 가게 되니까.. 돈이 아까워서라도..ㅋㅋ
웹 서비스의 뼈대를 대충 세우고 나니, 사람들의 시선을 끌기 위해서는 역시 유튜브 쇼츠만 한 게 없었다.
하지만 매일 뉴스를 긁어오고, 대본을 쓰고, 영상을 편집하는 노가다를 내 소중한 시간을 갈아 넣어가며 할 수는 없는 노릇이었다.
그래서 이 모든 과정을 인간의 개입이 1도 없는 100% 자동화 파이프라인으로 구축했다.
2. 100% 자동화 유튜브 쇼츠 워크플로우
이번 파이프라인의 핵심은 내가 신경을 끄고 자빠져 자도, 데이터 수집 ➡ 렌더링 ➡ 업로드의 사이클이 매일 기계처럼 굴러가는 것이다.
이를 위해 크게 세 가지 단계로 시스템을 조립했다.
1단계: 뉴스 데이터 추출 및 AI 대본 작성 (Gemini)
먼저, 메인 웹 서비스(patchnote.earth) 시스템이 하루에 한 번 가장 중요도 높은 글로벌 이슈들을 DB에서 멱살 잡고 끌어온다.
추려진 주요 뉴스는 Google Gemini 2.5 Flash API에 쑤셔 넣어진다. 그저 단순 요약만 시키면 재미가 없으니, Gemini에게 “너는 이제 지구 온라인 게임의 냉소적인 패치노트 작성자다”라는 페르소나 프롬프트를 뇌에 박아주었다.
딱딱한 텍스트를 위트 있고 템포가 빠른 45초 분량의 쇼츠 대본 전용 JSON 포맷으로 뽑아내도록 했다.
2단계: 미디어 에셋 생성 (가상 음성 및 이미지 API)
대본이 텍스트(JSON)로 준비되면, 이제 눈과 귀를 채울 소스를 찍어낼 차례다.
- 오디오 (TTS): 나레이션은 ElevenLabs API를 물렸다. 억양, 숨소리, 끊어 읽기까지 너무 리얼해서 듣다 보면 소름이 돋는다. 영어와 한국어에 어울리는 고유의 목소리(Voice ID)를 할당해 MP3 파일을 병렬로 뽑아낸다. 한국어 영상은 재생 속도(1.15배속)와 간격(0.3초)까지 미세하게 깎아서 듣기 편한 텐션으로 세팅했다.
- 이미지 배경: 시각적인 배경은 Fal.ai의 Flux.1 Schnell 모델을 넣었다. Gemini가 대본을 쓸 때 각 씬(Scene)마다 만들어둔 ‘이미지 상세 프롬프트’를 바탕으로, 세로형(9:16) 1080x1920 해상도의 고품질 지구 온라인 감성 일러스트를 순식간에 찍어내 로컬로 다운로드한다.
3단계: 동영상 렌더링 및 유튜브 자동 업로드 (Remotion & YouTube API)
소스가 다 준비되면 이것들을 하나의 영상으로 구워야 한다.
이 과정에는 Remotion이라는 React 기반 비디오 렌더링 프레임워크를 도입했다. 프론트엔드 짜듯이 <Sequence>, <Audio>, <Img> 태그로 애니메이션과 이펙트를 코드로 박아넣으면, Remotion이 백그라운드 크로미움을 돌려 완벽한 .mp4 파일로 렌더링해 준다.
결과물인 2개의 영상(한국어판, 영문판)은 사전에 듀얼 OAuth 인증을 뚫어놓은 각각의 브랜드 채널로 YouTube Data API v3를 타고 자동 발행된다.
3. 서버야 아프지마…
머릿속 설계는 완벽했다. 하지만 실전에 올려놓자마자 서버가 비명을 지르며 뻗어버렸다.
초기 계획은 AWS EC2 한 대에서 1~3단계 전체를 원스톱으로 돌려버리는 것이었다. 하지만 내 서버는 고작 RAM 2GB짜리 앙증맞은 t3.small 인스턴스였다.
이 작디작은 램 구석에서 무거운 AI 이미지/음성 생성 생태계를 돌리고, 거기에 프론트 코드를 영상으로 구워내는 크로미움 렌더러와 FFmpeg까지 돌리려 하니 서버가 버틸 리가 있나.
스케일업해서 서버 깡스펙을 올리면 돈으로 해결될 일이었지만, 내 돈벌이도 아닌 토이 프로젝트에 매달 수십만 원의 고정 인프라 유지비를 태울 만큼 내 지갑이 관대하지는 않았다.
그래서 약간의 우회로, 아니 꼼수인 하이브리드 전략으로 선회를 했다.
-
가벼운 두뇌 역할 (EC2 서버): 매일 자정, 리소스 부하가 쥐똥만큼도 없는 1단계(뉴스 추출 및 대본 작성)만 EC2가 담당한다. 크론 스케줄러가 알아서 뉴스를 읽고, 생성된 텍스트 대본만 깃허브에 가볍게
git push해버리고 칼퇴근한다. -
무거운 노동 역할 (로컬 데스크탑): 다음날 아침,내 데스크탑 PC가 바통을 잇는다. 내가 아침에 눈을 뜨고
.bat파일 하나만 더블 클릭하면, 즉시 깃허브에서 서버가 뱉어둔 대본을 낼름 받아 이미지와 음성을 미친 듯이 병렬로 땡겨오고 순식간에 두 개의 영상을 구워낸다. 유튜브 업로드까지 일사천리로 끝.
서버 리소스의 한계를 내 방구석 고스펙 로컬 PC의 잉여 자원으로 퉁치는 셈이다. 뭐 완벽한 클라우드 완전 자동화는 아니지만, 텅 빈 지갑을 지켜내는 Opex(운영비용) 최소화 측면에서는 기가 막힌 타협점이자 해결책이었다.
4. 발전 속도가 너무 빨라요…
얼마 전까지만 해도 이런 API 짬뽕 파이프라인을 구축한다고 하면, 업계에서는 Zapier나 Make(Integromat) 같은 노코드/로우코드 GUI 툴을 갖다 쓰는 게 국룰이었다.
“굳이 API 공식 문서를 일일이 까보고 코드를 맨땅에 헤딩하며 짜는 건 비효율적이니, 마우스로 우아하게 블록을 드래그해서 이어붙여라”는 논리였다. 나 역시도 그 생산성을 예찬하던 쪽이긴 했다.
하지만 이번 파이프라인을 구축하며 개인적으로 얻는 깨달음은 이제는 그냥 코드로 직접 짜버리는 게 훨씬 빠르고 정확할 거 같다는 것이다.
그 이유는 순전히 AI 에이전트들의 압도적인 코딩 능력 때문이다.
과거에는 GUI 툴 화면에서 답답하게 JSON 필드를 하나하나 찾아 마우스로 찍어 매핑하고, 조건문을 눈알 빠지게 검증해야 했다.
하지만 이제는 에이전트 형님들에게 “ElevenLabs로 저 배열 돌려서 음성 뽑고, 그거 Remotion 프롭스에 넘겨서 타임라인 맞춰 렌더링하는 로직 짜줘”라고 프롬프트만 툭 던지면 끝이다.
놀랍게도 비동기 동시성 처리, API Rate Limit 방어, Math.round()를 이용한 부동소수점 에러 핸들링 로직까지 알아서 탄탄하게 코드로 토해낸다.
게다가 유튜브 채널 두 곳에 올려야 해서 골머리를 앓던 까다로운 듀얼 다중 OAuth 인증 로직조차 에이전트가 뚝딱 스크립트로 짜줬다.
나는 그저 에이전트가 싸놓은 코드를 보며 아키텍처 방향만 살짝 잡아주면 되는 수준이 된 거다.
뭔가… 3D 프린터가 하나 생긴 거 마냥 조립만 하면 되는 거 같다. 이제는..
결과적으로 코드로 이 자동화 스크립트를 온전히 쥐고 있으니 시스템이 너무나도 깃털처럼 가벼워졌다.
노코드 툴 특유의 그 묵직한 플랫폼 종속성이나, 트래픽 조금만 몰리면 기하급수적으로 빨대 꽂는 비싼 크레딧 과금으로부터 완벽히 해방됐다.
오히려 사람이 쓰기 더 편할 줄 알았던 GUI 베이스의 노코드툴들이, 역설적이게도 코딩을 귀신같이 잘하게 된 인공지능 에이전트들에게 가장 먼저 모가지를 잡히는 시대가 온 기분이다.
이제는 그런 시각적인 툴도 없이 그냥 자연어 코딩이 되니까…
어찌 되었든, 이번 프로젝트는 내 불안감을 잠재우기에 꽤나 만족스럽고 생산적인 일탈이었다.
👉 지구 패치노트
마침. (아, 이제 진짜 공부 좀 하자…)
다른 글 보기
쉘 스크립트를 공격/방어 스크립트로 익혀보기
쉘 스크립트야... 우리 조금만 더 친해지자
내 자동매매 봇은 왜 맨날 돈을 녹일까?
코스피 6000 돌파 뉴스에 휩쓸려 또 봇을 만들고 깨달은 점
로드밸런서 셋팅 후 연결 지연 현상
ALB 연결 후 새 창에서 발생하는 21초 대기 시간의 원인과 해결 과정 기록.
NAT 인스턴스가 왜 필요함? (패킷: 어디로 가야하오)
ALB 뒤에 숨긴 인스턴스가 인터넷이 안 되는 이유. IGW, Private Subnet, 그리고 t3.micro NAT 인스턴스를 활용한 격리 기록.