
「마계공단: 던전사업부」는 쳐들어오는 모험가를 몬스터 직원으로 막는 모바일 던전 경영 게임이다. 지금은 App Store에 나와 있는데, 10월 13일까지만 해도 내 폰이랑 에디터 안에서만 돌아가던 게임이었다.
이번 편은 그 사이 9일 얘기다. 구글 플레이 내부 테스트 트랙을 열고, 테스트플라이트(TestFlight)로 아이폰 빌드를 돌리고, 스토어에 올릴 스크린샷을 만들어서 앱스토어 심사에 제출하기까지. 커밋 기록상 이 기간 커밋은 130개다. 상점과 결제 서버 얘기는 10편에서 따로 했으니, 여기서는 빌드를 만들고 테스트하고 내보내는 쪽만 따라간다.
구글 플레이 내부 테스트부터 열었다
10월 13일 밤 10시 43분, Play Console 내부 테스트 트랙에 첫 버전 1.0 (2) - Internal setup을 출시했다. 테스터는 등록해 둔 구글 계정 두 개다. 출시 노트엔 "결제 비활성"이라고 적었다. 프로덕션 공개는 하지 않았다.
구글 플레이에는 테스트 트랙이 몇 단계 있다. 내부 테스트는 그중 제일 안쪽이라 등록한 사람만 받을 수 있고, 심사를 길게 기다리지 않아도 된다. 혼자 만드는 입장에선 "폰에 새 빌드를 깔아 본다"를 제일 빨리 할 수 있는 길이었다.
설정할 게 생각보다 여러 군데였다. 같은 두 계정을 내부 테스트 트랙 테스터, 계정 단위 라이선스 테스터, Play 게임즈 서비스 테스터에 각각 넣었다. 라이선스 테스터에 들어가 있어야 테스트 결제가 실제로 청구되지 않고, Play 게임즈 쪽은 로그인용이라 따로 관리된다. 첫 AAB는 140MB쯤이었고 ARM64 전용, 최소 Android 7.1(API 25), 타깃 API 36으로 맞췄다.
다음 날부터는 거의 몇 시간에 한 번꼴로 빌드를 올렸다. 14일 하루에만 1.0 (3)부터 (8)까지 나갔다.
| 빌드 | 날짜 | 바뀐 것 |
|---|---|---|
| 1.0 (2) | 10/13 22:43 | 첫 내부 출시, 결제 꺼 둠 |
| 1.0 (3) | 10/14 12:18 | 결제 켬 |
| 1.0 (5) | 10/14 | 클라우드 백업 때문에 결제가 막히던 문제 수정 |
| 1.0 (6) | 10/14 | 결제와 백업 상태 분리 |
| 1.0 (7) | 10/14 18:30 | 마정석 상품 4종 |
| 1.0 (8) | 10/14 22:00 | 상점 업데이트 |
| 1.0 (10) | 10/16 | 효과음 교체 포함 |
| 1.0 (11) | 10/18 | 직원 공격·대기 모션 그림 |
| 1.0 (12) | 10/20 | 층 화면, 궁극기와 낙석 연출 |
| 1.0 (13) | 10/21 | 실제 광고, 계정 삭제 켬 |
1.0 (5)는 실기기에서 처음으로 테스트 결제 3건이 정상 지급된 빌드다. 고친 문제는 결제 코드가 아니라 클라우드 백업에 있었다. 세이브 구조에 결제 항목을 추가하면서 예전 백업이 전부 "형식이 다르다"고 거부됐고, 백업이 오류 상태가 되면 결제 쪽 계정 확인까지 닫혀서 스토어 연결도 서버 호출도 안 됐다. 바로 다음 빌드 (6)에서는 아예 백업 읽기나 업로드가 실패해도 계정만 확인되면 결제는 되게 떼어 냈다. 이유를 테스터 화면에 띄우던 진단 문구도 기기 로그로만 남기게 바꿨다.
개발자 노트버전 코드는 한 번 쓰면 끝이다
Play Console은 같은 버전 코드를 두 번 받지 않는다. 그래서 내부 테스트용 AAB 빌드 메뉴는 빌드할 때마다 버전 코드를 1씩 올리게 만들었다. 그런데 16일 밤 빌드는 9가 아니라 10으로 나갔다. 커밋 메시지 그대로 "이전 빌드가 이미 9를 써서" 건너뛴 거다.
21일 인계 문서에도 비슷한 함정을 적어 뒀다. Mac의 Unity가 iOS를 빌드하면서 메모리에 있던 옛 버전 코드(11)를 프로젝트 설정에 저장한 적이 있다. Android 빌드는 다른 데스크톱에서 하니까, 빌드 전에 설정값이 마지막 출시 번호와 맞는지 꼭 확인하라고 써 놨다.
14일엔 네이티브 디버그 심볼도 번들 안에 넣었다. Play Console이 내부 빌드마다 "디버그 심볼 없음" 경고를 띄웠는데, 이게 없으면 크래시 보고서에 함수 이름 대신 주소만 찍힌다.
같은 14일에 콘텐츠 등급 설문(IARC)도 처음 제출했다. 판타지 도트 폭력에 약한 피 표현, 무작위 아이템이 들어간 디지털 구매, 이용자 간 상호작용 없음. 결과는 한국 게임물관리위원회 기준 12세 이상이었다. 브라질은 18세, 호주는 성인 등급이 나왔는데 유료 무작위 아이템 때문이다. 그래서 "한국 먼저 출시라면 국가 설정을 다시 보자"고 적어 뒀다.
아이폰은 테스트플라이트로
iOS 쪽은 15일 밤부터 시작했다. Game Center로 로그인해서 클라우드 백업을 붙이는 코드를 먼저 썼다. 안드로이드의 Play 게임즈 로그인과 같은 구조로, 처음엔 게스트로 시작하고 Game Center 계정을 그 위에 연결한다. 이 코드는 iOS 설정 파일이 들어가기 전까진 아예 꺼져 있게 해 뒀다. 그날 커밋 메시지엔 "iOS 빌드나 기기 테스트는 아직"이라고 적혀 있다. 16일 오전엔 App Store Connect에 앱을 등록했다. 판매 국가는 대한민국 하나로 정했다. EU에 내려면 거래자 정보를 따로 내야 해서 나중으로 미뤘다.
인앱 상품 20개를 등록하려면 상품마다 심사용 스크린샷이 필요했다. 9시 52분에 에디터에서 20장을 한꺼번에 찍었다.

오후 4시 17분에 TestFlight 빌드 1.0 (2)를 업로드했다. 여기까지 오는 데 걸린 게 대부분 서명이랑 빌드 환경이었다. 등록한 기기가 하나도 없어서 Xcode 자동 서명이 안 됐고, 배포용 프로필을 따로 만들어서 손으로 지정했다. 새 Xcode는 광고 동의(UMP) 라이브러리의 최소 iOS 버전이 너무 낮다고 빌드를 거부해서, 모든 외부 라이브러리를 iOS 15 기준으로 끌어올리는 단계를 넣었다.
이후 TestFlight 빌드는 18일 (3), 20일 (4), 21일 (5), (6)까지 나갔다. 빌드 번호를 하나씩 올리고, 아카이브하고, 업로드하는 걸 반복했다.
개발자 노트첫 출시 전에는 Production 서버가 401을 준다
App Store 결제는 서버에서 Apple에 거래 정보를 물어보고 확인한다. Apple 서버는 운영(Production)과 샌드박스(Sandbox) 두 개다. TestFlight나 앱 심사에서 하는 결제는 샌드박스 거래인데, 처음엔 운영 쪽을 먼저 묻고 "그런 거래 없음"이면 샌드박스로 넘어가게 짰다.
문제는 운영 쪽이 "없음"이 아니라 인증 실패(401)를 준 거다. 17일 유료 앱 계약이 활성화된 뒤에도 같았다. 찾아보니 Apple 라이브러리 저장소 이슈에 "첫 App Store 출시 전에는 Production API가 401을 준다"는 담당자 답변이 있었다. 그래서 출시 전에는 운영이 401을 줘도 샌드박스로 넘어가도록 바꿨다. 이게 없었으면 심사관이 결제를 눌렀을 때 거절됐을 거다.
테스트 빌드 사이사이에 만든 것들
빌드만 올린 건 아니다. 내부 테스트 빌드가 나갈 때마다 게임도 같이 바뀌었다.
16일은 거의 하루 종일 소리 작업이었다. ElevenLabs로 직원 목소리를 새로 뽑아서 일반 45종, 희귀 26종, 영웅 33종, 전설 등급 45개를 차례로 바꿨다. 보스 다섯도 바꿨고, 원래 목소리가 없던 모험가랑 길드장에게도 목소리를 붙였다. 조용하던 길드장 레이드에는 효과음 35개를 깔았다. 음량은 최대치 대신 사람 귀 기준 체감 음량으로 등급마다 맞췄다. 전설 직원이 보스 외침보다 살짝 작게 들리도록.
19일엔 던전 탭을 다시 만들었다. 원래는 층별 단면이 가로 띠로 줄줄이 쌓인 화면이었는데, 전투에 쓰는 방 그림 위에 한 층씩 보여 주는 화면으로 바꿨다. 위아래로 밀면 층이 넘어가고, 아래 서랍에서 직원을 길게 눌러 끌어다 놓으면 바로 배치된다. 배치 화면까지 따로 들어갈 필요가 없어졌다.

20일은 전투 연출이었다. 궁극기가 전부 "적 쪽 가운데에서 속성 폭발 하나"였어서, 회복이나 보호막도 공격처럼 보였다. 궁극기를 전체, 전열, 후열, 단일, 회복, 보호 같은 종류로 나누고 실제로 맞는 대상 위에 연출하게 바꿨다. 전설 직원 44명은 자기만의 궁극기 그림을 따로 받았다.

오후엔 던전장 권능인 낙석을 고쳤다. 그 전까지는 2색짜리 32픽셀 네모 여섯 개가 정해진 자리로 떨어졌는데, 그마저 데미지 숫자가 뜬 다음이었다. PixelLab으로 굴러떨어지는 바위, 천장 먼지, 부서지는 효과를 새로 그리고, 살아 있는 모험가마다 머리만 한 바위가 하나씩 떨어지고, 빗나간 두 개는 바닥에 떨어진다. 부딪치는 순간에 화면이 흔들리고 짧게 멈칫한다. 낙석 소리도 그 순간에만 난다.

스토어 스크린샷 8장
21일 오후엔 스토어에 올릴 스크린샷을 만들었다. 실제 게임 화면으로 만들고 싶었는데, 내 개발용 세이브는 너무 이상한 상태였다. 그래서 에디터 도구를 하나 짰다. 지금 세이브를 백업해 두고, 4장까지 깬 직원 37명짜리 진열용 세이브를 넣고, 게임 화면을 3배로 찍은 다음 원래 세이브를 되돌린다.
찍은 화면에 문구, 테두리, 캐릭터 그림을 합치는 건 스크립트로 했다. 문구에 폰트에 없는 글자가 있으면 멈추게 해 뒀다. 문구 폰트는 넥슨 메이플스토리 볼드인데, 상업적 이용이 되는지 넥슨 서체 FAQ에서 확인하고 썼다. iPhone 6.9인치, iPad 13인치, 구글 플레이용까지 같은 8장을 크기별로 뽑았다. 구글 플레이 대표 이미지(1024×500)도 같이.
8장의 제목은 "모험가를 막아라!", "층층이 키우는 내 던전", "읽고, 배치하고, 막는다", "조합하면 강해진다", "185종 몬스터 직원", "전리품은 우리 것", "자리를 비워도 영업 중", "마계공단 신입의 첫 출근"이다. 전투, 던전, 배치, 속성 조합, 수집, 장비, 방치 수익, 스토리 순서로 이 게임에서 하는 일을 한 장씩 보여 주게 골랐다.

스토어 등록 정보는 API로 넣었다. 이름, 부제, 설명, 키워드, 카테고리(시뮬레이션, 전략), 스크린샷 16장. 키워드는 초안에 있던 '오프라인'을 빼고 '디펜스게임'을 넣었다. 출시 방식은 심사를 통과해도 바로 나가지 않는 수동 출시로 정했다. 지원 URL, 개인정보처리방침 URL, 마케팅 URL은 전부 이 홈페이지 주소다. 이 사이트의 정책 페이지들도 이날 시행본으로 확정했다.
심사 제출 버튼을 두 번 눌렀다
21일 오후는 출시 전에 켤 걸 켜는 시간이었다. 2시 5분에 정식 빌드의 보상형 광고를 테스트 광고에서 실제 광고로 바꿨다. 개발용 빌드는 계속 테스트 광고를 쓴다. 광고가 안 잡히면 15초 뒤 "지금은 광고가 없어요"와 남은 대기 시간을 보여 주게 했다. AdMob 계정이 아직 검토 중이라 광고가 거의 안 나올 수 있어서다. 4시 5분엔 앱 안에서 계정을 삭제하는 기능을 켜고 TestFlight 1.0 (6)을 만들었다.
그런데 그 사이 4시 43분에 사고가 있었다. 제출 전 초안을 확인하던 중에 화면에 떠 있는 '제출 초안' 버튼을 누른 게 패널의 '심사를 위해 제출'까지 이어졌다. 의도치 않게 제출된 거다. 바로 취소했고, 버전은 개발자 거절 상태로, 상품들은 제출 준비 상태로 돌아갔다. 인계 문서에 "사고 기록"이라는 제목으로 이 과정을 남겨 뒀다.
그다음 TestFlight 1.0 (6)을 폰에서 확인하고, 4시 58분에 진짜로 제출했다. 앱 1.0과 인앱 상품 20개 전부. 연령 등급은 12세, 개인정보 라벨은 데이터 유형 10개, 추적 없음으로 게시했다. 심사 메모엔 로그인이 필요 없다는 것, 보상형 광고는 스토리 1-5를 깨야 열린다는 것, 광고가 없을 때 뜨는 문구까지 적었다.
같은 날 저녁 5시 7분, 안드로이드 쪽은 1.0 (13)을 비공개 테스트용으로 빌드했다. 안드로이드 출시는 이 Mac이 아니라 다른 데스크톱에서 이어가기로 하고, 거기서 바로 시작할 수 있게 인계 문서를 따로 썼다. 밤 10시 8분에는 Firebase Analytics를 붙여서 전투, 채용, 튜토리얼 진행 같은 이벤트가 남게 했다. 광고 ID와 맞춤 광고는 끈 채로 두고, 계정을 삭제하면 분석 ID도 초기화된다.
2026.10.13~21 주요 커밋
- 구글 플레이 내부 테스트 1.0 (2) 첫 출시
- 클라우드 백업 디코드 수정, 1.0 (5)에서 테스트 결제 3건 지급 확인
- 콘텐츠 등급(IARC) 제출 기록
- Play 번들에 네이티브 디버그 심볼 포함
- Game Center 로그인
- App Store Connect 앱 등록, 인앱 상품 심사 화면 20장
- ElevenLabs 직원 목소리 교체 시작
- 첫 TestFlight 빌드 업로드
- 첫 출시 전 Production 401이면 Sandbox로
- 던전 탭을 한 층씩 보는 화면으로
- 궁극기 연출 종류별로 분리
- 정식 빌드 실제 광고 전환
- 스토어 등록 정보 초안, 스크린샷 8장
- 앱 내 계정 삭제 켬, TestFlight 1.0 (6)
- App Store 심사 제출
- Firebase Analytics
9일을 돌아보면
내부 테스트 빌드를 이렇게 자주 올릴 줄은 몰랐다. 그래도 빌드마다 출시 노트에 뭐가 바뀌었는지 적어 두니, 어느 빌드에서 뭐가 고쳐졌는지 바로 찾을 수 있었다. 폰에 깔아야만 보이는 문제가 생각보다 많았다는 것도 4편 때랑 똑같았다.
심사 결과는 다음 편에서 쓴다. 이틀 뒤 App Store에 출시했고, 바로 이어서 영어판까지 만든 얘기다. 게임이 어떤지는 게임 소개 페이지에서 먼저 볼 수 있다.

NOW AVAILABLE
마계공단: 던전사업부
용사는 침입자, 몬스터는 직원. 폐쇄 위기의 제7던전을 살려 주세요.
스토어로 이동합니다. Android(Google Play) 버전은 준비 중이에요.