정산 마감 파일을 처리하는 도구에 새 채널을 추가해야 해서 기존 분류에 넣고 돌렸더니 오류가 났다.
Table of contents
Open Table of contents
증상 — 조회가 아예 안 됐다
기존 분류 집합에 새 채널 하나를 더했다.
PACK_ONLY_CHANNELS = {..., '<새 채널>'}
PACK_ONLY_CHANNELS 에 넣었더니 이 응답이 돌아왔다.
주문 옵션을 찾을 수 없습니다
값이 틀린 것이 아니라 JOIN 자체가 아예 안 걸리는 모양이었다.
검증 — 값을 대조했다
마감 파일의 번호와 DB 에 든 값을 나란히 놓고 봤다.
파일의 주문번호 2150867373
DB 의 묶음 번호 컬럼 312825116
DB 의 주문 번호 컬럼 2150867373
파일의 2150867373 이 주문 번호 컬럼과 일치하고 묶음 번호 컬럼에는 전혀 다른 값이 있었다.
이 채널을 PACK_ONLY_CHANNELS 에 넣었으니 묶음 번호로 조회한다. 파일에 없는 312825116 으로 찾고 있었으니 결과가 나올 리가 없었다.
원인 — 컬럼에 든 자체 ID
묶음 번호 컬럼에 든 312825116 이 무슨 값인지 따로 봤다.
그것은 그 채널의 자체 ID 였는데 우리가 부여한 번호가 아니라 그쪽 시스템의 내부 번호라서 파일에는 나오지도 않는다.
linkage_mall_pack_order_id 라는 이름이 내용을 보장하지 않는다는 것이 여기서 드러났다.
linkage_mall_pack_order_id
linkage_mall_pack_order_id 는 연동 마켓 묶음 주문 번호라는 뜻인데 채널에 따라 다른 것이 들어 있었다.
처음에는 다 같은 의미였겠지만 채널이 늘면서 의미가 갈렸고 그때마다 컬럼을 나눌 수 없으니 그냥 넣은 결과 공통 컬럼이 다형적이 됐다.
판단 기준 — 패턴이 셋
기존 채널들의 분류를 다시 정리해 보니 셋으로 갈렸다.
① 묶음 번호만 파일의 번호 = DB 의 묶음 번호 컬럼
② 주문 번호만 파일의 번호 = 상품 주문 번호 = DB 의 주문 번호 컬럼
③ 일반 묶음 번호 + 주문 번호 쌍으로 매핑
새 채널은 ② 주문 번호만 이었고 그 계열은 번호 하나가 옵션 하나를 가리키는 1:1이다.
1:1 매핑이라 그 뒤의 계산 쪽은 그대로 쓸 수 있었다. 번호별로 묶어 점유 비율을 내는 부분은 일반 채널과 같고 조회 방법만 다른 것이다.
조치 — 고칠 데가 넷
분류를 정하고 나니 실제로 고쳐야 할 자리가 넷이었다.
① 집합에 추가
② 분류 분기
③ 전용 조회 구조
④ 전용 DB 쿼리
처음에 내가 한 것은 PACK_ONLY_CHANNELS 에 넣은 것뿐이었다.
집합에만 넣으면 분기가 여전히 옛 경로를 타고 내려간다. 넷 중 하나라도 빠지면 어딘가에서 조용히 안 되는 상태가 된다.
재발 방지 — 신규 채널 절차
이 뒤로 신규 채널을 붙일 때의 절차를 적어 두었다.
1. 그 채널의 실제 데이터를 하나 뽑는다
2. 파일의 번호와 DB 의 컬럼들을 나란히 놓는다
3. 어느 컬럼과 일치하는지 본다
값 대조 하나면 ① ② ③ 중 무엇인지가 그 자리에서 정해진다.
패턴이 정해지면 넷을 다 고치고 계산 쪽은 건드리지 않는다. 새 채널을 붙이는 비용이 패턴을 정하는 것과 네 자리를 고치는 것으로 끝났다.
정리
- 파일과
DB의 매핑 패턴이 채널마다 다르다 - 묶음 번호만 쓰는 것과 주문 번호만 쓰는 것과 둘의 쌍으로 갈린다
- 잘못 분류하면 오류 없이 조회가 아예 안 된다
- 컬럼 이름이 그 내용을 보장하지 않는다
- 같은 컬럼에 채널마다 다른 성격의 값이 들어간다
- 신규 채널은 실제 데이터를 대조해 패턴을 먼저 정한다
- 분류를 정하면 집합과 분기와 조회 구조와 쿼리 넷을 다 고친다
- 1:1 매핑이면 계산 로직은 재사용된다