본문 바로가기

EP 빌드로그

EP.33 자동화 자동으로 이어지는 작업 흐름 재개 경로 만들기: 사람이 고친 글을 중복 없이 다시 태우기 (EP.자동화)

이번 회차의 문제: 사람이 고쳐도 돌아갈 길이 없었다

글을 자동으로 만들어 올리는 프로그램을 쓰다 보면, 품질 검사에 걸려 중간에 멈추는 글이 생깁니다. 이럴 때 사람이 문장을 손봐서 검사를 통과시키는 것까지는 됩니다. 문제는 그다음이었습니다.
검사에 걸리면 프로그램은 돈이 드는 이미지 만들기를 건너뜁니다. 그런데 사람이 문장을 고쳐 통과시켜도, 한 번 건너뛴 그 단계가 저절로 되살아나지 않았습니다. 돌아갈 길이 없으니 사람이 직접 이미지를 손으로 만들어 다시 올렸고, 그 과정에서 블로그에 중복 초안이 생겼습니다.
이번 회차에서는 사람이 고친 글을 명령어 한 줄로 다시 태우는 재개 경로를 만들었습니다. 빠진 부분만 채우고 발행 대기 상태로 되돌리는 길입니다.


무엇을 확인했나: 멈춘 뒤 벌어진 일들

기존 흐름에서 문제가 드러난 지점은 다음과 같았습니다.

  • 검사 미통과 → 과금(돈 나가는 작업)을 피하려고 이미지 생성을 건너뜀
  • 사람이 원고를 고쳐 검사를 통과시킴 → 그래도 건너뛴 이미지 단계는 되살아나지 않음
  • 사람이 이미지를 손으로 만들어 다시 올림 → 블로그에 중복 초안 발생

즉 '사람이 개입한 뒤 다시 정상 경로로 합류하는 길'이 아예 없던 것이 핵심 원인이었습니다.


원인: 개입 이후를 잇는 다리가 없었다

자동화의 각 단계는 앞 단계가 끝나야 다음으로 넘어가도록 이어져 있습니다. 그런데 사람이 중간에 끼어들어 한 단계를 수동으로 통과시키면, 그 뒤 단계를 자동으로 다시 시작할 방법이 없었습니다.
중요한 판단 기준이 하나 있었습니다. 사람이 '고쳤다'고 말했다는 이유만으로 곧바로 뒷단계를 진행하지 않는다는 원칙입니다. 원문 기록에 따르면 이 자동으로 이어지는 작업 흐름의 계약(내부 규칙) 5항은 사람이 개입해도 그대로 적용됩니다. 그래서 재개할 때도 사람 말만 믿지 않고 다시 검사를 돌리도록 설계했습니다.


어떻게 고쳤나: resume 명령어 한 줄

재개는 app/resume.py에 담았고, 다음 명령으로 실행합니다.

python -m app.resume <slug>

여기서 slug는 글을 가리키는 주소용 이름입니다. 이 명령이 하는 일을 순서대로 정리하면 이렇습니다.

  1. 다시 검사한다. 사람이 고친 원고(draft.json)를 원문과 대조해 검사를 다시 돌립니다. 사람이 고쳤다는 말만 믿지 않습니다.
  2. 빠진 이미지만 만든다. 통과하면 없는 이미지만 채웁니다. 이미 있는 장(章)에는 다시 돈을 쓰지 않도록 generate_images(only_indices=...) 옵션을 새로 넣었습니다.
  3. 발행 대기로 되돌린다. 산출물을 갱신하고 대기열 상태를 발행 대기로 바꿔, 원래의 정상 발행 경로가 그 글을 자연스럽게 집어가게 합니다.

검사에 통과하지 못하면 아무것도 바꾸지 않고 새 판정 결과만 남깁니다. 또한 이미 임시저장된 글은 기본적으로 재개를 거부해 중복 초안을 막았고, --force를 붙였을 때만 산출물을 수정하도록 했습니다. 마지막으로, 사람에게 알리는 텔레그램 알림에 재개 명령을 함께 넣어, 다음에 뭘 해야 할지 바로 알 수 있게 했습니다.


전후 비교

사람이 고친 뒤돌아갈 길 없음명령 한 줄로 다시 태움
이미지 채우기사람이 손으로 생성빠진 것만 자동 생성
과금이미 있는 것도 중복될 위험없는 것만 만들어 중복 과금 방지
중복 초안수동 재업로드 과정에서 발생임시저장 글 기본 거부로 방지
정상 경로 합류이어지는 자동 경로 없음발행 대기로 되돌려 자동 합류

만들다 하마터면 새로 만들 뻔한 버그

재개 기능을 만들다 원래 없던 버그를 하나 더 만들 뻔했습니다. 산출물을 정리하는 write_outputs에 '이번에 새로 만든 이미지'만 넘기면, 재개된 글의 검수 노트가 실제보다 적은 이미지 수를 표시하는 문제였습니다.

여기서 배운 원칙은 이렇습니다. 부분 재실행은 전체 실행과 다르다. 산출물을 만들 때 근거로 삼아야 하는 것은 '이번에 만든 것'이 아니라 '지금 있는 것 전부'입니다.
또 하나, 이미지의 이름표(label)와 배치 위치(placement)가 어디에도 저장돼 있지 않아 원고에서 되살려야 했습니다. 중간 산출물의 메타데이터(부가 정보)를 남겨두지 않으면, 나중에 부분 재개할 때 그걸 원고에서 복원하는 비용을 치르게 된다는 것을 이번에 겪었습니다.


남은 과제

이번 작업으로 테스트를 15건 추가했고 45건이 통과했습니다. 이번 재개 기능을 만들면서, 이미지의 이름표·배치 같은 메타데이터가 중간 산출물에 저장돼 있지 않아 원고에서 되살려야 했던 점이 부분 재개의 복원 비용으로 남았습니다. 이 지점이 앞으로 다뤄볼 만한 부분입니다.
이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.

반응형