이 글은 룸톤 Roomtone 시리즈의 16번째 기록입니다. (총 22개)

오늘 한 일

  • 앱스토어에 내기까지 남은 일을 마일스톤으로 정리하자고 했다. 인프라 → 음원 보호 → 과금 → 스토어 제출 → 첫 고객 다섯 단계로 갈랐다.
    • 정리하려고 상태부터 훑다가 카탈로그가 병목에서 빠진 걸 확인했다. 지난주 442곡이던 검수 대기가 15곡까지 내려왔고, 채널별 후보도 전부 6시간치(100곡) 기준을 넘겼다. 제일 얇던 시티팝이 122곡이다.
  • 그러다 프로덕션이 하나도 없다는 걸 발견했다. 원격 데이터베이스도, 파일 저장소도, 배포된 서버도 없이 전부 wrangler(Cloudflare를 다루는 명령줄 도구)의 로컬 개발 모드 위에서만 돌고 있었다. 곡 7GB도 노트북 안에만 있었다.
  • 원격 데이터베이스와 음원 저장소를 만들고 테이블 설계도 19개를 적용했다.
  • 카탈로그를 원격으로 옮겼다. 곡 771(승인 699)·곡과 태그의 연결 4,894·태그 37·재생목록 7·스케줄 10이 노트북과 일치한다.
  • 배포했을 때 루트 주소에 뜰 것을 정적 한 장으로 바꿨다. 거기 있던 건 7월 22일에 멈춘 웹 관리 콘솔인데, 아직 역할이 관리자와 매장 둘뿐인 줄 안다. 매장 역할은 9월 6일에 없앴다.
    • 이유: 보안보다는 그 자리가 곧 필요해서다. 앱 밖에서 팔기로 했으니 웹 가입·결제 페이지를 만들어야 하고, 들어갈 자리가 바로 거기다. 지금 옛 콘솔을 올려두면 어차피 걷어내게 된다. 콘솔 코드는 지우지 않고 저장소에 남겨 예비 수단으로 둔다.

막힌 부분

데이터베이스 주소를 바꾸니 로컬 DB가 통째로 사라진 것처럼 보였다

원격 데이터베이스를 만들고 받은 실제 주소를 설정에 적어 넣었다. 그러자 곡 771개가 든 로컬 데이터가 0이 됐다. 덤프를 떠 보니 1KB짜리 빈 파일이 나왔다.

로컬 개발 모드가 DB 파일을 데이터베이스 주소의 해시로 이름 붙여 저장하고 있었다. 주소를 바꾸는 순간 그 이름으로는 아무것도 없으니 새 빈 DB를 만든 것이다. 데이터가 지워진 게 아니라 아무도 안 보는 옛 이름으로 남아 있었다.

c204843922c7...sqlite   1,019,904 바이트   ← 진짜 데이터 (옛 주소 해시)
6ab700a6f311...sqlite       4,096 바이트   ← 새로 만들어진 빈 것
  • 해결: 옛 파일을 새 이름으로 복사해 이어 붙였다. 본체와 함께 기록 대기 파일(-wal)도 옮겨야 한다.
  • 함정 하나 더: 이때 서버가 떠 있으면 안 된다. 이미 실행 중인 서버는 바꾸기 전 설정으로 시작해 옛 파일을 붙잡고 있어서, 그 사이 한 작업이 새 파일에 안 들어간다. 서버를 닫고 다시 옮겼다.

원격의 기본값과 우리 데이터의 번호가 부딪혔다

카탈로그를 원격에 넣으려는데 첫 줄에서 멈췄다. 계정 1번이 이미 있다는 것이다.

테이블 설계도 맨 앞장에 “빈 DB라도 이건 있어야 돌아간다”며 넣어 둔 기본값이 있었다. 계정 1번, 공간 1번, 태그 15개. 원격 DB는 태어날 때부터 이걸 갖고 있었고 우리 데이터도 1번부터 시작한다.

덮어쓰기로 풀릴 것 같았지만 아니었다. 태그 번호가 어긋나 있었다.

8번 태그   노트북: 피아노(악기)   원격 기본값: 청량(무드)

노트북에서 6·7번 태그를 지운 적이 있어 그 뒤로 번호가 밀렸다. 그런데 곡과 태그를 이은 기록 4,894건은 전부 번호로만 되어 있다. 번호가 어긋난 채 옮기면 피아노 곡이 통째로 청량으로 둔갑하고, 재생목록은 태그로 곡을 고르니 편성이 다 틀어진다.

  • 해결: 기본값을 비우고 노트북의 번호 체계를 통째로 옮겼다. 원격은 갓 만든 빈 DB라 비워지는 게 기본값뿐이다.
  • 교훈: 두 DB를 합칠 때 겹치는 건 데이터가 아니라 번호다. 이름이 같아도 번호가 다르면 남남이고, 그 번호를 참조하는 쪽이 조용히 틀어진다.

배포 주소 이름이 이미 남의 것이었다

배포하려니 쓰려던 기본 주소를 누가 이미 쓰고 있었다. 열어 보니 동명의 한국어 일기 앱이다. 이 기본 주소는 계정별이 아니라 전 세계에서 이름이 하나뿐이라 가져올 수 없다.

  • 해결: 프로젝트 이름만 바꾼다. 실제 서비스 주소는 우리 도메인의 하위 주소로 붙일 거라 서비스에는 영향이 없다.
  • 남은 것: 이름이 겹치는 서비스가 있다는 것 자체는 알아 둔다. 성격이 전혀 달라(일기 앱과 매장 BGM) 당장 부딪힐 일은 없다. 다만 매장이 스토어에서 찾아 스스로 가입하는 구조라 검색에서 섞이면 손해다. 제품명으로 상표를 낼 생각이 서면 그때 먼저 조회한다.

다음에 할 일

  • 배포하고 커스텀 도메인 붙이기 — 프로젝트 이름은 기본 주소가 겹치지 않는 것으로
  • 운영 비밀값 세 개 넣기 — 세션 키, 관리자 비밀번호(운영은 새 값으로), 음원 암호 키
  • 파일 추출 차단 2단계 — 안드로이드가 암호문을 받아 직접 푸는 재생 경로
  • 음원 7GB 원격으로 옮기기 — 옮기면서 암호화하면 파일 추출 차단 3단계도 같이 끝난다. 2단계보다 먼저 하면 안 된다(암호화된 곡이 안드로이드에서 안 울려 두 번 올리게 된다)
  • 반입을 검수 콘솔로 통째로 옮기기 — 파일을 콘솔에 끌어다 놓고 프롬프트도 콘솔에서 입력(프롬프트 엑셀 제거), 그다음 분류·변환·업로드를 버튼 하나로(반입 배치 파일 은퇴)
  • 검수 대기 15곡 마저 듣기
  • 계정별로 데이터 가르기 — 스케줄·커스텀 재생목록·업종을 로그인한 계정 기준으로 (셀프 가입이라 공개 출시 전 필수 — 지금은 회원끼리 서로의 스케줄을 볼 수 있다)
  • 매장 안내방송 — 지정 시각에 한 번 끼어들고 복귀. 음원은 서버에 올리지 않고 기기의 로컬 파일을 고른다
  • 보컬 검사를 여러 구간으로 넓히고 점수와 위치를 저장하기
  • 웹 가입·결제 페이지 만들기
  • Creem 구독 상품 등록 — 결제 화면에 자동 갱신·무환불 다시 고지
  • 구독 가격 표시를 월 1만원으로
  • 플레이 제출 준비 — 업로드 서명 키 만들기(지금은 개발용 서명이라 업로드가 거부된다), 앱 식별자 확정(한 번 올리면 영구히 못 바꾼다), 앱 아이콘(기본 아이콘 상태), 스토어 등록정보, 데이터 안전 양식
  • 검수 콘솔 끝잘림 18곡 페이드 처리
  • 30초 미리듣기 컷
  • 곡 제목을 한국어·영어 두 가지로
  • 휴지통 30일 자동 정리 붙일지 검토
  • 넓힌 키워드로 기존 곡 무드 백필
  • 자동 분류가 안 된 5곡 에너지를 귀로 확정
  • 기기 1대만 재생되도록 묶기
  • 앱 화면 더 다듬기 — 카드·가로 스크롤, 자켓 4분할, 셔플·반복 점 표시

Series: 룸톤 Roomtone


Suggested Posts