GPT-5 Codex로 5800줄 프로젝트를 4시간에 만든 프롬프팅 전략
ShortsMaker라는 사주 기반 숏폼 영상 생성 파이프라인을 AI로 처음부터 구축했다. 5800줄의 코드가 4번의 커밋으로 완성됐다. 이 글에서는 GPT-5 Codex를 활용해 복잡한 프로젝트를 빠르게 bootstrap하는 실전 프롬프팅 전략을 다룬다.
배경: 무엇을 만들고 있는가
사주 데이터를 받아서 자동으로 숏폼 영상을 생성하는 시스템이다. Python CLI로 사주를 분석하고, React + Remotion으로 영상을 렌더링한다. 다국어 지원과 커스터마이징 가능한 템플릿이 핵심 요구사항이었다.
프로젝트 구조를 보면 복잡도를 알 수 있다. Python backend, TypeScript frontend, 사주 해석 로직, 영상 렌더링 파이프라인까지 4개 도메인이 얽혀있다. 혼자서 처음부터 만들려면 최소 2-3주는 걸릴 작업이다.
프로젝트 bootstrap은 “큰 그림”부터
가장 실패하기 쉬운 패턴이 바로 “파일부터 만들어줘”다. 이렇게 하면 AI가 전체 맥락 없이 개별 컴포넌트만 만든다. 결과물은 서로 연결되지 않는 코드 조각들이다.
효과적인 bootstrap 순서는 다음과 같다:
- 아키텍처 설계 문서 생성
- 디렉토리 구조와 핵심 파일들 뼈대 작성
- 데이터 모델과 인터페이스 정의
- 비즈니스 로직 구현
- 통합 테스트와 검증
첫 번째 커밋에서 이 순서를 그대로 따랐다. ARCHITECTURE.md, PROJECT_BRIEF.md부터 만들고, 그 다음에 코드를 생성했다.
“사주 기반 숏폼 영상 생성 시스템의 전체 아키텍처를 설계해줘. Python CLI + React/Remotion 조합이고, 다음 요구사항을 만족해야 한다:
- 사주 데이터를 JSON으로 받아서 해석
- 해석 결과를 기반으로 영상 스크립트 생성
- Remotion으로 영상 렌더링
- 8개 언어 지원 (한국어, 영어, 일본어, 중국어 등)
- 템플릿과 스타일 커스터마이징 가능
프로젝트 구조, 데이터 플로우, 주요 컴포넌트, 기술 스택 선정 이유를 포함한 설계 문서를 markdown으로 작성해줘.”
이런 “설계 우선” 프롬프트를 쓰면 AI가 전체 시스템을 이해하고 일관성 있는 코드를 만든다.
잘못된 접근:
“사주 앱 만들어줘”
이렇게 하면 AI가 추측으로 기능을 만든다. 내가 원하는 것과 다를 확률이 높다.
멀티 언어 파이프라인 구축 전략
가장 까다로운 부분이 다국어 지원이었다. 단순히 번역만 하는 게 아니라, 각 언어의 문화적 맥락에 맞게 사주 해석을 조정해야 한다.
이런 복잡한 요구사항은 한 번에 구현하기 어렵다. 단계적으로 쪼개서 AI에게 시켰다:
1단계: 언어별 설정 구조 정의
“
languages.py파일을 만들어줘. 한국어, 영어, 일본어, 중국어 간체/번체, 스페인어, 프랑스어, 독일어 총 8개 언어를 지원한다. 각 언어마다 다음 정보가 필요하다:
- locale code (ko, en, ja, zh-CN, zh-TW, es, fr, de)
- 텍스트 방향 (LTR/RTL)
- 폰트 설정 (기본 폰트, weight, fallback)
- 사주 용어 번역 (천간, 지지, 오행 등)
- 문화적 표현 방식 (예: 서양은 생년월일 대신 zodiac sign 언급)
dataclass나 TypedDict로 타입 안전하게 구조화해줘.”
2단계: 번역 및 현지화 로직
“사주 해석 텍스트를 언어별로 현지화하는 함수를 만들어줘. 단순 번역이 아니라 문화적 맥락을 고려해야 한다:
- 한국어: 전통적 사주 용어 사용
- 영어: Western astrology 개념과 연결
- 일본어: 음양오행설 중심 표현
- 중국어: 번체/간체 구분하고 전통 표현 유지
입력은 한국어 해석 텍스트고, 출력은 target_locale에 맞는 현지화된 텍스트다.”
3단계: 영상 렌더링에서 언어 처리
“Remotion 컴포넌트에서 다국어 텍스트를 렌더링할 때 주의사항:
- 텍스트 길이가 언어마다 다름 (독일어는 길고, 중국어는 짧음)
- 폰트 로딩과 fallback 처리
- 텍스트 방향 (아랍어는 RTL이지만 현재는 LTR 언어만)
- 줄바꿈과 word wrapping 규칙
이걸 처리하는
<LocalizedText>컴포넌트를 만들어줘.”
이렇게 3단계로 나누니 각 단계에서 AI가 집중할 수 있었다. 한 번에 “다국어 지원 구현해줘”라고 하면 빠뜨리는 부분이 많다.
CLI와 React 연동의 핵심은 인터페이스 설계
Python CLI에서 생성한 데이터를 React/Remotion으로 전달하는 부분이 복잡했다. 이런 cross-language 통합에서 가장 중요한 건 명확한 인터페이스 정의다.
먼저 데이터 구조를 TypeScript와 Python 양쪽에서 동일하게 정의했다:
“
types.ts와models.py를 만들어줘. 사주 데이터 구조를 정의하는데, 두 파일이 완전히 동일한 스키마를 가져야 한다:interface SajuProfile { name: string; birthDate: string; // ISO format birthTime: string; // HH:mm format gender: 'male' | 'female'; lunar: boolean; } interface SajuAnalysis { profile: SajuProfile; tenStems: string[]; // 천간 4개 twelveEarthlyBranches: string[]; // 지지 4개 fiveElements: Record<string, number>; // 오행별 개수 interpretation: { personality: string; career: string; love: string; health: string; luck2024: string; }; locale: string; }Python에서는 Pydantic model, TypeScript에서는 interface로 만들어줘. 직렬화/역직렬화도 포함해서.”
이 인터페이스 정의가 있으니 나머지 구현이 수월했다. Python에서 JSON을 생성할 때와 React에서 받을 때 모두 타입 안전성이 보장된다.
그 다음은 실제 데이터 전달 메커니즘이다:
“Python CLI에서 사주 분석을 완료하면
output/jobs/{job_id}/폴더에 결과를 저장한다. 다음 파일들이 생성되어야 한다:
analysis.json: SajuAnalysis 객체config.json: 영상 렌더링 설정 (해상도, 템플릿, 색상 등)assets/: 필요한 이미지나 폰트 파일들Remotion은 이 폴더를 읽어서 영상을 렌더링한다.
render-job.ts스크립트를 만들어서 job_id를 받으면 해당 폴더의 데이터로 영상을 생성하는 기능을 구현해줘.”
이렇게 파일 시스템을 통한 데이터 전달 방식을 선택했다. 메모리나 네트워크보다 안정적이고 디버깅하기 쉽다.
검증 가능한 샘플 데이터가 핵심
복잡한 시스템을 만들 때 AI가 자주 실수하는 부분이 “예상과 다른 데이터 형식”이다. 이를 방지하려면 구체적인 샘플 데이터를 함께 제공해야 한다.
“
sample_saju.json파일을 만들어줘. 실제로 테스트할 수 있는 완전한 사주 데이터다:
- 이름: 김철수
- 생년월일: 1990년 3월 15일 오전 10시 30분
- 성별: 남성, 양력 기준
이 정보로 사주를 계산해서 SajuProfile과 SajuAnalysis 형식에 맞는 JSON을 생성해줘. 천간지지 계산도 정확히 해야 하고, 해석 텍스트도 실제로 읽을 만한 품질로 작성해줘.”
이 샘플 데이터로 전체 파이프라인을 검증할 수 있었다. Python에서 JSON을 읽고, React에서 렌더링하고, 최종 영상까지 생성하는 전 과정을 테스트했다.
AI에게 “테스트용 더미 데이터 만들어줘”라고 하면 대충 만든다. 구체적인 인물과 날짜를 주면 훨씬 현실적인 데이터를 생성한다.
Remotion 컴포넌트 설계의 함정
React/Remotion으로 영상을 만드는 부분에서 가장 어려웠던 건 “영상의 시간축”이다. 일반적인 React 컴포넌트는 정적이지만, Remotion은 시간에 따라 변화해야 한다.
처음에는 단순하게 접근했다:
“사주 분석 결과를 보여주는 Remotion 컴포넌트를 만들어줘. 30초 길이의 세로형 영상이고, 다음 순서로 정보를 보여준다:
- 인트로 (이름, 생년월일) - 5초
- 성격 분석 - 7초
- 직업운 - 6초
- 연애운 - 6초
- 건강운 - 6초”
결과물은 기능적으로는 동작했지만, 영상으로서는 어색했다. 텍스트가 갑자기 나타나고 사라지고, 전환 효과도 어색했다.
개선된 프롬프트:
“사주 영상 컴포넌트를 만들되, 시각적 완성도에 집중해줘:
타이밍 설계:
- 각 섹션은 fade-in/fade-out으로 자연스럽게 전환 (1초 오버랩)
- 텍스트는 타이핑 효과로 점진적 등장
- 배경은 사주의 오행 색상을 기반으로 그라데이션
레이아웃:
- 9:16 비율 (Instagram Reels/TikTok 최적화)
- 폰트 크기는 모바일에서 읽기 쉽게
- 상단 1/3: 제목, 중간 1/3: 메인 텍스트, 하단 1/3: 시각적 요소
애니메이션:
interpolate()함수 적극 활용- easing은
Easing.bezier(0.25, 0.46, 0.45, 0.94)(자연스러운 곡선)- 텍스트별로 0.1초씩 딜레이 줘서 순차 등장
세부 구현보다는 사용자가 끝까지 볼 수 있는 영상을 만드는 게 목표다.”
이렇게 “시각적 품질”에 대한 구체적인 가이드라인을 주니 훨씬 자연스러운 영상이 나왔다.
더 나은 방법은 없을까
이번 작업에서 아쉬웠던 부분들과 개선 방안을 정리한다.
프로젝트 구조 관리 현재는 파일 시스템으로 Python과 React 간 데이터를 주고받는다. 더 나은 방법은 gRPC나 JSON-RPC로 직접 통신하는 것이다. Pydantic 스키마를 gRPC proto로 자동 변환하는 도구들도 있다.
코드 품질 검증
AI가 생성한 코드에 대한 자동 검증이 부족했다. pre-commit hooks에 mypy, eslint, prettier를 추가하고, 생성 직후 자동으로 실행되도록 설정하면 좋겠다.
다국어 처리 현재는 번역 로직을 직접 구현했는데, Google Cloud Translation API나 DeepL API를 연동하는 게 품질면에서 나을 수 있다. 다만 사주라는 도메인 특화 용어 때문에 커스텀 번역이 필요한 부분도 있다.
테스트 커버리지 단위 테스트가 부족하다. 특히 사주 계산 로직처럼 정확성이 중요한 부분은 comprehensive test suite가 필요하다. AI에게 “기존 코드 분석해서 edge case 포함한 테스트 케이스 100개 생성해줘”라고 시키는 방법도 있다.
성능 최적화
Remotion 렌더링이 생각보다 느리다. 컴포넌트 레벨에서 useMemo와 React.memo를 적극 활용하고, 불필요한 리렌더링을 막아야 한다. 또는 서버 사이드에서 headless Chrome으로 렌더링하는 방식도 고려할 만하다.
정리
- 복잡한 프로젝트는 아키텍처 설계부터 시작한다. 코드를 먼저 만들면 일관성이 없다
- 멀티 도메인 시스템에서는 인터페이스 정의가 핵심이다. TypeScript와 Python 스키마를 동기화하라
- 단계적 구현 전략을 쓴다. 한 번에 모든 기능을 요청하면 품질이 떨어진다
- 구체적인 샘플 데이터로 전체 파이프라인을 검증한다. 추상적인 더미 데이터는 문제를 숨긴다
이번 작업의 커밋 로그
65f233a — gpt-5-codex: bootstrap project workspace
07e6f61 — gpt-5-codex: build saju shorts pipeline
d6e1582 — gpt-5-codex: fix repo-relative cli paths
6cc0e4f — gpt-5-codex: log sample short validation
댓글 0