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

오늘 한 일

  • 어제 배포한 것들이 운영에서 도는지 확인했다. 서버가 주는 태그가 시즌 1개(크리스마스)·분위기 13개·장르 14개로 의도한 모양이었다.
  • 둘러보기 휠을 다시 세 칸(시즌·분위기·장르)으로 되돌렸다.
    • 이유: 어제 계절 값을 크리스마스 하나로 줄이면서 휠에서 축까지 뺐는데, 값이 하나여도 12월에 매장이 스스로 고를 자리는 있어야 한다. 값 없는 타일은 안 보이므로 시즌 칸에는 「전체」와 「크리스마스」만 뜬다.
  • 시즌 축에 값을 더할 자격을 정했다. 기준은 「그 곡을 듣고 그 때를 맞힐 수 있나」다.
    • 크리스마스는 벨 소리·캐럴 진행이 있어 통과. 명절은 국악 편성의 축하 결이라 통과하지만 설날·추석은 서로 구분되지 않아 「명절」 하나로 둔다. 새해는 「활기찬 축하」라 분위기로 충분하다.
    • 국악 편성 자체는 장르·편성 축 몫이다. 소리의 성격이라 분위기가 아니다.
  • 할로윈 곡은 내년으로 미뤘다.
    • 이유: 지금 시작하면 이번 달 남은 몫과 다음 달 몫을 거기에 써야 하는데, 그 전에 팔릴지가 불확실하다. 한 달 몫을 시즌 한 칸에 몰기보다 얇은 조합(앰비언트·보사노바)을 채우는 데 쓴다.
  • 내부 테스트를 한 바퀴 돌렸다. 가입·미리듣기·체험·결제·해지·탈퇴 여섯 단계를 폰에서 확인하고, 나온 문제 둘을 고쳤다(막힌 부분).
  • 다섯 번의 번들을 만들었다(1.0.0+4~+8). 휠 세 칸, 날짜 표시, 로그인 키보드가 차례로 들어갔다. 마지막 하나는 내용이 같은데 번호만 올렸다(막힌 부분).
  • 재생 이력에 계정이 실제로 쌓이는지 확인했다. 전체 1,570건 중 3건에 계정이 붙어 있었다 — 어제 배포 뒤 테스트로 튼 것들이고, 그전 기록은 계정 없이 남는다.
  • 데이터베이스 유료 요금제를 한 달치 결제하고, 무엇이 한도를 먹었는지 쿼리별로 쟀다.
    • 이유: 하루 읽기 한도가 소진돼 로그인이 막혔다(막힌 부분). 초기화를 기다리면 오늘 제출 준비가 통째로 멈춘다.
  • 심사에 낼 포그라운드 서비스 시연 영상을 에뮬레이터로 찍었다.
  • 계정을 정리했다. 시험용으로 만든 것들을 지우고 필요한 것만 남겼다.
  • 찍은 영상을 유튜브에 미등록으로 올려 포그라운드 서비스 신고에 링크를 걸었다.
  • 심사용 계정을 점검했다. 구독은 이미 켜져 있었고 비밀번호만 새로 정한 뒤, 그 비밀번호로 실제 로그인되는지까지 확인했다. 심사자가 이 계정으로 들어온다.
  • 플레이 심사에 제출했다. 데이터 보안 양식, 앱 콘텐츠 설문, 등록정보·이미지, 앱 액세스, 출시 노트(한국어·영어)까지 채우고 번들을 올렸다.
  • 스토어 데이터 보안 답안을 고쳤다. 재생 기록을 계정과 연결하기 시작했으니 「계정과 연결 안 됨」이 거짓이 됐다. 수집 목적도 애널리틱스에 「맞춤설정」을 더했다 — 플랫폼 설명의 맞춤설정 예시가 「청취 습관에 따른 재생목록 추천」으로 우리 경우와 같다.

막힌 부분

  • 무료 체험과 구독 화면에서 날짜가 「-」로 떴다. 상태는 정상이고 재생도 열렸다.
    • 원인: 서버가 주는 시각이 두 형식이다. 대부분은 시간대 표시가 없고, 구독 만료일만 이미 표시가 붙어 있다. 앱이 뒤에 표시를 무조건 덧붙여서 그쪽 파싱이 깨졌다.
    • 해결: 시각을 읽는 함수를 하나로 모으고, 표시가 이미 있으면 그대로 읽게 했다. 휴지통의 남은 보관일 계산도 같은 함정이 있어 같이 바꿨다.
  • 로그인 오류 문구가 키보드에 가려 보이지 않았다.
    • 원인: 오류는 폼 아래에 뜨는데 키보드가 그 자리를 덮는다. 틀린 비밀번호를 넣어도 왜 안 되는지 모르고 다시 누르게 된다.
    • 해결: 들어가기·체험 버튼을 누르면 키보드를 내린다.
  • 에뮬레이터에서 재생 소리가 버벅였다.
    • 원인: 곡을 앱 안에서 풀어 재생하는 구조라 에뮬레이터에는 무겁다. 실기기에서는 화면을 끈 채 13곡이 끊기지 않았다.
    • 해결: 심사에 낼 포그라운드 서비스 시연 영상은 소리 없이 화면만 찍어도 된다. 확인하는 건 「앱을 나간 뒤에도 재생이 계속되고 알림에서 조작할 수 있나」다.
  • 번들을 올리려니 버전 번호 7이 이미 쓰인 것이라고 거절당했다.
    • 원인: 내부 테스트에 올렸다가 지운 번들이라도 플레이는 그 번호를 영구히 기억한다. 지웠으니 다시 쓸 수 있다고 본 게 틀렸다.
    • 해결: 8로 올려 다시 빌드했다. 코드는 그대로다.
  • 심사용 계정의 재설정 링크를 열자마자 「링크가 만료되었거나 이미 사용되었습니다」가 떴다.
    • 원인: 링크를 손으로 긁어 복사하다 끝이 잘렸다. 서명이 안 맞은 건데 문구는 만료와 같아서 원인이 안 보였다.
    • 해결: 다이얼로그의 복사 버튼으로 다시 복사하니 됐다.
    • 남은 판단: 이 화면은 곧 인증번호 방식으로 바뀌니 고치지 않는다. 대신 새 방식에서는 「번호가 틀렸다」와 「시간이 지났다」를 구별해 보여 준다.

로그인이 500을 내고 앱이 그 텍스트를 읽다 터졌다

에뮬레이터에서 로그인을 누르니 앱에 「예기치 않은 문자」 오류가 떴다. 서버 응답을 확인해 보니 500이었고 본문이 JSON이 아니라 한 줄짜리 오류 문구였다. 앱이 그걸 JSON으로 읽으려다 터진 것이다.

서버 로그를 보니 원인은 우리 코드가 아니었다. 데이터베이스 무료 요금제의 하루 행 읽기 한도가 소진돼 있었다. 로그인이 실패 횟수를 기록하려는 쓰기까지 막혀 500이 됐다.

처음엔 낮에 돌린 전수 작업(곡을 분류하고 조합을 세느라 곡 목록을 통째로 다시 받는 일)이 원인이라고 봤다.

요금제를 올려 한도를 푼 뒤 쿼리별 집계를 떠 봤다. 이 집계는 상위 쿼리만 표본으로 보여 주고 창이 지금부터 24시간을 뒤로 세기 때문에 총합(454만)이 사용량 화면과 다르다 — 몫을 보는 용도로만 쓴다. 그 안에서 전수 작업은 57만 행·13%였다. 짐작이 가리킨 대상은 맞았지만 몫이 작았다.

가장 많이 먹은 것은 태그 목록 요청으로 180만 행·40%다. 돌려주는 값은 태그 37개인데 「쓰이고 있는 태그만」을 고르려고 곡·태그 연결표 4,894줄을 매번 전수로 훑어 회당 1만 행을 읽는다(효율 0.3%). 그다음은 재생목록 미리보기 216만 행·48% — 홈을 한 번 열면 재생목록 일곱 개의 곡 수와 길이를 그때그때 센다. 인덱스는 이미 있고, 쿼리 모양 자체가 표 전체를 보게 돼 있다.

둘을 합치면 88%다. 앱을 열고 닫는 것만으로 나가는 몫이 그만큼이라, 전수 작업을 한 번도 안 돌렸어도 평소 트래픽이 이미 한도 언저리였다.

  • 해결: 유료 요금제를 한 달치 결제했다. 한도가 바로 풀려 다음 초기화를 기다리지 않아도 된다. 서버 쪽은 바로 확인했다 — 태그·재생목록 조회와 실패 로그인 기록까지 정상이다. 앱에서 로그인해 실제로 곡이 흐르는지는 기기에서 따로 본다.
  • 교훈: 한도를 재는 단위는 호출 횟수가 아니라 회당 행수 × 횟수다. 실측 전에는 원인을 확정하지 않는다 — 눈에 띄는 작업이 범인처럼 보였지만 몫은 13%였다.
  • 남은 판단: 요금제는 시간을 산 것이지 원인을 고친 게 아니다. 태그 목록과 재생목록 미리보기를 캐시하거나 집계표로 미리 계산해 두는 쪽을 봐야 한다 — 이 둘만 잡아도 하루 읽기의 88%가 빠진다. 매달 낼지는 심사가 끝난 뒤 다시 본다.

앱이 「예기치 않은 문자」로 죽지 않게 할 것

이번에 앱이 보여 준 것은 서버가 왜 실패했는지가 아니라 파싱 실패였다. 매장이 이 화면을 보면 무엇을 해야 할지 알 수 없다.

  • 남은 판단: 서버가 JSON이 아닌 응답을 줄 때 앱이 「지금 서비스에 문제가 있어요. 잠시 뒤 다시 시도해 주세요」로 바꿔 보여 주게 할 차례다(다음에 할 일). 오늘은 원인을 찾는 데 썼다.

다음에 할 일

  • 기기에서 회원 로그인·재생 확인 — 요금제를 올린 뒤 서버 쪽만 봤다
  • 심사 결과 기다리기 — 반려되면 사유대로 고쳐 다시 제출
  • 통과하면 심사용 계정의 구독을 되돌리기 (운영에 구독 중인 시험 계정을 남기지 않는다)
  • 로그스톤 샵 룸톤 페이지에 첫 출시 내역 반영 — 심사 통과 뒤에
  • 서버가 JSON 아닌 응답을 줄 때 앱이 사람 말로 안내하게 하기
  • 비밀번호 재설정을 인증번호 자동 발송으로 — 지금은 재설정이 자동이 아니다. 심사 도는 동안 착수
  • 태그 목록·재생목록 미리보기 읽기 줄이기 — 하루 읽기의 88%다. 캐시나 집계표로. 전수 작업은 응답을 파일로 한 번 받아 로컬에서 세기
  • 한 달 뒤 요금제를 계속 둘지 정하기 — 위를 고친 뒤 실측으로 판단
  • 얇은 조합 채우기 — 앰비언트·보사노바 분위기 확장, 봄 23곡. 생성 계획으로
  • 구독이 끝나 미리듣기로 바뀔 때 로딩이 한참 걸리는 것 — 테스트 구독 만료(5분)로 재현
  • 판매 페이지를 공개하기 직전에 Creem 결제 한 바퀴 — 안 되면 웹 구독 버튼을 감추고 앱에서 구독하게
  • 로그스톤 샵 룸톤 상품 페이지에 스토어 이미지 올리기
  • Creem을 계속 둘지·플레이 외부 결제 프로그램 등록 — 실제 고객 열 명 뒤나 웹 버전을 만들 때 다시 보기
  • 구글 계정으로 로그인 — 붙일 때 플레이 데이터 보안 답과 개인정보처리방침도 함께
  • 웹에서 듣기 — PC만 쓰는 매장이 나오면 웹판과 윈도우 앱을 비교해 정하기
  • 로그스톤 샵의 개인정보처리방침·환불 조항 회신을 받아 웹 페이지 문구 맞추기 — 재생 기록 조항 요청도 함께 걸려 있다
  • 우리 쪽 장애로 못 들은 기간 이용 기간 늘려 주기 — 구현 뒤 로그스톤 샵에 회신
  • 다음 곡 주소 미리 받기 검토 — 재생 횟수 기록을 떼는 것과 같이
  • 안드로이드 패키지에 딸려 오는 윈도우용 재생 엔진 빼기 검토(다운로드 6MB 남짓)
  • 매장 안내방송 — 지정 시각에 한 번 끼어들고 복귀. 음원은 서버에 올리지 않고 기기의 로컬 파일을 고른다
  • 휴지통 30일 자동 정리 붙일지 검토
  • 넓힌 키워드로 기존 곡 무드 백필
  • 자동 분류가 안 된 5곡 에너지를 귀로 확정 — 빠르기로 초기값만 넣어 둔 상태다
  • 곡 풀은 분위기별 깊이로 보강, 곡 하나로 만드는 스테이션(출시 후)
  • 록·메탈 곡 마스터링 — 할지 말지 미정
  • 앱 아이콘 여백 — 번들에는 들어갔지만 폰에서 아직 확인 못 함
  • 스케줄 화면 쪼개기 — 651줄에 상태·타임라인·격자·시트가 한 파일에. 출시 뒤로

Series: 룸톤 Roomtone


Suggested Posts