가송장 패널티에 이의를 제기해야 하는 건이 있어서 그 전에 재출고가 정말 안 됐는지를 다시 확인했다. 이 건은 앞서 세 번 확인했고 세 번 다 입점사가 재발송 송장을 등록하지 않았다는 결론이었다.
Table of contents
Open Table of contents
세 번 같은 결론을 낸 조사
세 번의 근거는 모두 이력 로그였고 거기에 출고 생성 항목이 두 개 찍혀 있었다. 그런데 출고 테이블에는 레코드가 하나뿐이라 생성 로그는 있는데 실제로는 안 만들어졌다고 읽었다.
그 독해가 거꾸로였다. 레코드가 하나라는 사실이 실패의 증거가 아니라 다른 방식으로 처리됐다는 증거였다.
이력의 생성이라는 문구
출고 테이블을 제대로 열어 보니 생성 시각은 원본 출고 시점이고 갱신 시각은 재출고 시점이었으며 송장은 재발송 번호였다. 새 레코드를 만든 것이 아니라 기존 레코드에 항목을 더하고 송장을 덮어쓴 것이었다.
이력 로그의 문구는 코드가 남긴 문자열이므로 그 코드 경로가 생성과 갱신을 함께 처리하면 로그로는 둘이 구분되지 않는다. 문구를 근거로 삼는 순간 정반대 결론이 나올 수 있었다.
덮어쓰기를 판별하는 세 지문
이 패턴을 알아보는 지문을 셋으로 정리했다. 해당 주문의 출고가 한 건뿐이고 생성 시각은 그대로인데 갱신 시각만 이동했으며 송장이 원본이 아니라 재발송 번호인 경우다.
셋이 모두 맞으면 덮어쓰기로 처리된 것이다. 이 판정이 외부에 나가는 소명의 방향을 정하는 자리였으므로 틀린 채로 나갔으면 우리가 잘못 소명한 것이 됐다.
앞의 결론이 전제가 될 때
같은 결론을 세 번 냈는데도 안 잡힌 이유는 첫 조사의 결론이 다음 조사의 전제가 됐기 때문이다. 두 번째와 세 번째는 정말 그런지를 다시 본 것이 아니라 그 결론을 뒷받침할 근거를 더 찾았다.
같은 방향으로 세 번 본 것이지 세 번 검증한 것이 아니었다. 이번에 뒤집힌 것은 안 된 것이 맞느냐가 아니라 테이블에는 무엇이 있느냐로 물음을 바꿨기 때문이다.
시간 컬럼을 덮어쓸 때의 파급
이 덮어쓰기가 다른 문제도 만들고 있었는데 생성 시각이 원본 출고 시점으로 남는다는 점이었다. 가송장 탐지가 생성 시각을 기준으로 돌면 재발송한 건이 오래전에 출고됐는데 아직 배송이 안 된 것으로 보인다.
그러면 재발송 직후부터 계속 오탐하게 되고 이 건의 패널티 자체가 그렇게 생겼을 가능성이 있다. 한 곳의 덮어쓰기가 다른 곳의 탐지를 망가뜨리므로 시간 컬럼을 덮어쓸 때는 그것을 읽는 곳을 함께 봐야 한다.
정리
- 이력의 생성이라는 문구가 실제 생성을 뜻하지 않을 수 있다
- 한 코드 경로가 생성과 갱신을 함께 처리하면 로그로 구분되지 않는다
- 판별 지문은 건수와 두 시각의 차이와 송장 번호 셋이다
- 이력만 보고 판정하면 정반대 결론에 이를 수 있다
- 같은 결론을 여러 번 내는 것이 여러 번 검증한 것은 아니다
- 앞의 결론이 다음 조사의 전제가 되면 방향이 고정된다
- 뒤집으려면 물음 자체를 바꾼다
- 시간 컬럼을 덮어쓰면 그것을 읽는 탐지가 오탐한다