← 작업일지

2026-07-30 · v1.0.0

2026.07.30 작업일지 v1.0.0

08:2x, 구독 결제가 왜 0건인지 숫자로 세보기로 했다. 14:14, sitemap 이 라이브에 안 올라간 줄 알고 보고하려다 대조군 한 번에 스스로 반증됐다. 19:0x, 이틀 동안 “잘못된 가격”이라고 믿었던 $1.99 가 실은 정확한 가격이었다.

앱 두 개(메모요·한줄일기)의 유료 전환이 0건이었다. 광고를 붙이고 구독을 열었는데 아무도 사지 않는다면, 보통은 “가격이 비싸서”나 “가치를 못 느껴서”로 결론 낸다. 그런데 세보기로 했다. 그리고 세보니 사람들이 안 산 게 아니었다 — 살 수가 없었다.

1. 돈이 새는 자리는 마케팅이 아니라 코드였다

퍼널을 칸별로 세니 세 군데가 막혀 있었다.

발견실체
iOS 광고제거를 살 수 없다상품 ID 기본값이 빈 문자열이라 조회 집합에서 아예 빠진다
iOS 구독자가 결제해도 AI 가 안 열린다서버에 iOS 영수증 검증 경로가 없었다
온보딩이 “광고 없다”고 말한다홈에는 배너가 뜬다. 문구와 배송물이 어긋났다

세 번째가 특히 아팠다. 앱이 스스로 거짓말을 하고 있었고, 그건 버그 리포트가 아니라 신뢰 문제다. 개인정보처리방침도 광고 SDK 를 싣는 앱 8개 전부 실제와 맞췄다. 무료 AI 체험 3회를 넣어 “값을 보여준 다음 값을 받는” 순서로 바꿨다.

배운 것 — 전환율이 0이면 마케팅을 의심하기 전에 결제 버튼이 실제로 눌리는지 눌러봐야 한다. 0은 무관심의 숫자가 아니라 고장의 숫자일 수 있다.

2. sitemap 15줄 중 14줄이 일을 하지 않고 있었다

개인 사이트(apex 도메인)에 robots.txt 와 sitemap.xml 이 없었다. 만들어 올렸고 6분 만에 라이브에 반영됐다. 여기서 끝난 줄 알았다.

문제는 sitemap 에 적은 주소 15개 중 14개가 200 이 아니라 308 이었다는 것이다. 끝 슬래시가 없는 주소를 호스팅이 슬래시 붙은 주소로 되돌린다. 검색엔진은 그걸 “리디렉션된 페이지”로 보고 색인하지 않는다. 즉 sitemap 을 제출했는데 15줄 중 14줄이 무효였다.

왜 못 잡았나 — 검증할 때 리다이렉트를 따라간 뒤 페이지가 있는지 확인했다. 하지만 배송물은 목적지가 아니라 sitemap 에 적힌 그 문자열이다.

PRE  200×1  308×14
POST 200×15 308×0

19:33 에 정정본이 라이브에 착지해 15/15 가 리다이렉트 없이 200 이 됐다.

3. 대조군이 없으면 “없다”를 말할 수 없다

같은 날 오전, sitemap 이 머지됐는데 라이브에는 없다고 판단한 순간이 있었다. robots.txt 와 sitemap.xml 이 둘 다 200 에 같은 크기로 응답했으니 홈 화면이 대신 나온 것처럼 보였다.

보고 직전에 대조군을 돌렸다 — 존재하지 않는 주소를 하나 찍어봤다. 그것도 같은 크기의 200 을 돌려줬고, 반면 robots.txt 는 69바이트 text/plain 이었다. “배포 누락”이라는 없는 블로커를 올리기 직전에 스스로 반증됐다. 그저 배포 착지 전 몇 분을 본 것이었다.

이 검사기 자체도 눈이 감겨 있었다. 상태 코드만 보는 검사기는 “없는 주소에도 200 을 주는” 사이트에서 전부 통과를 낸다. 크기와 제목으로 판정을 바꾸고, 가짜 주소가 실제로 걸러지는지 확인한 뒤에야 초록을 인정했다.

배운 것 — “이 주장이 틀렸다면 어디를 보면 드러나나?” 그 한 곳을 열지 않았다면 아직 단정할 자격이 없다.

4. 같은 실수를 하루에 다섯 번 — 겉표시를 실체로 갈음하기

오늘의 진짜 주제는 이것이었다. 형태가 조금씩 다른 같은 실수를 다섯 번 밟았다.

  • 테스트 하나가 “건너뜀 1건”으로 통과했고, 그 건너뛴 자리에 실제 실패가 숨어 있었다 → 다음 사람이 그걸 밟고 저장소 전체가 빨개졌다
  • 훅 파일이 5대에 다 있으니 배포됐다고 봤다 → 실제로 등록된 건 1대뿐이었고 관찰 기능은 한 번도 돈 적이 없었다
  • 프로세스 번호가 새로 찍혔으니 재기동됐다고 봤다 → 겉껍데기만 갈렸고 실제 코드를 물고 있던 프로세스는 3일 전 것이 그대로 살아 있었다
  • 검증 결과를 손으로 붙여둔 코멘트를 영수증으로 셌다 → 기계가 세는 형식이 아니어서 머지가 정지했다
  • 릴리스 빌드가 다른 앱 폴더에서 돌았다 → 앱 이름은 옵션으로만 쓰이고 실제 작업 위치는 아무도 확인하지 않았다

다섯 개 다 “표시가 초록이니 실체도 초록이겠지”였다. 그래서 재발 방지를 문장이 아니라 검사기로 옮기는 쪽으로 정리했다 — 파일 존재가 아니라 등록 여부, 프로세스 번호가 아니라 기동 시각, 손으로 쓴 요약이 아니라 기계 서명.

5. “틀린 가격”이 실은 맞는 가격이었다

iOS 광고제거 상품을 심사에 올리려면 그 상품이 보이는 화면을 스크린샷으로 내야 한다. 그런데 시뮬레이터에서 띄우니 ₩3,300 이 아니라 $1.99 로 나왔다. 이틀 동안 “원화로 띄우는 방법”을 찾았다. 설정 파일 키를 바꾸고, 스키마를 정본과 맞추고, 앱을 한 번도 안 켠 깨끗한 시뮬레이터로 대조군까지 돌렸다. 다 실패했다.

그러다 질문을 뒤집었다. 그 $1.99 가 틀린 값이라는 근거가 뭔가?

스토어 API 로 ₩3,300 가격대의 미국 가격을 직접 조회했다.

KOR 가격대 customerPrice=3300  →  USA 대응가격 customerPrice=1.99 USD

$1.99 는 애플이 ₩3,300 과 같은 가격대로 정한 미국 스토어의 진짜 가격이었다. 심사자는 기본적으로 미국 스토어를 본다. 즉 이미 찍어둔 스크린샷이 그대로 적격이고, 남은 우회 작업 전체가 불필요해졌다.

배운 것 — 이틀을 태운 문제가 “고칠 방법”이 아니라 “고칠 필요가 없었다”로 끝나는 경우가 있다. 막히면 해법을 더 찾기 전에 전제를 한 번 재보는 게 싸다.

6. 그래서 뭐가 남았나

  • 커밋 83개 / 저장소 6곳 — 자동화 45, 홈페이지 11, apex 3, 앱 16, 스킬 8
  • 티켓 74건 종결 — 매출 누수 3건, 개인정보 표기 정합, 검색 노출, 검증 레일 결함 다수
  • 검색 노출 — apex sitemap 15/15 정상화 (오전엔 14개가 무효)
  • 발견해서 못 닫은 것 — 홈페이지 계열 저장소는 자동 검증 영수증을 낼 수 있는 경로가 아예 없다. 그래서 오늘 한 번은 예외 승인으로 머지했고, 그 예외가 습관이 되지 않게 별도 티켓으로 분리했다

돈으로 든 비용은 0원이다. 든 것은 시간과, 같은 실수를 다섯 번 반복하는 걸 지켜본 하루였다.


다음 이야기는 “검사기가 자기 관측면을 모를 때” 이야기.

— 강대종 / @ssamssae