계정 비활성화로 대량 해제 작업이 발생해서 복원 대상을 SELECT 로 골라내야 했다. 어느 상태를 기준으로 분류할지가 문제였고 후보가 마스터 쪽과 채널 쪽 둘이었다.
Table of contents
Open Table of contents
비교 — 두 상태 컬럼의 분포
한 채널의 774건에 대해 두 상태를 각각 GROUP BY 해 COUNT(*) 를 내 봤다.
마스터 상태 채널 상태
정상 약 391 정상 약 43
중지 약 383 중지 약 731
어느 쪽을 기준으로 삼을지는 그 분포를 본 다음에 정할 일이었다.
마스터는 절반씩인데 채널은 압도적으로 중지였다. 같은 상품 집합인데 어느 쪽을 쓰느냐에 따라 대상이 열 배 넘게 달라진다는 뜻이고, 두 값이 다른 것을 뜻하고 있다는 신호였다.
옛 경로와 마스터의 보존
왜 갈리는지를 보려고 grep 으로 해제 코드를 찾았다.
private function distributionProductDisconnect($dp)
{
$dp->approve_type = 40;
$dp->save();
// 마스터는 안 건드림
}
옛 경로는 approve_type 만 40으로 바꿔 저장하고 마스터는 전혀 안 건드렸다.
approve_type 만 움직이므로 마스터에는 판매자가 원래 어떤 상태를 원했는지가 그대로 남아 있게 된다. 해제 작업이 지나간 뒤에도 그 값이 안 바뀌었으므로 의도가 보존된 셈이었다.
채널 상태는 작업의 결과다
approve_type 은 그 반대로 우리가 돌린 작업의 결과를 그대로 담고 있었다. 판매자가 무엇을 원했는지가 아니라 무슨 일이 있었는지를 기록하는 자리였다.
그러니 두 값이 다른 것은 어느 한쪽이 틀렸기 때문이 아니라 애초에 서로 다른 것을 담기 때문이었다. 하나를 다른 하나로 맞추려 드는 것 자체가 잘못된 접근이었다.
의도와 노출의 분리
용도를 갈라 보면 마스터는 의도를 묻는 질문에 답하고 채널은 지금 노출되고 있는지에 답한다. 무엇을 복원할지는 의도의 문제이므로 대상을 고르는 WHERE 는 마스터 컬럼을 봐야 했다.
반대로 지금 어디에 걸려 있는지를 알아야 하는 작업에서는 채널 값이 맞다. 같은 자료를 두고도 물어보는 것이 다르면 봐야 할 컬럼이 달라진다는 것이 이 구분의 요지였다.
혼동하면 정반대로 나간다
기준을 잘못 잡으면 작업이 조금 어긋나는 것이 아니라 정반대 방향으로 나간다. 판매자가 내려 둔 것을 복원하고 올려 두려던 것을 그대로 두게 되기 때문이다.
건수가 많아서 그 방향이 뒤집히면 되돌리는 비용도 그만큼 커진다. 분포가 정반대라는 것은 잘못 골랐을 때의 결과도 정반대라는 뜻이었다.
경로에 따른 성립 조건
다만 이 구분은 해제가 옛 경로로 처리됐을 때만 성립한다. 마스터까지 함께 UPDATE 하는 새 경로로 처리된 건은 의도가 이미 덮여 있으므로 마스터를 봐도 알 수 없다.
그래서 규칙으로 적을 때 어느 경로로 처리된 건인지를 WHERE 조건으로 함께 적었다. 조건을 빼고 결론만 남기면 다음에 다른 경로에서 그대로 적용해 틀리게 된다.
정리
- 상태 컬럼이 둘이면 각각
GROUP BY해COUNT(*)를 낸다 - 분포가 정반대면 둘이 다른 것을 뜻한다
- 옛 경로가 마스터를 안 건드리면 마스터에 의도가 남는다
- 채널 상태는 작업의 결과지 의도가 아니다
- 의도는 마스터에서 노출은 채널에서 본다
- 혼동하면 작업이 정반대 방향으로 나간다
- 이 구분은 어느 경로로 처리됐느냐에 따라 성립한다
- 규칙에 결론만 남기고 조건을 빼지 않는다