일기 분석 서비스 하루뒤의 사용자 테스트를 진행하기 위해서 반복적으로 데모일기 작성 업무가 생기는
과정에서 하나씩 chatGPT를 통해 데모 데이터를 생성하는 것도 결국 부수적인 업무가 되었습니다.
계속 반복되는 데모 일기 작성 작업을 일기 생성 자동화 툴 개발 및 사용을 통해 쉽고 빠르게 처리하고자 하여 이 자동화 툴을 개발하게 되었습니다.
- TypeScript
- Node.js
- Zod
- Commander
- Day.js
- OpenAI 호환 API
- Remotion-Server
POST /diaryAPI
이 도구는 단순히 임의의 텍스트 파일을 생성하는 프로그램이 아니라, 하루뒤 서비스의 실제 일기 저장 구조에 맞는 데모 데이터를 생성하고 서버 API로 저장하는 CLI 도구입니다.
Python도 데이터 생성에는 충분히 좋은 선택이지만, 이 프로젝트에서는 일기 저장 DTO, 감정 enum, 날씨 enum, 관계 enum처럼 백엔드/프론트 데이터 구조와 강하게 연결되는 값들을 정확히 맞추는 것이 중요했습니다. 그래서 TypeScript를 사용해 데이터 구조를 타입으로 고정하고, 생성 데이터가 서버 스키마와 어긋나는 문제를 줄이고자 했습니다.
또한 하루뒤 백엔드/프론트가 JavaScript/TypeScript 생태계와 연결되어 있다면 추후 enum, DTO, API 요청 타입을 공유하거나 맞추기 쉽다는 장점도 있습니다.
데모 데이터 생성기는 실행 시점에 사용자가 입력한 값과 AI가 생성한 결과를 다룹니다. 이 값들은 정적 타입만으로는 완전히 보장하기 어렵기 때문에 Zod를 사용해 런타임 검증을 함께 적용했습니다.
예를 들어 writtenDate는 YYYY-MM-DD 형식이어야 하고, weather는 서버에서 허용하는 enum 값이어야 합니다. Zod 스키마를 통해 이런 값들을 API 요청 전에 검증할 수 있어, 잘못된 데모 데이터가 Remotion-Server로 전송되는 문제를 줄일 수 있습니다.
데모 일기 생성은 반복적으로 실행되는 작업이기 때문에 웹 화면보다 터미널에서 빠르게 실행할 수 있는 CLI 형태가 적합하다고 판단했습니다.
Commander를 사용해 --count, --age, --job, --location, --traits 같은 옵션을 명확하게 받을 수 있게 했고, Day.js를 사용해 오늘 기준 하루 뒤 날짜부터 일기 작성일을 자동으로 증가시키도록 구성했습니다.
현재 도구의 역할은 AI로 일기 본문을 생성하고, 생성된 본문을 Remotion-Server의 일기 저장 API에 전달하는 것입니다. 감정 분석 결과나 metadata JSON을 이 도구에서 직접 만들지는 않습니다.
전체 흐름은 다음과 같습니다.
사용자 페르소나 입력
→ CLI가 입력값 파싱 및 검증
→ OpenAI 호환 API로 일기 content 생성
→ Remotion-Server POST /diary 호출
→ Remotion-Server가 Diary 저장
→ Remotion-Server 내부 AI 분석 실행
→ metadata, Target, Activity, Emotion, Todo 등 관련 데이터 저장
이렇게 역할을 나눈 이유는 실제 서비스의 저장 흐름을 최대한 유지하기 위해서입니다. 데모 데이터라고 해서 DB에 직접 insert하거나 metadata를 외부에서 주입하지 않고, 실제 사용자가 일기를 작성했을 때와 동일하게 POST /diary API를 거치도록 구성했습니다.
이 도구는 OpenAI 호환 API로 페르소나 기반 일기 본문을 생성한 뒤, 일기 파일을 만들지 않고 Remotion-Server 백엔드의 POST /diary API를 호출해 DB에 바로 저장합니다.
기본 실행은 현재 날짜 기준 하루 뒤 날짜를 writtenDate로 사용합니다. 예를 들어 현재 날짜가 2026-07-18이면 writtenDate는 2026-07-19입니다.
먼저 환경변수를 설정합니다.
export OPENAI_API_KEY="<openai-api-key>"
export ACCESS_TOKEN="<remotion-server-access-token>"또는 .env 파일에 아래처럼 넣을 수 있습니다.
OPENAI_API_KEY="<openai-api-key>"
OPENAI_BASE_URL="https://api.openai.com/v1"
OPENAI_MODEL="gpt-5.6"
ACCESS_TOKEN="<remotion-server-access-token>"
DIARY_API_BASE_URL="http://localhost:3000"사용하는 AI API가 OpenAI 호환 엔드포인트를 제공한다면 필요에 따라 OPENAI_API_KEY에는 해당 서비스의 API key를 넣고, OPENAI_BASE_URL에는 해당 서비스의 base URL을 넣습니다. OpenAI 공식 API를 그대로 사용한다면 기본값인 https://api.openai.com/v1을 사용하면 됩니다.
사용자는 일기 본문을 직접 쓰지 않고 페르소나 정보만 입력할 수 있습니다.
ACCESS_TOKEN="<access-token>" npm run dev -- \
--count 5 \
--name 민지 \
--age 29 \
--gender 여성 \
--job 개발자 \
--location 서울 \
--traits "내향적,완벽주의,아침형 인간" \
--weather SUNNY위 명령은 OpenAI 호환 API로 2026-07-19부터 5일치 일기 본문을 페르소나에 맞춰 생성하고, 각 일기를 POST /diary로 저장합니다.
저장 전에 생성될 일기만 확인하려면 --dry-run을 사용합니다.
npm run dev -- \
--dry-run \
--count 3 \
--age 24 \
--job 학생 \
--location 부산 \
--traits "취업준비,불안이 많음,친구와 자주 만남"OpenAI API를 쓰지 않고 로컬 템플릿 생성만 확인하려면 --generator template을 사용합니다.
npm run dev -- \
--dry-run \
--generator template \
--count 3 \
--age 24 \
--job 학생 \
--location 부산특정 일기 본문을 직접 저장하고 싶을 때만 --content를 사용합니다.
ACCESS_TOKEN="<access-token>" npm run dev -- \
--content "오늘은 프로젝트 데모 데이터를 만들었다. 기능이 잘 동작해서 뿌듯했다." \
--weather SUNNY서버 주소가 기본값 http://localhost:3000과 다르면 --base-url로 지정합니다.
npm run dev -- \
--base-url http://localhost:3000 \
--token "<access-token>" \
--written-date 2026-07-19 \
--weather SUNNY이미지와 오디오는 multipart 파일 필드로 보냅니다. 이미지는 서버 기준 최대 10개까지 전송합니다.
npm run dev -- \
--token "<access-token>" \
--photo ./sample-1.jpg \
--photo ./sample-2.jpg \
--audio ./voice.m4a지원하는 weather 값은 SUNNY, CLOUDY, RAINY, SNOWY, STORMY, WINDY, SMOG, NONE입니다.