동작 여섯 개를 골라 영상으로 뽑는 작업이었다. 그림을 한 장씩 렌더해서 영상으로 묶는다.
다 돌고 나서 결과 폴더를 열었다. 여섯 개 다 있다. 작업 완료.
파일이 전부 0바이트였다
크기를 보고서야 알았다. 여섯 개 전부 0바이트. 이름만 있고 내용이 없다.
영상을 묶는 프로그램을 직접 돌려 메시지를 봤다. 한 줄이었다.
“높이가 2로 나눠지지 않음 (720×405)”
내가 화면 크기를 720×405로 잡았다. 405는 홀수다. 이 방식으로 영상을 만들면 세로 픽셀이 짝수여야 한다. 압축기가 아예 열리지 않고 그대로 죽는다.
더 나쁜 건 그다음이었다
크기야 고치면 된다. 문제는 왜 완료라고 나왔느냐다.
내 코드는 영상 묶는 프로그램을 부르고 결과를 확인하지 않았다. 성공했는지 실패했는지 알려주는 값이 돌아오는데 그걸 안 봤다. 그리고 다음 줄에서 재료로 쓴 그림 파일을 전부 지웠다.
그러니까 실패한 채로, 증거까지 없앤 채로, 다음 항목으로 넘어간 것이다. 여섯 번 반복했다.
목록만 보면 파일 여섯 개가 가지런히 있다. 크기를 안 보면 정상으로 보인다.
실패하면 멈추게 했다
고친 건 두 가지다. 크기를 960×540으로 바꿨다. 그리고 영상 묶기가 끝나면 반환값·파일 존재·파일 크기 셋을 확인하고, 하나라도 어긋나면 거기서 멈추게 했다. 재료 그림도 안 지운다. 원인을 봐야 하니까.
만들었다는 사실과 만들어졌다는 사실은 다르다. 확인하지 않은 성공은 성공이 아니다.
재발방지 체크리스트
① 외부 프로그램을 부르면 반환값을 반드시 본다. 안 보면 실패가 성공으로 집계된다.
② 산출물은 존재 + 크기까지 확인한다. 0바이트 파일은 목록에서 정상으로 보인다.
③ 실패했을 때 재료를 지우지 않는다. 지우면 원인을 다시 만들어야 한다.
④ 영상 크기는 가로세로 둘 다 짝수로 잡는다. 홀수 한 변이면 압축기가 열리지 않는다.
① 외부 프로그램을 부르면 반환값을 반드시 본다. 안 보면 실패가 성공으로 집계된다.
② 산출물은 존재 + 크기까지 확인한다. 0바이트 파일은 목록에서 정상으로 보인다.
③ 실패했을 때 재료를 지우지 않는다. 지우면 원인을 다시 만들어야 한다.
④ 영상 크기는 가로세로 둘 다 짝수로 잡는다. 홀수 한 변이면 압축기가 열리지 않는다.