폴더를 순서대로 처리하는 코드에서 중요한 것은 반복문의 모양보다 언제 다음 폴더를 열어도 되는가였다. 현재 항목의 외부 결과가 불확실한데 다음으로 가면 미해결 작업이 계속 쌓인다. 나는 실제 결과 확인과 작업 사본 이동이 끝나야 다음 항목으로 넘어가도록 기존 반복기에 어댑터를 연결했다.
반복의 뼈대와 실제 업무를 분리한다
기존 run_scheduler는 대기 폴더와 시작 시각을 보고 항목 함수를 호출한 뒤 반환 상태에 따라 계속하거나 멈춘다. success일 때만 완료 수를 늘린다. unconfirmed와 오류는 다음 항목을 자동 실행하는 신호가 아니다. 실제 브라우저 업무는 어댑터의 publish_item으로 넘긴다.
원본 노트북의 실행 셀을 통째로 다시 돌리는 구조도 아니다. 어댑터는 필요한 import와 함수 정의를 골라 읽고 실행 경로를 연결한다. 반복 함수를 재사용했다는 말과 원본 셀의 모든 동작을 그대로 실행했다는 말은 다르다. 나는 어느 부분을 빌려 썼는지 실제 코드로 나누어 설명한다.
접수 전에 dispatching 기록을 남긴다
어댑터의 항목 함수는 현재 pending의 첫 이름을 읽고 queued인지 확인한다. 실제 publish를 부르기 전에 dispatching으로 바꿔 원장을 저장한다. 이미 완료된 항목을 다시 부르면 거절하고 다른 미확정 상태도 그대로 계속 실행하지 않는다. 요청을 보내기 시작한 흔적을 결과보다 앞에 남기는 순서다.
이 기록은 외부 동작이 실제로 전달됐다는 최종 증거가 아니다. 요청 전과 후 사이에서 프로세스가 끊길 수 있기 때문이다. 그래도 뒤늦게 같은 폴더를 보면 아무 일도 없었던 queued와 구분할 수 있다. 나는 상태 기록이 성공만 설명하는 것이 아니라 무엇이 불확실한지 남기는 자료여야 한다고 봤다.
검증 결과 뒤에도 파일 이동이 남는다
publish가 돌아오면 reservationVerified가 참인지 확인한다. 그 뒤 항목 결과를 남기고 pending 사본을 done으로 옮겨 원장을 저장한다. done에 같은 이름이 있으면 덮지 않고 오류로 멈춘다. 원본 자료 폴더는 이 이동의 대상이 아니다.
실제 외부 처리는 성공했지만 파일 이동이 실패할 수도 있다. 그 경우 어댑터는 needs_review와 unconfirmed로 멈춘다. 이를 곧바로 외부 처리 실패라고 해석해 다시 보내면 중복될 수 있다. 나는 파일 정리의 실패와 서비스 결과의 실패를 분리해 읽어야 한다고 설명한다. 이미 받은 결과와 남은 사본이 복구 재료다.
사용자의 중지를 재사용 코드가 지우지 않게 했다
원래 run_scheduler에는 시작할 때 STOP 파일을 지우는 문장이 있다. 어댑터는 AST에서 그 문장만 제거한다. 등록과 실행 준비 중 들어온 중지 요청이 함수 시작과 함께 사라지지 않게 하려는 변경이다. 원본 파일을 고친 것이 아니라 불러오는 함수 정의를 제한적으로 바꾼다.
wait_until도 그대로 쓰지 않고 짧은 간격으로 STOP을 확인하는 어댑터 함수로 연결한다. 원본의 긴 대기와 같은 중지 의미를 유지하면서 응답성을 바꾼 것이다. 그래서 이 구현을 원본의 모든 줄을 완전히 그대로 쓴 것이라고 소개하지 않는다. 재사용과 변경이 만나는 정확한 경계를 남기는 것이 제작 기록의 핵심이었다.
예제는 실제 사본과 다음 항목의 상태를 본다
공유한 독립 반복기는 합성 파일을 복사해 현재 항목만 완료 위치로 옮긴다. 미확정 결과와 사본 변경, 이동 오류에서는 다음 폴더를 넘기지 않는지24개 시험으로 확인했다. 원본 바이트와 완료 위치 충돌도 실제 파일로 검사했다. 이것은 어댑터 원본의 모든 외부 실행을 새로 검증한 결과는 아니다.
이번 집필에서는 원본 run_scheduler의 함수 소스만 AST로 추출해 읽었다. 원래 노트북과 예약, 브라우저를 실행하지 않았다. 공개 예제의 결과 선언도 서비스 성공을 인증하지 않는다. 직접 실행한 작은 파일 시험과 읽기 전용으로 확인한 제품 경로를 서로 다른 근거로 남긴다.
완료 폴더는 성공의 장식보다 다음 작업의 조건이다
done으로 이동했다는 사실을 단순 정리 기능으로 보면 오류 때 순서를 쉽게 바꿀 수 있다. 나는 그 위치가 어떤 결과를 확인하고 다음 항목을 열었는지 설명하는 자료라고 본다. 이동만 됐다고 성공은 아니지만 이동과 원장을 함께 읽으면 진행의 근거를 좁힐 수 있다.
회사 업무의 자료 전달과 문서 생성도 같다. 한 건이 끝나기 전에 다음 건을 시작하는 것이 항상 빠른 것은 아니다. 미확정 결과를 쌓지 않는 흐름이 전체 복구 시간을 줄일 수 있다. 이 반복기는 더 많은 폴더를 빨리 도는 기능보다 현재 폴더가 어떤 상태로 남았는지 읽을 수 있게 만드는 작업이었다.