아직 새벽 2시에 업로드 배치가 죽었던 순간이 기억납니다. 서버는 RAM 2GB, vCPU 1개, GPU는 없었습니다. 병렬 처리가 더 빠를 것 같아서 렌더링 작업 40개를 동시에 예약했습니다. Python이 메모리를 먹어치웠고, OS가 스와핑을 시작했고, 전체 시스템은 작업 도중에 멈췄습니다. 재부팅했을 때, 39개의 완성된 제품 중 어떤 것이 업로드되었고 어떤 것이 그렇지 않았는지 전혀 알 수 없었습니다. '배치를 실행했다'는 것과 '실제로 무엇이 배송되었는지 아는 것' 사이의 간극이 저에게 모든 것을 다시 구축하도록 강요했고, 이상하게도 제가 키트 가격을 책정하는 방식까지 바꾸어 놓았습니다.
RAM 한계가 야망이 아닌 배치 크기를 결정한다
vCPU 1개 / 2GB 서버에서는 규칙이 지루하고 협상의 여지가 없습니다. 한 번에 하나의 프로세스만 가능합니다. 모든 에셋 처리 후 gc.collect()를 실행해야 합니다. 평균 사용량이 아니라, 평균적인 수치가 거짓말을 하므로 resource.getrusage(RUSAGE_SELF).ru_maxrss로 최대 RSS를 측정해야 합니다. 무거운 렌더링 단계의 경우, Python이 메모리를 해제할 것이라고 믿기보다 OS가 실제로 메모리를 되찾도록 파일당 하나의 서브프로세스를 실행합니다.
가장 큰 수확은 단순했습니다: 300dpi로 렌더링하는 대신 60dpi에서 미리보기를 검사하는 것입니다. 같은 결정이었지만, 필요한 메모리는 훨씬 적었습니다. 하드웨어와 싸우는 것을 멈추자, 그 작은 서버에서도 파이프라인이 39개 제품, 출력물 856MB를 패키징할 수 있었습니다. 제약 조건 자체가 문제가 아니었습니다. 눈을 감고(무작정) 실행하는 것이 문제였습니다.
플랫폼 CSV 헤더는 강력한 관문이며, 제품 설계에 반영되어야 한다
여기에 가격 책정 연결고리가 있습니다. 메타데이터 단계가 수동이라면, 각 플랫폼마다 실제 시간이 소요되므로 자연스럽게 모든 곳에 등록하는 것을 피하게 됩니다. 한 폴더에서 하나의 명령어로 여러 플랫폼의 CSV 파일을 생성하면, 세 곳 모두에 등록하는 데 드는 추가 비용은 거의 없습니다. 그때부터 세 플랫폼 배포가 제가 목표로 삼던 것이 아니라 기본 방식이 되었고, 가격을 건드리지 않고도 제품당 판매량이 늘어났습니다.
중복 게시(Double-posting)는 플래그를 받는 가장 빠른 방법
시스템 오류 이후 저는 업로드 스크립트를 다시 실행했고, 에셋 일부를 중복으로 게시했습니다. 스톡 플랫폼들은 중복 제출을 스팸 행위로 간주하며, 반복적인 중복은 계정을 검토 대상에 올립니다. 해결책은 놀라울 정도로 간단했습니다: upload_tracker.py라는 파일로, 여기에 pending, done, 그리고 status 명령어가 포함된 단순한 원장(ledger)이 무엇이 배포되었는지 기억합니다. 재실행을 하면 모든 것을 다시 제출하는 대신 남아있는 것만 보여줍니다.
이 교훈은 일반화됩니다: 어떤 자동화 파이프라인이든 속도보다 먼저 **멱등성(idempotency)**이 필요합니다. 안전하게 재실행할 수 있는 배치 작업이 20% 더 빠르지만 위험한 배치 작업보다 가치가 높습니다.
패키징은 가격을 정당화하는 부분입니다
파일만 담은 빈 zip 파일은 공짜로 느껴집니다. 하지만 실제 1280×720 커버와 600×600 썸네일이 포함된 같은 파일들은 제품처럼 보입니다. pack_product.py는 zip을 묶고 Pillow를 이용해 두 이미지를 하나의 명령어로 렌더링합니다. md2pdf.py는 reportlab을 통해 마크다운(Markdown) 문서를 스타일화된 PDF로 변환하여, 문서화, 라이선스 노트, 사용 가이드가 의도적인 것처럼 보이게 합니다.
전체 키트에는 두 개의 종속성만 필요합니다. 메타데이터 및 트래커 스크립트는 표준 라이브러리만 사용하므로, 설치 단계 없이 가장 저렴한 VPS에서 실행됩니다.
폴더 레이아웃이 들리는 것보다 더 중요한 이유
하나의 고정 구조: 원본 출력용 assets/, 제출 준비 파일 및 메타데이터용 output/, 완성된 zip 파일 및 커버용 packs/, 메모 및 로그용 research/, 도구용 scripts/. 제가 한 번 저지른 실수이자 다시는 반복하지 않을 것: '정리'를 위해 research/ 폴더를 삭제하는 것이었습니다. 그 스크랩 로그와 메모가 다음 제품의 원자재입니다. 저장 공간은 싸지만, 300페이지 이상의 연구 자료를 재생성하는 것은 그렇지 않습니다.
이 모든 것은 무료 스택 아래에 놓여 있으며, Hermes Agent가 오케스트레이터 역할을 하고 비용은 $0이고 로컬 LLM 프록시를 사용합니다. 따라서 저의 반복 비용은 본질적으로 서버 비용과 프롬프트 엔진의 이미지당 생성 비용입니다. 이것이 패키지당 낮은 가격을 지속 가능하게 만드는 요인입니다: 포장 계층(packaging layer)이 자동화되면 추가 제품당 한계 비용(marginal cost)이 거의 0에 가깝기 때문입니다.
제가 실제로 배운 가격 책정 방식
가격 책정은 결코 숫자를 고르는 문제가 아니었습니다. 그것은 각 추가 목록과 각 추가 제품의 비용을 낮춰서, 적당한 가격으로도 여전히 마진이 남도록 만드는 것이었습니다. 세 플랫폼에 걸친 자동화된 메타데이터,멱등성(idempotent) 업로드, 원클릭 패키징, 그리고 주머니 돈 수준의 비용이 드는 서버가 저를 그 지점까지 이끌어주었습니다. 2GB 제한은 제가 간결하게 구축하도록 가르쳤고, 바로 그 간결함이 경제성을 작동하게 만든 핵심이었습니다.
저는 이 모든 것을 제가 사용하는 것과 동일한 도구 키트(toolkit)로 패키징했습니다. 네 개의 독립적인 Python 스크립트, 폴더 레이아웃, 그리고 RAM 사용 습관을 정리하여 다른 1인 제작자들을 위해 작성했습니다. 이것은 벡터 프롬프트 팩이며, 하나의 프롬프트 엔진을 39개의 완성된 제품으로 바꾼 정확한 스크립트들입니다.
벡터 프롬프트 팩 받기
디지털 제품을 제작하시나요? 디지털 제품 판매자를 위한 무료 가이드 및 키트.