프로그램을 처음 만들 때는 버튼이 작동하는지가 가장 큰 질문이었다. 실제로 사용하기 시작하니 업데이트 뒤에도 쓰던 탭과 미전송 문장, 로그인과 프로젝트가 남는지가 더 큰 문제가 됐다. 새 기능의 완료 조건에 기존 작업의 보존을 함께 넣었다.
설치기가 끝났다고 업무가 돌아온 것은 아니다
설치가 오류 없이 끝나고 새 버전 번호가 보여도 사용자의 업무가 돌아왔는지는 따로 봐야 한다. 탭 ID와 주소, 선택 프로젝트, 초안, 설정 같은 값은 설치 파일의 버전 문자열에 들어 있지 않다. 프로그램 파일 확인만으로 사용자 상태까지 보존됐다고 말할 수 없다.
이전 비교 기록에는 검증한 app.asar와 설치판 해시를 맞추는 단계와 업무공간·작업·설정·탭을 대조하는 단계가 따로 있다. 파일의 동일성과 작업의 연속성은 별개의 질문이었다. 둘을 나누자 설치 완료 보고에 무엇이 빠져 있는지 드러났다.
오래된 백업이 최신 작업을 덮을 수 있었다
검증을 시작할 때 상태를 저장했다고 그 파일이 항상 복구의 정답이 되는 것은 아니다. 시험 중 사용자가 탭을 바꾸고 대화를 더 쓸 수 있다. 실제 기록에서도 초기 상태보다 나중에 바뀐 탭과 메시지를 보존했고 초기 스냅샷으로 되돌리지 않았다.
이것은 백업을 하지 말자는 뜻이 아니다. 백업은 비교 시점의 근거이고 복원은 현재 상태를 바꾸는 행동이다. 복원이 필요한지와 어느 시점으로 돌아갈지를 구별해야 한다. 나는 보존 확인을 예전 숫자와 무조건 같게 만드는 작업으로 다루지 않게 됐다.
같은 주소로 이동하는 일도 조심했다
기존 탭을 찾았는데도 같은 주소를 다시 불러오면 미전송 입력과 페이지 안 상태가 사라질 수 있다. 기존 탭 재사용 규칙은 같은 URL을 채택할 때 불필요한 새로고침을 하지 않는다. 다른 검색어처럼 실제 탐색이 필요한 경우와 구별한다.
명시한 기존 탭이 닫혔거나 다른 프로젝트에 있으면 비슷한 탭으로 몰래 바꾸지 않는다. 새 탭을 만들지 않는다는 말은 현재 원고를 아무 데나 재사용해도 된다는 뜻이 아니었다. 사용자에게 보이지 않는 편의를 위해 작업 대상을 바꾸지 않는 것이 보존 규칙의 일부가 됐다.
사용자 상태와 실행 중 참조의 수명은 다르다
탭을 복원해도 이전 페이지의 요소 참조까지 계속 유효한 것은 아니다. 재시작은 새 WebContents와 문서를 만들고 관찰도 다시 해야 한다. 주소와 작업 기록을 보존하는 것과 클릭에 쓰던 참조를 재사용하는 것은 다른 문제다.
기존 비교 보고서도 복원된 탭의 주소와 네이티브 뒤로가기 이력을 구별한다. 재시작 뒤 뒤로가기 이력은 초기화될 수 있다. 복원이라는 한 단어가 모든 내부 상태의 완벽한 재현을 뜻하지 않게 공개 설명에도 한계를 적는다. 보존한 항목과 다시 관찰할 항목을 구체적으로 남기는 편이 정확하다.
새 기능 시험과 보존 시험을 함께 남겼다
기존 탭을 이용한 실제 생성·다운로드 기록에서는 기능 결과와 별도로 탭 ID 집합을 전후 대조했다. 다운로드 재실행은 같은 해시를 확인했지만 생성 전체를 다시 하지 않았다. 보존하려는 작업을 검증 때문에 불필요하게 반복하지 않는 판단도 들어 있다.
이 기록을 모든 계정과 모든 업데이트의 보장으로 쓰지는 않는다. 확인한 버전과 당시 탭·프로젝트 범위의 근거다. 새 기능의 성공 화면만 남기면 기존 작업이 바뀌었는지 설명하기 어렵다. 전후의 상태와 재실행한 범위를 같이 남겨야 다음 변경의 기준으로 쓸 수 있다.
업무 프로그램의 완성도는 다음 사용에서 보인다
고객에게 필요한 것은 새 기능 목록만이 아니다. 어제 입력하던 자료를 오늘도 이어 쓰고, 업데이트 때문에 다시 로그인하거나 원고를 복구하는 시간을 줄이는 것이다. 나는 개선한 기능과 보존한 작업을 함께 설명해야 프로그램의 실제 가치를 전달할 수 있다고 본다.
이 글을 위해 운영 중 앱을 재설치하거나 사용자의 창을 닫지는 않았다. 기존 설치·보존 기록과 현재 재사용 계약을 읽어 제작 판단을 정리했다. 앞으로의 변경도 설치 파일 검증과 사용자 상태 검증을 따로 남겨, 새 기능이 기존 일을 밀어내지 않았는지 확인하는 방식으로 이어 가려 한다.