python upload_tracker.py pending items.txt # 아직 완료되지 않은 항목
python upload_tracker.py done
중복 업로드를 막게 해준 습관: 배치 스크립트는 원본 항목 목록을 읽지 않습니다. 대신 `pending` 출력을 읽습니다. 재실행이 발생하더라도 이미 게시된 파일 이름은 pending 목록에 포함되어 있지 않으므로, 아무것도 두 번 제출되지 않습니다. `done`으로 표시하는 것은 각 성공적인 업로드 후에 한 번의 명령만 필요하며, 모든 배치 작업 전에 `status`를 확인하는 데는 2초가 걸립니다. 전체 과정은 표준 라이브러리만 사용하므로 의존성이 없고, 제가 SSH로 접속하는 어떤 컴퓨터에서도 실행됩니다.
## 플랫폼이 생각보다 더 신경 쓰는 이유
중복 파일은 무해한 것 같아 보이며, 수천 개의 파일 중 하나일 뿐이라고 생각하기 쉽습니다. 하지만 검토자 입장에서 보면 다르게 보입니다. 스톡 플랫폼은 다운로드 건당 비용을 지불하며, 검토자는 제출된 파일을 이미 존재하는 내용과 비교합니다. 반복적으로 거의 동일한 업로드는 스팸이나 키워드 조작으로 간주되며, 이 두 가지 모두 중복된 파일뿐만 아니라 계정 전체를 의심받게 만듭니다. 수동으로 철회하는 것도 상당한 시간 비용이 듭니다. 지난 화요일에 84개 파일을 정리하는 데 약 네 시간이 걸렸습니다. 반면, 트래커는 작성하는 데 저녁 한 번의 시간만 들었고 그 이후로는 0분이 걸립니다.
## 나머지 파이프라인은 여전히 작은 서버에 맞춰야 한다
트래커 자체는 비용이 적게 들지만, 주변 파이프라인은 그렇지 않습니다. 저는 GPU가 없는 1 vCPU, 2 GB RAM 서버에서 모든 것을 실행합니다. 이 시스템을 유지하는 세 가지 습관이 있습니다:
- 한 번에 하나의 프로세스만 처리합니다. 단일 코어에서 이미지 작업을 병렬로 분산하면 단순히 자원을 과부하시킵니다(thrashes).
- 각 에셋 처리 후 `gc.collect()`를 실행합니다. 파이썬은 예상보다 오랫동안 메모리를 보유하기 때문입니다.
- 평균 사용량이 아닌, `resource.getrusage(RUSAGE_SELF).ru_maxrss`로 최대 RSS(Resident Set Size)를 측정합니다. 피크 값이 OOM(Out Of Memory)으로 종료되는 원인이 됩니다.
무거운 렌더링 단계의 경우, 메모리가 OS로 반환되도록 파일당 서브프로세스를 실행하며, 300dpi로 렌더링하는 대신 60dpi에서 미리보기를 검사합니다. 트래커는 텍스트 원장(text ledger)이기 때문에 이 예산에 사소하게 들어맞습니다. 핵심은 이것입니다: 지루하고 안전한 도구는 스택에서 가장 저렴해야 합니다.
## 폴더 구조가 트래커를 가능하게 한다
트래커가 작동하려면 파일 이름이 안정적이어야 합니다. 즉, 잡동사니 보관함(junk drawer)이 아니라 고정된 구조여야 합니다:
project/
assets/ 원시 출력물(raw output)
output/ 제출 준비 파일 + 메타데이터 CSV
...
`assets/`에는 자산당 하나의 파일이 있고, 이 이름은 `output/`까지 유지됩니다. 단계 사이에 파일을 이름을 변경하면 기록부(ledger)가 오래되므로, 한 번 이름을 정했다면 계속 사용하세요. 또한 저는 이제 영구적으로 `research/` 폴더를 유지합니다. 메모를 삭제하여 정리하는 것이 나중에 제품을 만들 때 원자재 비용을 낭비하게 했고, 저는 그런 일을 반복하지 않을 것입니다.
## 이 과정이 완성된 곳
이 모든 것은 컴플라이언스 메타데이터 키트(compliance metadata kit)에 담겨 있습니다. 여기에는 제가 사용하는 동일한 네 가지 스크립트가 포함되어 있으며, 정확히 Adobe용 5개 열, Vecteezy용 4개 열, Dreamstime용 15개 열 헤더를 가진 `make_metadata.py`와 위에서 설명된 기록부인 `upload_tracker.py`가 있습니다. 이것은 이 작업으로 만들어진 도구이지, 이에 대한 강좌는 아닙니다. 또한 마크다운(Markdown)을 스타일이 적용된 PDF로 변환하는 `md2pdf.py`와 패키징(packaging)이 판매의 또 다른 절반이기 때문에 1280×720 커버와 600×600 썸네일로 제품을 압축하는 `pack_product.py`도 포함되어 있습니다. 총 두 개의 종속성(Pillow, reportlab)이 있으며, 메타데이터 및 트래커 스크립트는 어느 것도 필요하지 않습니다.
만약 배치 작업(batches)을 수행한다면, 이번 주에 기록부를 추가하세요. 제가 수동으로 처리했던 중복 파일 정리 작업은 이 프로젝트에서 가장 지루했던 4시간이었으며, 완전히 예방할 수 있는 일이었습니다.
[컴플라이언스 메타데이터 키트 받기](https://revanzart-shop.revanzart.workers.dev/go/compliance-metadata-kit?src=devto)
_디지털 제품을 제작하시나요? [디지털 제품 판매자를 위한 무료 가이드 및 키트](https://revanzart-shop.revanzart.workers.dev/guides)._