자동화 slecs

썰창고박스 채널 숏츠 자동 업로드 파이프라인 구축

목차

썰창고박스 채널용 자동화 파이프라인을 처음으로 붙였다. 단순히 "영상 올려주는 봇" 같은 느낌으로 시작했는데, 실제로 구조를 잡고 나니 생각보다 고려해야 할 요소가 많았다.


왜 이걸 만들었나

채널 운영을 수동으로 하면 반복 작업이 너무 많다. 썰 소재를 고르고, 숏츠 포맷으로 편집하고, 업로드 스케줄 잡고, OAuth 인증 갱신하고 — 이걸 매번 손으로 하면 콘텐츠 기획 자체에 집중할 수 없다. 팀에서도 "운영 루틴은 자동화해서 사람이 판단해야 할 곳에만 신경 쓰자"는 방향이 이미 잡혀 있었고, 이번에 썰창고박스 채널이 신규로 추가되면서 파이프라인을 처음부터 제대로 세팅할 기회가 생겼다.


파일별 역할 정리

이번 커밋에서 만지거나 새로 생긴 파일들이 각자 다른 레이어를 담당한다.

파일 역할
auto_shorts.py 전체 파이프라인 오케스트레이터. 큐에서 항목 꺼내고 숏츠 생성 → 업로드까지 연결
shorts.py 숏츠 포맷 변환/렌더링 로직. 영상 단위 처리 담당
oauth_setup.py YouTube Data API OAuth 토큰 발급 및 갱신 처리
queue.jsonl 업로드 예정 콘텐츠 큐. JSONL 포맷으로 항목 단위 관리
CHANNEL_SETUP.md 채널 세팅 가이드 문서. 처음 온보딩하는 팀원이 보는 용도
.gitignore 토큰 파일, 캐시, 민감 정보 제외 처리

레이어가 명확하게 분리되어 있어서 나중에 shorts.py만 건드려도 파이프라인 전체를 갈아엎지 않아도 된다. 이 구조를 처음부터 잡는 게 중요하다고 생각했다. 자동화 스크립트들이 흔히 실패하는 패턴이 "하나의 파일이 다 한다"인데, 나중에 수정하거나 디버깅할 때 지옥이 된다.


큐 구조와 파이프라인 흐름

queue.jsonl을 쓴 건 의도적인 선택이다. JSON array 하나에 다 몰아넣으면 항목 추가/삭제할 때 파일 전체를 다시 써야 하고, 동시성 문제도 생길 수 있다. JSONL은 한 줄이 하나의 항목이라 append만으로 추가되고, 처리된 항목은 읽으면서 상태를 마킹하거나 별도 파일로 분리하는 식으로 관리하기 편하다.

# queue.jsonl 항목 예시 구조 (패턴)
{"id": "ssul_001", "source": "...", "status": "pending", "scheduled_at": "2026-05-11T09:00:00"}
{"id": "ssul_002", "source": "...", "status": "done",    "scheduled_at": "2026-05-11T10:00:00"}

auto_shorts.py가 이 큐를 읽어서 pending 항목을 꺼내고, shorts.py로 넘겨서 렌더링 후 업로드까지 처리한다. 실패하면 statusfailed로 바꾸고 재시도 큐로 넘기는 흐름을 염두에 두고 설계했다.


OAuth 처리가 생각보다 손이 많이 갔다

oauth_setup.py가 별도 파일로 분리된 이유가 있다. YouTube API OAuth는 최초 인증 이후 refresh token으로 자동 갱신하는 구조인데, 토큰 만료나 권한 범위 변경이 생기면 재인증 플로우를 다시 밟아야 한다. 이걸 메인 파이프라인 안에 섞어놓으면 인증 오류가 났을 때 파이프라인 전체가 터진다.

# oauth_setup.py 의 핵심 패턴 (일반적인 구조)
def get_credentials():
    if token_exists() and not token_expired():
        return load_token()
    elif refresh_token_available():
        return refresh_and_save()
    else:
        return run_initial_auth_flow()

분리해두면 "인증 문제냐, 업로드 로직 문제냐"를 빠르게 판단할 수 있다. 팀원이 파이프라인을 처음 세팅할 때도 oauth_setup.py만 먼저 실행해서 인증이 제대로 됐는지 확인한 다음 auto_shorts.py를 돌리면 된다. CHANNEL_SETUP.md에도 이 순서를 명시해뒀다.


.gitignore 와 문서화는 자동화의 일부다

.gitignore에 토큰 파일, credential JSON, 캐시 디렉토리를 명시한 건 당연한 얘기 같지만, 이게 빠진 자동화 레포가 생각보다 많다. OAuth 토큰이 실수로 커밋되면 즉시 채널 접근 권한이 노출되는 문제라 첫 커밋에서 확실히 처리했다.

CHANNEL_SETUP.md도 나는 문서화를 코드만큼 중요하게 보는 편이다. 총괄 포지션에서 느끼는 건, 내가 만든 자동화가 나만 돌릴 수 있으면 반쪽짜리라는 거다. 팀원 누구든 레포 클론하고 문서 보고 혼자 세팅 완료할 수 있어야 진짜 완성이다. 이번에 채널 세팅 절차, 필요한 환경변수, 큐 항목 포맷, 재시도 정책까지 한 파일에 다 정리했다.


파이프라인 첫 버전은 항상 "돌아가게 만드는 것"과 "믿고 맡길 수 있게 만드는 것" 사이의 간극이 크다. 이번엔 구조부터 잡고 들어갔으니, 다음 단계는 실제 운영하면서 실패 케이스를 모아 재시도 로직을 다듬는 쪽이 될 것 같다.

다음.

댓글 0

첫 댓글 달아줘.