특정 코인들만 시세 제공사에 다른 분류로 내보낼 수 있냐는 문의를 받았다. MarketPayloadBuilder 를 읽으니 coin_category_map 이 분류 단위로만 돼 있어서 불가능하다고 답하려던 참이었다.
Table of contents
Open Table of contents
검증 — 코드가 말하지 않은 것
답을 정리하는 중에 그 용도로 만든 상위 분류가 원래 있지 않았냐는 반문이 들어왔다. categories 트리에 성격이 달라 보이는 SPECIAL 상위 항목이 하나 있긴 했지만 무슨 뜻인지 몰랐다.
매핑을 읽는 코드는 어느 분류든 똑같이 처리하므로 특정 트리가 특별하다는 표시가 코드에 없다. 의도는 코드가 아니라 트리를 그렇게 구성하고 매핑을 그렇게 채운 데이터 쪽에 있었다.
측정 — 분포가 드러낸 전용 통로
두 가지 방법이 있었다. 코드 결론대로 불가능하다고 답하는 것과, 그 트리 하위의 매핑이 어디로 가는지를 GROUP BY target_category 로 세어 보는 것이다. 뒤쪽을 골랐다. 이유는 반문한 사람이 그 트리를 만든 시기에 있던 사람이어서다. 대신 답변이 하루 늦어지는 것을 감수했다.
하위 쉰여덟 건이 전부 DEFI 한 곳으로 가고 다른 곳으로 가는 것은 하나도 없었다. 이런 분포는 우연으로 생기지 않는다. 그 트리는 특정 분류로 내보내기 위해 만들어진 전용 통로였다.
살아 있는 구조인지 확인
옛날에 만들었다가 안 쓰는 것일 수도 있어서 실제 연결을 세어 봤다. 그 하위 분류에 markets 수십 개가 걸려 있었고 시세 전송 로그에 지금도 DEFI 로 나가고 있었다.
죽은 구조가 아니라 살아 있는 경로였고 내가 몰랐을 뿐이었다. 코드만 읽고 답했으면 있는 길을 없다고 답할 뻔했다.
판단 기준 — 답이 뒤집힌 지점
문의한 코인들은 다른 상위 분류 아래 있어서 기본 경로로 나가고 있었다. SPECIAL 하위로 옮기면 원하는 곳으로 가므로 코드 수정이 필요 없었다.
불가능하다는 답이 category_id 만 옮기면 된다는 답으로 바뀌었다. 이후로 불가능하다고 결론 내기 전에 그 축의 데이터 분포를 한 번 보게 됐는데 한쪽으로 극단적으로 몰린 분포는 의도가 있다는 신호다.
주의 — 길이 있다와 열려 있다는 다르다
옮기는 것이 답이라고 확정한 뒤에도 확인이 남아 있었다. 쉰여덟 건 중 대부분이 use_yn = 'N' 이었고 살아 있는 매핑은 열몇 건뿐이었다.
옮기려는 코인의 세부 분류가 활성 매핑에 걸리는지를 따로 봐야 했다. 비활성 쪽으로 옮기면 길은 있지만 아무 데도 가지 않는다.
정리
- 코드만 읽으면
coin_category_map같은 데이터 구조의 의도가 안 보인다 - 코드는 모든 데이터를 똑같이 처리하므로 특별함이 안 적힌다
- 불가능하다고 결론 내기 전에 데이터 분포를 본다
- 한쪽으로 극단적으로 몰린 분포는 의도가 있다는 신호다
- 죽은 구조인지 살아 있는지는 연결 건수로 확인한다
- 이미 있는 길을 찾으면
category_id만 옮기고 코드 수정이 필요 없다 - 반문 하나가 조사 방향을 바꾸므로 아는 쪽에 물어본다
- 길이 있다는 것과
use_yn으로 지금 열려 있다는 것은 다르다