옵션과 관련된 오류가 두 종류로 나오고 있었다. 코드와 이름이 안 맞는다는 것과 코드를 못 찾는다는 것이었는데 둘 다 우리가 보낸 코드에 대한 지적이었다.
Table of contents
Open Table of contents
증상 — 두 종류의 오류
우리가 보내는 코드가 어떻게 만들어지는지를 먼저 봤다. grep 으로 코드를 만드는 함수를 따라가니 입력으로 쓰는 값이 상황에 따라 달라지고 있었다.
전용 컬럼이 NULL 이 아니면 그것을 쓰고 비었으면 다른 컬럼을 대신 쓰는 구조였다. 즉 같은 상품에서도 코드가 두 갈래로 만들어질 수 있었다.
코드가 만들어지는 두 갈래
그러면 저쪽에 등록된 코드가 어느 갈래로 만들어진 것인지를 알아야 지금 보내는 것이 맞는지 판단할 수 있다. 등록 당시와 지금의 입력이 다르면 코드가 달라진다.
문제는 그 코드가 단방향 변환을 거친 값이라 원래 입력이 무엇이었는지를 값만 보고는 알 수 없다는 점이었다. 두 갈래의 결과가 비슷하게라도 생겼으면 짐작이라도 하겠는데 전혀 다른 문자열이었다.
눈으로는 대조가 안 된다
이 변환은 입력이 한 글자만 달라도 출력이 통째로 달라지므로 눈으로 비교하는 것이 의미가 없다. 그래서 두 갈래의 입력을 각각 넣어서 코드를 직접 계산해 봤다.
계산한 두 값을 저쪽에 등록된 값과 대조하니 그중 하나와 일치했다. 그것으로 이 상품이 어느 갈래로 등록됐는지가 확정됐다.
복구가 곧 코드 변경
여기서 이어지는 문제가 하나 있었는데 전용 필드가 비어 있던 것을 채워 넣으면 코드가 다른 갈래로 바뀐다는 점이었다. 값을 복구하는 것이 곧 전송 코드를 바꾸는 일이 된다.
그러면 저쪽에 등록된 코드와 우리가 보내는 코드가 갈라져서 새로운 오류가 난다. 복구 작업을 하기 전에 어느 쪽으로 등록됐는지를 확인하고 그에 맞춰 순서를 정해야 했다.
대화형 셸에서의 확인
이 확인은 코드를 고쳐서 로그를 찍는 방식으로 하지 않고 php -a 로 실제 값을 넣어 돌렸다. 배포 없이 바로 답이 나오고 값을 바꿔 가며 여러 번 볼 수 있다.
계산이 필요했던 이유는 결국 그 값에서 입력을 되짚을 수 없기 때문이었다. 되짚을 수 없으면 앞에서부터 만들어 보고 맞춰 보는 것 말고는 방법이 없다.
정리
- 전송 코드가 두 갈래로 생성될 수 있다
- 전용 컬럼이
NULL이면 다른 컬럼을 쓰는 구조인지 확인한다 - 단방향 변환은 입력이 한 글자만 달라도 출력이 통째로 다르다
- 눈으로는 대조가 안 되므로 계산해야 한다
- 두 갈래 값을 둘 다 계산해 저쪽 값과 대조한다
- 전용 필드 복구가 곧 전송 코드 변경이다
- 어느 쪽으로 등록됐는지 먼저 확인하고 복구를 정한다
- 이런 확인은
php -a에서 실제 값으로 돌린다