제 SNS 대시보드가 쓰레드 계정의 조회수를 0으로 찍고 있었습니다. 좋아요 1,200, 답글 393은 멀쩡히 나오는데 조회만 0이었습니다.
질문 하나 드리겠습니다. 당신의 대시보드가 0을 보여줄 때, 그게 "값이 0"인지 "값을 못 읽은 것"인지 구분할 수 있습니까? 저는 못 했습니다. 숫자 하나만 보고 있었으니까요.
토큰도 API도 멀쩡했습니다
먼저 의심한 건 토큰이었습니다. 같은 날 다른 봇의 토큰이 실제로 만료돼 있었거든요(OAuth 앱을 테스트 모드로 두면 리프레시 토큰이 7일마다 죽는 편). 그래서 토큰부터 확인했는데, 계정 인사이트도 게시물 목록도 200으로 잘 내려왔습니다.
게시물 하나를 집어 인사이트를 직접 때려봤습니다.
GET /v1.0/18455112349140435/insights?metric=views,likes,replies
200 {"data":[]}에러가 아닙니다. 성공했는데 내용이 비어 있습니다. 그리고 최근 25건이 전부 이랬습니다. 0을 25번 더하면 0입니다.
앱 화면과 API 목록이 달랐습니다
빈 응답을 주는 항목들의 공통점은 media_type 이었습니다.
Counter({'REPOST_FACADE': 95, 'TEXT_POST': 5}) # 최근 100건REPOST_FACADE는 제가 남의 글을 리포스트했을 때 생기는 껍데기 객체입니다. 제 글이 아니니 조회수 같은 지표가 있을 리 없고, API는 그걸 빈 배열로 알려줍니다.
이상한 건 제 프로필이었습니다. 앱으로 열어보면 리포스트는 하나도 안 보이고 제 글만 깔끔하게 나옵니다. 실제로 확인해보니 프로필은 탭이 넷으로 갈려 있었습니다 — Threads / Replies / Media / Reposts. 리포스트는 네 번째 탭에만 쌓입니다.
즉 이렇습니다. 앱은 탭으로 걸러서 보여주고, API는 한 목록에 섞어서 줍니다. 저는 API를 그대로 합산하는 코드를 짜놓고, 검증은 앱 화면을 눈으로 보며 했습니다. 두 화면이 다르다는 걸 몰랐으니 코드가 틀렸다는 신호를 받을 방법이 없었습니다.
날짜별로 세어보니 껍데기가 이렇게 늘고 있었습니다.
| 날짜 | 리포스트 껍데기 | 내 글 |
|---|---|---|
| 08-07 | 14 | 5 |
| 08-08 | 71 | 3 |
| 08-09 | 300 | 6 |
| 08-10 | 83 | 4 |
하루 300건이 쌓이면 "최근 25건"은 100% 껍데기가 됩니다. 지표가 서서히 나빠진 게 아니라, 어느 날 갑자기 0으로 떨어진 이유가 이것이었습니다.
당신이라면 어디를 고치겠습니까
여기서 갈림길이 있었습니다. 리포스트를 줄여서 목록을 되돌리겠습니까, 아니면 목록을 읽는 쪽을 고치겠습니까?
저는 두 번째를 골랐습니다. 리포스트는 계정 운영 방식의 문제지 지표의 문제가 아니고, 무엇보다 읽는 쪽이 틀린 걸 운영 습관으로 덮는 건 다음에 또 터집니다. 수정은 두 줄기였습니다.
media_type != REPOST_FACADE필터.- 커서 페이징. 한 페이지(100건)만 보면 껍데기가 계속 쌓이는 지금 속도로는 곧 다시 0에 수렴합니다. 내 글 25편이 채워질 때까지 최대 5페이지를 넘깁니다.
필터만 넣고 끝냈다면 이번 주는 맞고 다음 주에 또 0이 됐을 겁니다. 값싼 수정이 있는 척하는 지점이 정확히 거기였습니다.
고치고 나니 더 아픈 숫자가 나왔습니다
복구된 값입니다. 최근 내 글 25편(08-06~08-10) 합계 5,051, 중앙값 158, 최대 1,012.
그런데 같은 화면에 계정 지표도 같이 찍힙니다. 148,448. 29배 차이입니다. 이 큰 값은 남의 글에 단 답글 노출까지 전부 포함한 숫자입니다. 예전에 조회 5.3만인데 터진 글이 하나도 없던 편에서 한 번 데인 적이 있어서, 대시보드는 지금 내 조회 / 계정 조회를 나란히 찍습니다.
여기서 1원칙 질문을 한 번 더 걸었습니다. 이 중 진짜 의미 있는 숫자 하나는 뭔가? 조회도 아닙니다. 링크 클릭입니다. 그래서 25편을 링크 유무로 갈라봤습니다.
- 링크가 있는 글: 5편 / 25편
- 그 5편의 조회 합: 674 (전체의 13%)
- 도달 상위 3편(1,012 · 448 · 310): 전부 링크 없음
도달을 만드는 글과 목적지를 가진 글이 서로 다른 집합이었습니다. 깔때기를 만들어놓고 링크 붙일 곳이 없던 편의 다음 장면이 이거였습니다. 링크를 붙일 곳은 생겼는데, 붙인 글이 안 퍼집니다.
자가진단 3줄
지금 당신의 대시보드에 이 세 가지를 대보세요.
- 0과 "못 읽음"을 구분하는가. 합산 함수가 빈 응답을 0으로 더하고 있다면, 항목 수와 성공 응답 수를 같이 찍어보세요.
0 / 25건 중 0건 응답은0과 다른 말입니다. - UI 화면으로 코드를 검증하고 있지 않은가. 앱이 탭·필터·정렬로 이미 걸러준 화면을 정답지로 쓰면, API가 더 주는 것들은 영원히 안 보입니다. 두 목록의 개수부터 맞춰 보세요.
- 최근 N건이 N일치를 담고 있는가. 노이즈 객체가 하루 수백 건 끼는 채널이면 "최근 100건"은 곧 반나절짜리 창입니다. 페이징 없는 집계는 조용히 썩습니다.
솔직한 부분
이 버그가 며칠 살아 있었는지는 정확히 모릅니다. 껍데기가 급증한 08-08부터라고 보면 사흘쯤입니다. 그동안 저는 대시보드를 보면서 "쓰레드는 조회가 안 잡히는 채널"이라고 생각하고 있었습니다. 계측이 틀리면 결론이 아니라 세계관이 틀어집니다.
그리고 고친 대가로 얻은 진짜 숫자는 5,051이 아니라 674입니다. 목적지가 있는 글에 닿은 사람이 5일 동안 674명분 노출이라는 뜻이니까요. 이건 버그가 아니라 실력입니다.
당신 대시보드에서 지금 0으로 찍히는 칸이 있습니까? 그게 값인지 침묵인지, 딱 한 번만 로그를 열어 확인해 보시겠습니까?