저장 화면에 오류가 보이면 사용자는 다시 누른다. 하지만 서버가 이미 저장한 뒤 응답만 사라졌다면 두 번째 요청은 처음 요청과 다른 의미를 갖는다.
나는 실제 네트워크 장애를 일으키는 대신 합성 요청의 확정 결과를 사용하지 않고 DB를 다시 열어 같은 의도를 확인했다. 어디까지 검증했는지 밝히면서 응답을 잃은 업무를 다루는 판단을 풀어 본다.
응답을 못 받은 것은 처리되지 않았다는 증거가 아니다
입력 검증에서 거절된 요청은 문서를 바꾸지 않았다. 저장 도중 트랜잭션이 되돌아간 경우도 완료되지 않았다. 반면 저장은 확정됐지만 화면이 결과를 받지 못한 경우는 다르다. 나는 이런 상황을 모두 실패로 합쳐 새 요청을 만들지 않기로 했다. 먼저 같은 의도의 결과를 찾을 수 있어야 한다고 판단했다.
이번 로컬 실험에서는 성공한 명령의 반환값을 다음 판단에 사용하지 않고 같은 DB를 새 WorkflowLab으로 열었다. 같은 회사·사용자·요청 키와 같은 명령을 보내면 이전 확정 결과가 돌아온다. 이것은 네트워크 단절 자체를 검수한 실험이 아니라 결과가 보관되고 재개 뒤 재사용되는지 확인한 검사다. 그 차이를 남겨야 실제 장애 대책의 범위를 오해하지 않는다.
원래 의도를 바꾸지 않고 다시 확인한다
응답이 없다고 수량이나 예상 버전을 새로 바꿔 같은 요청 키를 보내면 다른 의도가 섞인다. 패키지는 같은 키의 명령 지문이 다르면 거절한다. 원래 요청의 내용을 다시 구성하는 책임도 클라이언트에 있다. 변경한 내용은 새 요청이고, 이전 의도의 결과 확인은 원래 내용과 같은 요청이라는 계약을 구분했다.
재응답에 들어 있는 문서 값은 그 요청이 확정된 당시의 모습이다. 이후 누군가 수정했다면 최신 문서와 다를 수 있다. 따라서 결과를 찾았다는 이유로 현재 화면의 입력을 그 값으로 무조건 덮어써서는 안 된다. 요청 완료 확인과 최신 상태 읽기, 사용자의 아직 저장하지 않은 초안을 별도의 값으로 다뤄야 한다.
이미 확정된 기록을 우선 읽는 이유
처음 명령이 버전 0을 고쳐 버전 1을 만들었다면 재요청의 예상 버전 0은 오래된 값이다. 그런데 같은 의도의 확정 결과를 찾기 전에 버전 충돌부터 돌려주면 사용자는 첫 요청이 성공했는지 이해하기 어렵다. 이번 코드는 신원·회사·자료 접근을 확인한 뒤 같은 요청의 확정 결과를 먼저 찾는다. 새 변경을 만들 때만 현재 버전과 비교한다.
이는 오래된 화면의 모든 요청을 허용한다는 뜻이 아니다. 다른 요청 키나 다른 내용은 새 의도이며 현재 상태와 버전 검사를 통과해야 한다. 같은 회사의 다른 사용자에게도 이전 결과를 키만으로 넘기지 않는다. 재응답은 권한을 생략하는 우회로가 아니라 같은 주체의 같은 의도를 확인하는 좁은 길이어야 한다.
조회 경로와 재시도 정책은 별도로 설계한다
이번 실험은 같은 명령의 안전한 재응답을 구현했고 독립된 요청 조회 API는 만들지 않았다. 실제 서비스에서는 요청 식별자로 현재 결과를 읽는 전용 경로가 도움이 될 수 있다. 처리 중·완료·확정 실패·확인 불가를 무엇으로 판단하는지 저장소와 외부 제공자의 계약에 맞춰 정해야 한다. 없는 상태를 화면 문구만으로 만들어서는 안 된다.
외부 발송은 특히 더 조심스럽다. 상대 시스템이 받았는지 모르는 상황에서 다시 보내면 같은 문서가 두 번 전달될 수 있다. 이번 모듈의 전달 결과 unknown은 자동 재시도하지 않는다. 실제 상대 결과를 조회하거나 담당자가 확인하는 연결은 아직 없다. 로컬 요청 결과를 찾았다는 사실을 모든 외부 실행의 완료로 확대하지 않았다.
사용자에게 남길 설명과 검증 근거
저장 여부를 확인 중이라면 입력을 지우고 처음 화면으로 보내는 것보다 현재 초안을 유지하며 확인할 경로를 보여 주는 편이 낫다. 새로 저장하기와 이전 결과 확인하기가 같은 버튼이어야 하는지도 질문할 수 있다. 현재 코드의 책임은 DB에 남은 확정 결과와 문서 변화가 일치하는지까지이며 실제 화면의 표현은 별도로 검수해야 한다.
테스트는 DB를 다시 연 뒤 같은 사건 번호가 돌아오는지, 추가 변경이 생기지 않는지 확인한다. 다른 내용의 키 재사용과 확정 전 오류도 별도 검사다. 실제 회사 기록과 외부 통신은 사용하지 않았다. 나는 재시도를 무조건 많이 하는 방법보다 어떤 사실을 다시 읽어야 안전하게 다음 판단을 할 수 있는지 공유하고 싶었다.