문서가 저장된 뒤 알림에 실패했다고 처음부터 다시 저장해야 할까. 첨부 업로드가 준비됐는데 글 발행이 거절된 경우에는 무엇이 남아 있을까.

나는 작업 전체를 성공과 실패 한 칸으로 묶지 않고 각 결과를 나누어 읽기로 했다. 이번 로컬 실험은 알림 대기와 합성 전달 실패를 구현했고, 사이트의 실제 패키지 교체 기록도 별도로 대조했다.

먼저 무엇이 확정됐는지 나눠 적었다

문서 저장, 파일의 업로드 완료, 문서와 파일의 연결, 알림 예약과 전달은 서로 다른 사실이다. 한 화면에서 연달아 일어나도 같은 저장소의 한 트랜잭션은 아닐 수 있다. 이 중 어느 결과가 남았는지 모르고 처음 버튼부터 반복하면 이미 저장한 문서나 파일을 중복해서 만들 수 있다. 나는 다시 해야 할 일을 확정된 결과의 바깥에서 찾는다.

현재 SQLite 코드는 문서와 사건, 후속 대기 기록을 함께 확정한다. 실제 첨부 서버는 구현하지 않았다. 실제 사이트의 미디어 업로드와 원고 발행도 각각의 상태를 가진 별도 기능이다. 두 사례를 같은 시스템이라고 합치지 않고, 공통으로 묻는 질문인 어느 단계가 남았는가를 설명하는 재료로 사용했다.

저장 전 오류라면 함께 되돌린다

모듈의 fail_before_commit은 문서·사건·대기 기록·요청 결과를 작성한 뒤 아직 확정하기 전에 오류를 만든다. 이 경우에는 전체 쓰기가 되돌아가고 최초 문서가 남는다. 테스트는 문서 버전뿐 아니라 나머지 테이블에 부분 기록이 없는지 확인한다. 저장됐다는 답을 내기 전에 어떤 기록이 함께 있어야 하는지 정한 것이다.

이 검사는 외부 파일이나 메일 서버의 작업을 되돌리는 구현이 아니다. 다른 저장소의 동작을 같은 실패 플래그 하나로 해결했다고 설명할 수는 없다. 로컬 원자성의 확인은 중요한 한 조각이지만 후속 서비스의 재개·보관·정리 정책은 별도로 필요하다. 실제 기능을 만들 때 어느 단계까지 같은 경계인지 먼저 정해야 한다.

저장 후 전달 실패는 문서를 다시 고치는 이유가 아니다

문서와 알림 대기 행이 이미 확정된 뒤 합성 전달을 failed로 남기는 경우도 시험했다. 이후 전달 결과만 갱신해도 문서 사건 수는 늘지 않는다. 알림을 다시 처리하는 행동이 주문 수량을 다시 저장하는 행동으로 번지지 않도록 나눈 것이다. 이 작은 분리만으로도 어느 단계에서 복구할지 설명하기 쉬워진다.

그렇다고 모든 실패 알림을 무조건 다시 보내지는 않는다. 실패가 확정인지 전달 여부를 모르는지 구별해야 한다. 예제의 unknown은 자동으로 진행하지 않는다. 실제 시스템의 재시도 횟수, 지연, 상대 결과 조회와 담당자 확인은 구현하지 않았다. 이번 검증은 합성 전달 상태와 로컬 업무 기록의 분리가 유지되는지까지다.

실제 사이트에 남았던 미참조 파일

앞선 권한 모듈 발행에서는 코드 속성 표기가 외부 주소로 오인되어 원고 저장이 거절됐다. 패키지 업로드는 이미 끝난 상태였다. 나는 공개 검사를 풀지 않고 코드 명칭을 고쳐 새 패키지를 검토했으며 이전 미참조 패키지는 검토를 해제했다. 실제 원고에는 새 파일만 연결되고 이전 파일의 공개 접근이 404인지 확인했다.

이것은 문서 저장 성공 뒤 첨부 실패와는 순서가 다른 부분 완료 사례다. 그래서 동일한 장애를 재현했다고 말하지 않는다. 업로드 완료와 게시글 참조, 공개 가능 여부를 각각 확인해야 한다는 실제 근거다. 미참조 파일을 급히 삭제하지 않고 보관한 결정도 후속 이력과 백업의 범위를 생각한 것이며, 이 글에서 회사 파일을 공개하거나 실제 자료를 삭제하지 않는다.

운영 화면에는 남은 일을 보여 준다

대표나 직원에게 전체 실패만 표시하면 이미 끝난 일을 다시 하게 할 수 있다. 저장됨, 첨부 연결 확인, 알림 미전달처럼 현재 근거에 맞는 표현과 다음 행동이 필요하다. 다만 원인과 상태를 모르는 단계에 성공 표시를 만들어서는 안 된다. 같은 업무라도 어떤 결과를 확인한 것인지 문구 가까이 설명하면 운영자가 판단을 이어갈 수 있다.

공유 코드는 문서 저장과 전달 상태를 분리한 테스트를 제공하며, 실제 사이트 사례는 비공개 근거에 보존하고 합성 자료로만 설명한다. 외부 발송이나 회사 ERP의 복구는 수행하지 않았다. 나는 모든 일을 한 번에 다시 시작하는 자동화보다 끝난 것과 남은 것을 정확히 나누는 프로그램이 운영에 더 도움이 되는 지점을 공개하고 싶었다.