앱스토어 스크린샷 현지화, 끊겨도 이어 돌리는 작업 상태 설계
언어×화면 셀 단위로 상태를 쪼개고 입력 해시로 변경분만 다시 만드는, 재실행 가능한 스크린샷 현지화 파이프라인 설계 기록이에요.
개발 중인 플랜티(plan-t) 앱스토어 등록 페이지를 준비하면서 스크린샷을 여러 언어로 뽑는 스크립트를 짰어요. 언어 5개에 화면 6장이면 30장인데, 문제는 장수가 아니라 중간에 한 장이 깨졌을 때였어요. 독일어 카피가 프레임을 넘쳐서 다시 돌리면 멀쩡했던 29장까지 처음부터 그리더라고요.
직접 만들어 보니 "전부 다시"가 기본값인 스크립트는 고칠수록 더 자주 돌리게 되고, 돌릴수록 더 오래 기다리는 구조였어요. 그래서 생성 로직보다 작업 상태를 먼저 다시 설계했어요.
작업 단위를 셀로 쪼개기
핵심은 "스크린샷 현지화"라는 큰 작업 하나를 언어 × 화면 셀로 나누는 거예요. 30개 셀 각각이 자기 상태를 가져요. 대기, 생성됨, 검수됨, 실패. 4가지면 충분했어요. 더 잘게 나눌 이유가 생기기 전까지는요.
셀마다 입력 해시를 같이 저장해요. 그 언어의 카피 텍스트, 템플릿 버전, 배경 이미지 이름을 묶어 해시 하나로 만들어요. 재실행할 때 해시가 같으면 건너뛰고, 다르면 그 셀만 다시 그려요. 카피 한 줄 고치면 해당 언어의 그 화면 1장만 바뀌는 구조예요.
상태는 파일 하나, 쓰기는 원자적으로
상태 저장소로 데이터베이스까지 갈 필요는 없었어요. JSON 파일 1개면 돼요. 다만 쓰는 도중에 프로세스가 죽으면 파일이 반쯤 잘려서 다음 실행이 상태를 못 읽어요. 그래서 임시 파일에 먼저 쓰고 이름을 바꾸는 방식으로 교체해요. 같은 디스크 안에서 이름 바꾸기는 한 번에 끝나니 잘린 파일이 남지 않아요.
테스트해 보면 이 부분이 생각보다 자주 걸려요. 30장 중 17번째에서 일부러 프로세스를 끊고 다시 돌려 봤더니, 원자적 쓰기 전에는 상태 파일이 깨져 처음부터 시작했고, 바꾼 뒤에는 18번째부터 이어서 돌아갔어요.
실패는 지우지 말고 격리하기
실패한 셀을 "대기"로 되돌리면 재실행 때마다 같은 자리에서 또 넘어져요. 실패 상태에 이유를 문자열로 함께 남겨두면 어느 언어의 어느 화면이 왜 막혔는지 목록으로 바로 보여요. 해시가 바뀌었을 때만 실패 셀을 다시 시도하게 해두면 카피를 고치기 전엔 헛돌지 않아요.
- 언어×화면 셀 단위 상태
- 입력 해시로 변경 감지
- 임시파일→rename 원자 쓰기
- 실패는 이유와 함께 격리
검수됨 상태는 스크립트가 못 찍어요. 넘침이나 어색한 줄바꿈은 결국 사람이 봐야 해서, 검수는 별도 명령으로 셀 하나씩 올려요. 적용해 봤더니 이 경계를 나눈 게 제일 편했어요. 생성은 몇 번을 돌려도 검수 표시를 안 건드리고, 카피가 바뀌면 검수 표시만 자동으로 내려가요.
남은 것
돌려 보니 상태 설계는 한 번 잡아두면 언어를 추가할 때도 그대로 써요. 6번째 언어를 넣으면 셀 6개가 대기 상태로 생기고, 기존 30개는 손도 안 대요. 라이프케어로그는 1인 개발이라 이런 반복 작업이 쌓이면 그대로 시간이 새요. 스크립트를 하나 더 짜는 것보다 상태 설계를 먼저 잡는 쪽이 결국 덜 짜는 길이었어요.
관련 글
댓글
아직 댓글이 없어요. 첫 댓글을 남겨주세요.