자료를 처리하던 창이 닫히면 어디까지 끝났는지 알 수 있을까. 다시 시작 버튼을 누르기 전에 현재 작업을 식별하고 남은 위치를 읽을 수 있어야 한다고 생각했다.

나는 진행 상태만 메모리에 두는 예시에서 더 들어가 로컬 DB를 다시 열어도 위치가 남는 작은 모듈을 만들었다. 회사 자료를 실제로 이관하는 프로그램은 아니며 합성 진행 메타데이터를 검증한 기록이다.

화면의 막대와 작업의 원본을 분리했다

진행률을 화면 변수에만 두면 창이 닫힌 뒤 그 숫자는 없어질 수 있다. 이번 모델은 회사와 작업 ID, 전체 범위와 현재 cursor를 SQLite에 남긴다. 다른 WorkLab 인스턴스로 같은 합성 DB를 열어도 진행 위치를 읽는다. 화면을 새로 만든 것과 작업을 새로 시작한 것을 구별할 근거가 생긴다.

이 cursor는 회사의 업무 행이 이미 저장됐다는 증거까지 담지는 않는다. 예제는 진행 메타데이터만 처리한다. 실제 이관에서는 업무 행 쓰기와 진행 위치 갱신이 어떤 트랜잭션을 공유해야 하는지 정해야 한다. 숫자가 보관된다는 사실을 자료 전체의 정확한 처리 완료로 확대하지 않고, 재개 상태의 출발점만 구현했다.

재개한 작업자와 이전 작업자를 구분했다

작업을 가져갈 때 generation이라는 세대 번호를 올리고 worker를 남긴다. 실패 뒤 다른 작업자가 새 세대로 가져가면 예전 작업자의 진행 요청은 stale_worker로 거절된다. 같은 작업 ID를 알고 있다는 이유로 모두 진행 위치를 바꿀 수 없게 한 조건이다. 두 작업자가 같은 초기 세대를 동시에 가져가는 검사에서도 하나만 성공한다.

이 번호는 사용자 인증이나 분산 서버의 완성된 임대 시스템이 아니다. 회사와 작업자 값은 신뢰할 테스트 문맥이며 실제 권한 서버는 없다. 실행 중 작업을 일정 시간이 지났다고 자동 회수하는 기능도 구현하지 않았다. heartbeat와 임대 만료가 필요하면 별도 정책과 검증을 추가해야 한다. 지금 확인한 조건은 세대가 바뀐 뒤 오래된 작업자가 쓰지 못하는 경계다.

같은 처리 묶음이 다시 와도 위치는 한 번만 늘린다

진행 요청에는 예상 cursor와 묶음 token, 처리 개수를 넣는다. 같은 token과 같은 내용이면 보관한 결과 위치를 다시 돌려주고 cursor를 또 늘리지 않는다. 같은 token으로 다른 위치나 개수를 보내면 거절한다. 예상 위치가 어긋나거나 전체 범위를 넘겨도 진행하지 않는다. 같은 숫자를 여러 번 받는 일과 실제 범위를 처리한 일을 섞지 않으려는 선택이다.

작업 상태가 done이어도 같은 세대의 이미 끝난 묶음 결과는 다시 읽을 수 있다. 새로운 묶음을 추가해 전체보다 더 처리한 것처럼 만들지는 않는다. 실제 프로그램에서는 묶음 식별자를 어디서 만들고 언제 보관할지 정해야 한다. 화면의 퍼센트를 높이는 기능보다 어느 범위의 결과를 다시 읽고 있는지 설명하는 계약이 먼저다.

실패가 나도 완료 위치를 지우지 않았다

합성 예시는 전체 4개 중 2개까지 진행한 뒤 실패한다. DB를 다시 읽으면 cursor 2가 남아 있고 다음 작업자는 그 위치부터 마지막 2개를 진행한다. 에러 원문 대신 고정 synthetic_failure 코드를 남긴다. 실제 고객 행이나 비밀 값이 섞인 예외를 이력에 그대로 넣는 구현은 피했다. 원인 분석을 위한 운영 로그는 별도로 설계할 수 있다.

다만 이 모듈은 백그라운드 프로세스를 실행하거나 자동 재시작하지 않는다. 재개할 상태를 보관하고 읽는 것과 실제 작업을 깨우는 실행기는 다른 책임이다. 수행 중인지 확인할 근거가 없는 상황을 실행 중 표시만으로 해결해서도 안 된다. 사용자에게 보여 줄 현재 상태는 해당 실행 환경의 신호와 함께 정의해야 한다.

확인한 재개와 앞으로 연결할 재개

테스트는 DB 재개, 두 작업자의 경쟁, 중복 묶음, 다른 내용의 token 재사용, 잘못된 위치와 초과 진행을 확인한다. 실패 뒤 새 세대가 이전 작업자를 차단하고 마지막 상태가 done인지도 대조했다. 기록 뷰어는 실제 로컬 합성 실행 결과를 읽으며 브라우저에서 DB를 돌리는 기능은 아니다. 실제 회사 작업의 성능이나 화면 검수로 보고하지 않는다.

업무에 연결하려면 원본 범위의 고정 방식, 실제 행 저장, 중단·취소 권한, 작업 실행기와 결과 조회를 더 정해야 한다. 이전 이관 제작기의 일반적인 재개 설명과 달리 이번에는 저장된 진행과 세대를 코드로 시험했다. 나는 큰 작업을 처음부터 반복하게 하는 대신 남은 일을 근거로 읽어 볼 수 있는 작은 시작점을 공유한다.