미니게임 6종을 한 번에 출시하며 배운 것 — 5일간의 회고
스도쿠·노노그램·불끄기·단어 맞추기·탭 버드·순발력 숫자판 6종을 Google Play와 앱인토스에 동시 출시한 5일을 돌아봅니다. 공용 스펙으로 묶은 이유, 원패스 등록 절차, 그리고 실제로 밟은 사고들
오늘 스도쿠·노노그램·불끄기 퍼즐·단어 맞추기·탭 버드·순발력 숫자판 여섯 개의 출시 글을 한꺼번에 올렸습니다. 8월 30일 밤에 첫 게임의 코드를 쓰기 시작해 9월 3일 앱인토스 라이브, 9월 4일 Google Play 라이브까지 — 닷새 동안 게임 여섯 개가 두 스토어에 올라갔습니다. 지난달 8개 앱을 혼자 만들며 배운 것에서 “다음은 배치로 간다”고 적었는데, 그 배치를 실제로 돌린 기록입니다.
왜 여섯 개를 한 번에
개별 게임 하나를 출시하는 데 드는 시간 중 게임 로직을 짜는 시간은 절반이 안 됩니다. 스토어 등록정보, 스크린샷, 아이콘, 콘텐츠 등급 설문, 개인정보 선언, 광고 지면 생성, 푸시 동의문, 크로스 프로모 레지스트리, 블로그와 인스타까지 — 나머지 절반은 게임과 무관한 반복 작업입니다.
반복 작업은 한 번 절차를 확정하면 두 번째부터는 거의 공짜입니다. 그래서 이번에는 게임 6개를 공용 스펙 하나로 묶고, 출시 절차를 6번 연속으로 돌려 절차 자체를 굳히는 것을 목표로 삼았습니다. 실제로 첫 앱 등록에서 만난 오류가 여섯 번째 앱에서는 0개였습니다.
공용 스펙 — 여섯 게임이 공유하는 것
게임은 다 다르지만 뼈대는 하나입니다.
- 데일리 시드 + 연승: 날짜에서 시드를 뽑아 “오늘의 퍼즐”을 만들고, 풀면 연승이 이어집니다. 서버 없이도 전 세계 유저가 같은 문제를 푸는 구조입니다.
- 유일해 보장: 퍼즐 게임 세 개(스도쿠·노노그램·불끄기)는 답이 하나뿐인 보드만 출제합니다. 스도쿠는 생성한 100판을 전부 풀어 유일해를 확인했고, 불끄기는 GF(2) 선형대수 풀이가 무작위 대입 결과와 일치하는지, 노노그램은 줄 단위 논리만으로 완해되는지를 노드에서 자동 검증했습니다. “찍어야 풀리는 판”은 퍼즐 게임에서 가장 빠르게 별점을 깎는 요소라서, 여기에 시간을 가장 많이 썼습니다.
- 9개 언어: 한국어·영어·일본어·중국어·스페인어·포르투갈어·독일어·프랑스어·이탈리아어. 기기 언어를 감지하고 미지원 언어는 영어로 떨어집니다.
- 광고 훅: 힌트·부활은 보상형, 3판마다 전면. 다만 Play판 첫 버전은 광고 없이 나갔습니다(아래 참고).
- 공통 UI 패키지: 화면 전환·저장·시드 난수·크로스 프로모 목록·공유 버튼이 전부 모노레포의 공용 패키지입니다. 게임 하나당 실제 고유 코드는 300~700줄입니다.
출시 절차 — 여섯 번 반복해서 굳힌 순서
Google Play 먼저, 그다음 앱인토스
앱인토스 게임 카테고리에 올리려면 게임물 등급이 필요합니다. 국내 등급위원회 직접 심의는 건당 비용과 10~15일이 들지만, Google Play에 게임으로 먼저 출시하면 IARC 자체등급분류가 무료로 자동 발급되고 그 인증 ID를 앱인토스에 그대로 쓸 수 있습니다. 이번에도 8월 31일 오전 Play에 6종을 등록했고, 같은 날 IARC ID 6개가 나왔습니다.
원패스 등록 순서
Play 신규 앱 등록은 순서를 틀리면 검토 페이지에서 오류를 하나씩 만나게 됩니다. 여섯 번 돌리며 확정한 순서는 이렇습니다.
- 앱 만들기(패키지 이름은 이제 필수)
- 앱 콘텐츠 선언 10종 — 개인정보처리방침, 광고, 광고 ID, 타겟 연령, 데이터 보안, IARC 설문…
- 스토어 설정(카테고리·연락처)
- 기본 등록정보(영어) + 한국어 번역
- 국가/지역을 버전 만들기 전에 먼저 지정
- 프로덕션 버전 + 출시 노트
- 게시 개요에서 제출
5번이 핵심이었습니다. 버전을 먼저 만들면 “선택된 국가가 없습니다” 오류가 나는데, 국가를 먼저 지정하면 이 오류를 아예 만나지 않습니다. 사소해 보이지만 앱 하나당 왕복 한 번이 줄어듭니다.
내부 테스트 생략
여섯 앱 전부 내부 테스트 트랙을 건너뛰고 프로덕션에 직행했습니다. 웹 게임은 로컬 브라우저와 에뮬레이터에서 이미 검증됐고, 신규 앱 첫 검토가 며칠 걸리는 건 내부 테스트를 거쳐도 마찬가지이기 때문입니다.
게임플레이 영상은 기본 산출물
여섯 개 모두 유튜브 Shorts용 플레이 영상을 만들어 스토어 등록정보에 연결했습니다. 에뮬레이터에서 자동 플레이 → 화면 녹화 → ffmpeg 편집 파이프라인이 있어서 게임당 10분 안쪽입니다. “영상이 없어도 되는 앱”만 예외로 두는 규칙을 이번에도 지켰습니다.
실제로 밟은 사고들
배치 출시의 장점은 절차가 굳는 것이고, 단점은 사고도 여섯 배로 난다는 겁니다.
6종 번들이 전부 같은 게임이었던 사고. 앱인토스용 래퍼는 첫 게임 것을 복사해서 만드는데, 빌드 스크립트 안의 원본 게임 경로를 치환하는 단계가 조용히 실패했습니다. 결과는 6개 앱 전부에 반응속도 게임이 들어간 번들이 업로드되고 테스트 푸시까지 나간 것. 다행히 검수 요청 전에 잡았지만, 이후로는 번들을 올리기 전에 dist/index.html의 <title>이 그 게임 이름인지 확인하는 단계를 절차에 박아 넣었습니다. 잘못 올린 번들은 삭제가 안 돼서 지금도 콘솔에 “불량” 메모와 함께 남아 있습니다.
크로스 프로모에 새 앱이 안 뜨는 문제. 제 앱들은 하단에 “이런 앱도 있어요” 목록을 서로 띄우는데, 라이브 3일이 지나도 새 게임 6종이 여기 보이지 않았습니다. 원인은 레지스트리 CSV의 play=0 플래그를 라이브 전환 뒤에 올리지 않은 것. 서버가 없는 구조라 플래그 파일이 유일한 진실인데, 그걸 갱신하는 단계가 체크리스트에 없었습니다. 지금은 “라이브 확인 즉시 플래그 1 + 배포”가 출시 절차의 마지막 줄입니다.
Play판은 광고 없이 나갔습니다. 8월 말 AdMob 계정이 무효 트래픽으로 정지된 상태라(9월 24일까지) 광고 SDK를 뺀 빌드로 출시했습니다. 대신 앱인토스판은 자체 광고 지면을 쓰기 때문에 배너·전면·보상형 지면 17개를 만들어 붙였습니다. 두 플랫폼의 게임이 “동일해야 한다”는 등급 규정은 게임 내용 기준이라 광고 유무는 문제가 되지 않습니다.
CSS display: flex가 hidden 속성을 덮는 함정, 세 번째. 이 블로그에 이미 두 번 적은 함정을 숫자판 게임에서 또 밟았습니다. .card .row[hidden]에 display: flex가 걸려 있어 숨겨야 할 행이 그대로 보였습니다. 이번엔 해당 규칙만 고쳤고, 공용 CSS에 [hidden] { display: none !important }를 넣어 재발 경로를 아예 닫는 건 다음 배치의 첫 작업으로 잡아 뒀습니다.
출시 다음 날 — 피드백 다섯 건
라이브 하루 만에 가족과 지인에게서 받은 피드백을 전부 v1.0.1에 반영했습니다.
- 숫자판이 반응속도 챌린지와 너무 비슷하다 → 유사 앱으로 인접 배치해 서로 추천되게 태그 조정
- 단어 맞추기의 “자유 모드” 버튼이 무슨 뜻인지 모르겠다 → “시작”
- 탭 버드에서 부활하면 바로 죽는다 → 부활 시 기둥 초기화 + 1초 무적
- 스도쿠에서 같은 판을 다시 풀고 싶다 → 6자리 게임 번호와 난이도별 기록·재도전
- 불끄기에서 클리어한 판을 다시 못 한다 → 레벨 선택 화면(별·잠금·재도전)
그리고 여섯 게임 전부에 빠져 있던 것 하나 — 게임 중 홈으로 나가는 버튼. 뒤로가기만 믿고 있었는데, 화면에 출구가 없는 게임은 답답합니다. 기존 게임 네 개까지 포함해 열 개 앱에 한 번에 넣었습니다.
숫자로 보는 닷새
- 게임 6개, 스토어 2곳, 언어 9개
- Play 신규 등록 6건: 첫 앱은 검토 페이지 오류를 여러 번 → 여섯째 앱은 0회
- IARC 등급 6건, 당일 발급
- 앱인토스 광고 지면 17개, 정기 푸시 6종, 알림 동의문 6종
- 유튜브 Shorts 6편, 블로그 포스트 한/영 12편, 인스타 6건
- 출시 후 24시간 내 반영한 피드백 5건 + 공통 개선 1건
- Play 스토어 등록정보 기계 번역 27개 언어(무료) — 앱 안이 9개 언어인데 스토어가 2개 언어면 검색에 안 잡힙니다
다음
이번 배치로 절차는 굳었습니다. 다음 배치는 이미 코드가 끝난 13종(2048, 지뢰찾기, 뱀 게임, 벽돌깨기, 오목, 솔리테어…)인데, 아이콘과 스크린샷만 남았습니다. 이번에 만든 체크리스트대로라면 등록 자체는 하루 안에 끝날 것 같습니다. 그때 다시 적겠습니다.
소식은 이 블로그와 인스타그램(@fadongkwon.soft)에서 전해드립니다.
