증시 시황은 매일 갱신되고, 어제 만든 콘텐츠는 오늘 아침이면 낡는다. 그래서 시황을 다루는 콘텐츠는 하루도 빠짐없이 같은 시각에 새로 나와야 한다는 부담을 안고 시작한다. 이 부담을 사람이 매일 손으로 감당하려면 데이터를 찾고, 숫자를 옮겨 적고, 이미지를 만들고, 영상으로 합치고, 업로드하는 일을 하루도 거르지 않고 반복해야 한다. 이 글은 그 반복을 미국·국내·코인 세 시장에 대해 각각 하나씩, 모두 세 개의 파이프라인으로 묶어 한 유튜브 채널에 자동으로 발행하도록 만든 기록이다.

매일 같은 시각에 시황을 정리해야 할 때

콘텐츠 하나가 나오기까지의 일은 늘 같은 순서를 밟는다. 먼저 그날의 시황 데이터를 수집하고, 그중 사람들이 볼 만한 핵심 종목과 지수를 골라내고, 그 내용을 카드 이미지 네다섯 장으로 그리고, 카드를 이어 붙여 영상으로 만들고, 배경 음악을 얹고, 마지막에 유튜브로 올린다. 이 여섯 단계는 시장이 미국이든 국내든 코인이든 뼈대가 같다. 달라지는 건 데이터의 출처와 발행 시각뿐이다.

증시 카드뉴스 흐름도

이 순서를 코드로 굳혀 두면, 매일 아침 사람이 개입하지 않아도 같은 품질의 콘텐츠가 같은 형식으로 나온다. 중요한 건 각 단계가 독립적으로 검증 가능하도록 나뉘어 있다는 점이다. 데이터 수집이 끝났는지, 카드가 다 그려졌는지, 영상이 정상적으로 합쳐졌는지를 단계마다 확인할 수 있어야, 어디서 문제가 났는지 추적할 수 있다. 한 덩어리로 뭉쳐 놓으면 실패했을 때 어느 지점이 무너졌는지 알 수 없다.

세 시장이 서로 다른 시간에 열리고 닫힐 때

세 시장은 열고 닫는 시각이 다르다. 미국 증시는 한국 시간으로 새벽에 마감하고, 국내 증시는 오후 3시 30분에 닫히며, 코인 시장은 애초에 닫지 않는다. 그래서 세 콘텐츠를 하나의 스케줄에 묶을 수 없다. 미국 시황은 장 마감 직후의 데이터가 확정된 뒤에 만들어야 하고, 국내 시황은 국내 장 마감을 기다려야 하며, 코인은 하루 중 정해둔 기준 시각의 스냅숏으로 만든다. 세 파이프라인이 각기 다른 시각에 독립적으로 돌아가는 이유다.

증시 카드뉴스 흐름도 2

세 파이프라인은 발행 시각과 데이터 출처만 다를 뿐, 카드를 그리고 영상을 합치고 업로드하는 부분은 완전히 같은 코드를 공유한다. 시장별로 코드를 세 벌 복사해 두면 한 곳을 고칠 때 세 곳을 모두 고쳐야 하고, 그러다 한 곳을 빠뜨리면 시장마다 다른 결과가 나온다. 그래서 공통 부분은 한 벌로 유지하고, 시장별 차이는 설정값으로만 갈아 끼운다. 미국 파이프라인은 미국용 설정을 읽고, 국내 파이프라인은 국내용 설정을 읽는 식이다.

미국 증시 카드뉴스 자동 생성 이미지 예시 1

숫자 하나가 틀리면 안 되는 콘텐츠를 자동으로 만들 때

시황 콘텐츠에서 가장 위험한 건 틀린 숫자다. 지수 등락률을 잘못 적거나, 어제 데이터를 오늘 것으로 착각해 올리면, 자동화는 편리한 도구가 아니라 매일 틀린 정보를 퍼뜨리는 장치가 된다. 사람이 만들면 마지막에 눈으로 한 번 더 확인하지만, 자동화에는 그 눈이 없다. 그래서 눈을 대신할 검산 게이트를 파이프라인 안에 넣었다.

핵심 원칙은 fail-closed다. 데이터 수집이나 검산에서 하나라도 문제가 생기면, 어정쩡하게 만들어 올리는 대신 그날 발행을 통째로 건너뛴다. 예를 들어 그날이 거래일이 아니거나, 데이터 소스가 빈 값을 돌려주거나, 지수 값이 상식 범위를 벗어나면, 파이프라인은 거기서 멈추고 업로드 단계로 넘어가지 않는다. 틀린 콘텐츠를 올리는 것보다 그날 하루 콘텐츠가 없는 편이 낫다는 판단이다. 자동화의 기본값을 “의심스러우면 올린다"가 아니라 “의심스러우면 멈춘다"로 잡아 두는 것이 이 구조의 뼈대다.

이 게이트는 실제 운영에서 여러 번 제 역할을 했다. 주말이나 공휴일처럼 장이 열리지 않은 날, 데이터 소스는 전날 값을 그대로 돌려주기도 한다. 거래일 게이트가 없으면 이 값을 오늘 시황으로 착각해 같은 내용을 반복 발행하게 된다. 그래서 콘텐츠를 만들기 전에 “오늘이 이 시장의 거래일이 맞는가"를 먼저 확인하고, 아니면 조용히 건너뛴다. 국내 장이 쉬는 날과 미국 장이 쉬는 날은 서로 다르기 때문에, 이 판단도 시장별로 따로 한다.

카드 다섯 장을 손 안 대고 그리려면

선별된 시황 데이터는 이미지가 되어야 한다. 이 부분은 Pillow로 처리한다. 배경 판을 깔고, 그 위에 제목과 종목명과 등락률을 정해진 위치에 얹고, 색으로 오름과 내림을 구분해 카드 한 장을 완성한다. 이런 카드를 하루에 시장마다 네다섯 장씩 그린다. 첫 장은 그날의 요약, 다음 장들은 주요 지수와 종목, 마지막 장은 마무리 같은 식으로 구성이 정해져 있다.

이미지를 코드로 그리는 방식의 장점은 일관성이다. 사람이 매일 디자인 도구로 카드를 만들면 위치와 글자 크기가 미세하게 흔들리지만, 코드는 매번 같은 좌표에 같은 크기로 글자를 얹는다. 폰트, 색, 여백을 한 번 정해 두면 그 규칙이 모든 카드에 그대로 적용된다. 등락을 나타내는 색 규칙 같은 것도 코드에 박아 두면, 오르는 종목은 언제나 같은 색, 내리는 종목은 언제나 다른 색으로 나온다. 보는 사람이 색만으로 방향을 읽을 수 있게 하는 규칙이 매일 깨지지 않고 유지된다.

미국 증시 카드뉴스 자동 생성 이미지 예시 2

정지 이미지를 영상으로 바꾸고 소리를 입힐 때

카드는 정지 이미지지만 유튜브에 올라가는 건 영상이다. 그래서 완성된 카드 여러 장을 이어 붙여 각 장이 몇 초씩 화면에 머무는 슬라이드쇼 형태의 영상으로 합친다. 여기에 배경 음악을 얹으면 콘텐츠 한 편이 완성된다. 카드 장수와 각 장의 노출 시간이 정해져 있으니 영상 길이도 일정하게 나온다.

음악은 콘텐츠 성격에 맞는 것을 미리 골라 둔 목록에서 가져온다. 매번 새로 고르지 않고 정해진 풀에서 순환시키면, 저작권을 신경 쓸 범위가 좁아지고 편마다 톤이 크게 튀지 않는다. 영상 합성 단계에서 챙겨야 하는 건 화면 비율과 해상도, 음량이 유튜브에서 어색하지 않게 나오는지 정도다. 이 값들도 한 번 맞춰 두면 매 편에 그대로 적용된다.

코인 시황 카드뉴스 자동 생성 이미지 예시

사람 없이 유튜브에 올리려면

마지막 단계는 업로드다. 유튜브에 프로그램으로 영상을 올리려면 OAuth 인증을 거쳐 채널에 접근할 권한을 얻어야 한다. 한 번 사용자 동의를 받아 발급된 토큰으로 이후의 업로드를 자동으로 처리하는 구조다. 문제는 이 토큰이 영원하지 않다는 점이다. 액세스 토큰은 짧은 주기로 만료되고, 그때마다 리프레시 토큰으로 새 토큰을 발급받아야 한다. 이 갱신이 조용히 실패하면, 어느 날 아침 갑자기 업로드만 안 되는 상황이 생긴다.

실제 운영에서 겪은 전형적인 문제도 이 지점이었다. 앞 단계는 모두 정상이라 카드와 영상까지 멀쩡하게 만들어졌는데, 업로드 단계에서 인증이 풀려 마지막에서 멈추는 경우다. 그래서 인증과 토큰 관리는 파이프라인 본체에서 떼어 내 한곳에서만 다루도록 분리했다. 세 파이프라인이 각자 인증을 처리하면 토큰이 세 벌로 흩어져 어느 것이 만료됐는지 파악하기 어렵지만, 인증을 한 곳으로 모으면 토큰 상태를 한 자리에서 관리할 수 있다. 업로드가 실패했을 때 그 원인이 인증인지 다른 것인지도 빨리 가려낼 수 있다.

또 하나 조심하는 건 공개 범위다. 사람이 검수하지 않은 콘텐츠가 곧바로 전체 공개로 올라가면, fail-closed 게이트를 통과하지 못한 무언가가 새어 나갔을 때 되돌리기 어렵다. 그래서 무엇이 어떤 공개 상태로 올라가는지에 대한 판단은 자동화가 스스로 내리지 않고, 발행 정책을 정해 둔 규칙에 따르게 한다. 자동으로 도는 파이프라인이라도, 바깥에 공개되는 지점만큼은 통제 아래 두는 것이 이 구조의 마지막 안전장치다.

세 파이프라인을 하나의 뼈대로 묶으면

세 시장의 파이프라인을 따로 만들었다면 각각의 개선이 서로 다른 곳에 흩어졌을 것이다. 하나의 뼈대로 묶어 두니, 카드 디자인을 한 번 고치면 세 시장에 동시에 반영되고, 검산 규칙을 하나 추가하면 세 파이프라인이 함께 안전해진다. 시장별로 갈리는 것은 데이터 출처와 발행 시각, 그리고 거래일 판단뿐이고 나머지는 공유 자산이 된다.

자동화라고 부를 만한 부분은 화려한 무언가가 아니다. 매일 반복되던 수집과 선별과 렌더와 합성과 업로드를 코드로 굳히고, 그 사이사이에 “틀렸으면 멈춘다"는 게이트를 심어 둔 것이다. 이 구조가 자리를 잡으면 사람은 매일의 반복에서 벗어나, 무엇을 어떻게 보여줄지를 정하는 판단에만 집중할 수 있다. 콘텐츠의 질을 결정하는 건 결국 그 판단이고, 자동화는 그 판단이 매일 같은 품질로 세상에 나가도록 실어 나르는 역할을 한다.

이 프로젝트를 만드는 팀

이 파이프라인은 시황 콘텐츠를 승인하고 수치를 검산하는 리드가 조율하고, 수집·디자인·합성·인프라·개선을 나눠 맡는 역할들이 그 아래에서 움직인다. jeungsi-briefing-lead가 시황 콘텐츠 승인과 수치 검산, 전체 조율을 맡고, data-analyst가 정형 데이터를 수집하고, card-designer가 카드 디자인을 담당하며, video-publisher가 영상 합성을 처리한다. 그 외 형태의 영상은 video-team이, OAuth와 업로드 인프라는 youtube-upload-team이 단일 관리하고, content-refiner가 가독성과 후킹을 지속적으로 개선한다.

증시 카드뉴스 흐름도 3