디데이 앱 Days+를 만들어 출시하고 조용히 망한 기록. 7편짜리다. 각 편은 따로 읽어도 된다. 1편부터 보기
코드는 1월 말에 이미 돌아가고 있었다. 스토어에 올라간 건 4월 6일이다.
그 두 달 반 동안 내가 붙잡혀 있던 건 버그가 아니었다.
기술은 전부 통과였다
2월 초에 스토어 심사 체크리스트를 두 개 만들었다. iOS 하나, 안드로이드 하나.
| 항목 | 상태 |
|---|---|
| Target SDK 35 (Android 15) | PASS |
| Min SDK 24 | PASS |
| 64비트 arm64-v8a | PASS |
| App Bundle (.aab) | PASS |
| Privacy Manifest | 생성 완료 |
| Xcode 16.2 / Flutter 3.38.6 | 최신 대응 |
같은 문서에서 빨간불이 켜진 건 이런 것들이었다. DUNS 번호(발급에 최대 30일), 법인 증빙 서류, 사업자 명의 결제 프로필, 데이터 보안 섹션 선언.
문서 한 줄이 그때는 그냥 정보로 읽혔다.
구글 플레이의 심사 리젝 사유 중 80% 이상이 ‘정책 미준수’에서 발생합니다.
코드는 다 됐는데 남은 게 서류였다.
앱을 내려면 먼저 회사가 있어야 했다
개발 보름쯤 됐을 때 물어본 게 개인사업자로 개발자 계정을 만드는 절차였다. 앱을 스토어에 올리려면 나를 증명해야 하고, 그 증명이 사업자 등록에서 시작된다는 걸 그때 알았다.
거기서부터 요구 조건이 줄줄이 딸려 나왔다. 개발자 계정에 웹사이트 주소를 적으라고 한다. 없으면 등록이 안 된다. 그래서 랜딩 페이지를 만들었다. 앱 기능이 아니라 등록 칸을 채우려고 만든 페이지다. 만들고 나니 광고를 붙이려면 그 웹사이트에 app-ads.txt 라는 파일도 올려야 한다는 게 따라왔다.
스토어에 적는 연락처가 앱 정보에 그대로 공개된다는 것도 그 무렵 알았다. 내 번호가 스토어에 박히는 게 싫어서 20분 뒤엔 070 번호를 어떻게 개설하는지 찾고 있었다. 비즈니스 메일도 같이 알아봤고, 그달 말에 도메인을 샀다.
개인 번호 그대로 올리고 끝낼 수도 있었다. 그렇게 안 한 건 이걸 한 번 내고 말 앱으로 안 봤기 때문이다. 번호랑 메일이랑 도메인은 다음 앱에도 쓸 것들이다.
3월엔 플레이 콘솔 전화번호 인증 문자가 안 와서 며칠 막혔다. 앱은 다 만들어놨는데 문자 한 통을 못 받아서 멈춰 있었다.
두 달 치를 모아놓으면 사업자 등록, 웹사이트, app-ads.txt, 070 번호, 비즈니스 메일, 결제 프로필, 도메인, 전화 인증이다. 코드 얘기가 한 줄도 없다.
그게 커밋에 그대로 찍혀 있다. 2월에 일흔아홉 번 커밋한 사람이 3월엔 일곱 번 했다. 코딩을 쉰 게 아니라 코딩할 일이 없었다. 그 한 달을 서류에 썼다.
출시 당일에 출시하는 법을 물어봤다
구글플레이 첫 출시가 4월 6일이다. 그날 자정 가까운 시간에 나는 이걸 물어보고 있었다. 이 상태에서 어떻게 해야 앱을 출시할 수 있냐고.
다음 날 아침에 한 번 더 확인했다. 우리는 사업자 계정이니까 테스터가 없어도 되는 거 아니냐고.
맞다. 구글플레이는 개인 계정으로 앱을 내려면 테스터 20명이 14일 동안 비공개 테스트를 해야 한다. 사업자 계정은 그 요건이 없다. 2월에 개인사업자로 계정을 판 게 여기서 값을 했다.
앱스토어는 보름쯤 뒤에 나갔다. 같은 앱, 같은 빌드 시기인데 두 스토어가 15일 차이가 났다.
그 15일이 그냥 기다린 시간은 아니었다. 빌드를 올릴 때마다 검증에서 튕겼다.

세로 방향만 지원한다고 적어놨는데, 아이패드 멀티태스킹을 지원하려면 가로 두 방향까지 네 개를 다 선언해야 한다는 얘기다. 앱은 아무 문제 없이 돌아가고 있었다. 스토어가 요구하는 칸을 안 채웠을 뿐이다.
이런 걸 며칠 반복하다 어느 오후에 남긴 말이 “지긋지긋하다…” 였다.
그날 밤부터는 애플 개발자 계정을 개인 멤버십에서 조직 멤버십으로 바꾸는 일이 붙었다. 법인이 아니라 개인사업자라 자동 전환이 안 걸려서, 영문 메일을 써서 문의하는 걸로 갔다.
배포는 자동화했는데
5월 말에 fastlane을 붙였다. iOS랑 안드로이드 둘 다. 이틀 뒤엔 그걸 스킬로 만들어서 명령 한 줄이면 되게 했다.
이때는 배포 문제가 끝났다고 생각했다. 빌드하고 올리는 건 이제 자동이니까.
그리고 6월 초에 구글플레이 콘솔이 업로드를 거부했다.
안드로이드 14에서 바뀐 사진 접근 권한 정책이었다. READ_MEDIA_IMAGES 를 선언하면 왜 전체 접근이 필요한지 심사를 따로 받아야 한다. Days+는 이벤트 카드에 사진을 넣는 앱이고, 갤러리를 날짜별로 훑는 커스텀 피커까지 직접 만들어놨다. 그러려면 전체 접근이 필요하다.
선택지는 두 개였다. 심사를 받거나, 권한을 빼거나.
권한을 뺐다. 선택한 사진만 보이게 하고, 유저가 전체 접근을 허용하면 그때 날짜별 피커가 뜨는 하이브리드로 갔다. 심사 한 번을 피하려고 기능 하나를 접은 셈이다.
그 사이에 유저한테 메일이 왔다
그 무렵 백업 동기화가 안 된다는 제보가 메일로 왔다.
누적 다운로드가 두 자리인 앱에서 처음 온 메일이었다. 기뻤다. 상황별 대응 메시지를 정리하고, 고치고, 바로 스토어에 올렸다.
올리고 나서 알았다. 출시 때 숨겨뒀던 광고 제거 인앱결제 UI가 그 빌드에 딸려 나가 있었다.
그리고 같은 빌드에 안드로이드 권한 변경도 들어가 있었다. 테스트를 못 한 채로.
문제 있었다. 권한을 빼니까 사진 추가 버튼이 반응하지 않았다. 설정에서 권한을 전부 허용하고 돌아와도 마찬가지였다. 대체 경로로 뜨는 시스템 피커는 앱 디자인과 따로 놀았고, 거기서 사진을 골라 나오면 앱에는 아무것도 안 나타났다. 구글 포토에 사진이 많은 계정에서는 아예 목록이 비었다.
닷새 동안 고쳤다. 고칠수록 다른 데가 어긋났다.
결국 권한을 다시 넣고 콘솔에서 심사를 받는 쪽으로 돌아갔다. 피하려고 닷새를 쓰고 제자리로 왔다.
돌아간 이유가 기능 때문만은 아니었다. 권한을 빼면 대신 뜨는 게 안드로이드 기본 사진 선택 화면인데, 그게 Days+ 화면이랑 전혀 안 어울렸다. 색도 다르고 버튼 배치도 다르고 톤도 다르다. 날짜별로 사진을 훑는 피커를 직접 만들어둔 건 그래야 앱이랑 같은 얼굴이 되기 때문이었다.
심사 한 번 더 받는 게 낫다고 봤다. 이 앱에서 그건 양보가 안 되는 쪽이었다.
반년 걸려서 여기까지
요즘은 fastlane release 레인이 메타데이터 업로드랑 심사 제출까지 한다. 빌드부터 심사 제출까지 명령 하나고, 심사 상태는 한 시간마다 알아서 확인한다.
배포 파이프라인은 이제 꽤 좋다. 반년 걸렸다.
출시부터 지금까지 나를 실제로 붙잡은 것들 목록이다.
개인사업자 등록, 사업자 개발자 계정, 개발자 계정에 등록할 웹사이트, app-ads.txt 호스팅, 070 번호, 비즈니스 메일, 결제 프로필, 전화 인증 문자, 데이터 보안 섹션 선언, 개인정보처리방침 링크, 광고 ID 사용 선언, 안드로이드 14 사진 권한 심사, 애플 개인→조직 멤버십 전환, 심사 대기.
코드가 안 돌아서 막힌 건 하나도 없다. 크래시는 100% 없는 앱이다.
나는 이 앱을 만드는 데 필요한 기술은 다 알고 있었고, 출시하는 데 필요한 서류와 정책은 하나도 모르고 시작했다.