사례 4 — App Store 심사 자동화와 서명 지옥
문제
3개 앱의 심사 제출이 웹 콘솔 수동 작업이었다 — 느리고, 기록이 안 남고, 반복될수록 실수가 쌓였다.
해결
ASC(iris) API 직접 호출로 제출 자동화 + GitHub Actions 서명 업로드 파이프라인.
결과
제출 전문 9,100줄이 증거로 남고, 서명 실패 3단계를 커밋으로 극복 — 재제출이 절차가 아닌 명령이 됐다.
배경과 시기GitHub에서 피드백 남기기
- Moon Whisper · 내일이없다면 · 내 인생그래프 — 3개 앱을 연달아 심사에 올려야 했다.
- 웹 콘솔 수동 제출: 앱당 수십 분, 스크린샷·메타데이터 실수 위험, 이력 추적 불가.
방향이 바뀐 순간GitHub에서 피드백 남기기
- 심사 제출은 "이벤트"가 아니라 상태 전이다: PREPARE → SUBMIT → IN_REVIEW → REJECT/ACCEPT. 상태 전이를 API로 다룰 수 있다면, 거절 이력도 데이터가 된다.
- 이 관점 전환 후: 제출 기록을 JSON으로 남기는 것이 원칙이 됐고, 그 기록이 다음 심사의 지도가 됐다.
목표GitHub에서 피드백 남기기
- 3개 앱 심사 제출을 명령 하나로
- 모든 제출의 요청·응답을 증거로 보존
- 거절→수정→재제출 주기 단축
결정한 것과 버린 것GitHub에서 피드백 남기기
-
FastlaneASC(iris) API 직접 호출
직접 호출 선택
직접 호출 선택. 이유: 제출 전문(요청·응답)을 통째로 증거로 남기고 싶었고, 2FA/세션 이슈 없이 상태 전이를 정밀 제어하고 싶었다.
-
서명 자동 프로필수동 signing
자동 시도 → 실패 → 수동 → identity 정렬 (3단계, 아래 Failure).
-
로컬 업로드GitHub Actions
Actions 선택
Actions 선택. 이유: 서명 자료를 로컬에 두지 않고 파이프라인에서 처리.
만든 것GitHub에서 피드백 남기기
- ASC iris API 직접 호출 스크립트 — 심사 제출 · 상태 조회 · 재제출
- 제출 전문 보존 체계 (
asc_official_api.json9,100줄 + after_submit + summary) - GitHub Actions 서명 업로드 (
feat(apps): enable signed mobile store uploads) - 거절 사유별 대응 기록 (ios_review_recovery 폴더 — 스크린샷·결과 JSON 포함)
지표 — 전과 후GitHub에서 피드백 남기기
-
제출 방식
웹 콘솔 수동iris API 자동자동화
asc_official_api.json (9,100줄)
-
대상 앱
13+2
같은 파일 (moon_whisper · my_life_graph · if_tomorrow_never_comes)
-
서명 파이프라인
수동 로컬GitHub Actions자동화
커밋
enable signed mobile store uploads -
빌드 상태
AAB 실패JVM 타깃 11 수정으로 복구복구
커밋 2026-08-19 (refs #410)
-
거절 이력 관리
흩어짐폴더 체계(스크린샷·JSON)체계화
ios_review_recovery_2026_07_06/
-
다운로드·매출
—NOT_VERIFIED (비공개)정책
실패한 가설과 대응GitHub에서 피드백 남기기
가설: “자동 서명 프로필이면 끝”
→ 업로드 거부. (
allow automatic store profile selection)가설: “수동 signing이면 끝”
→ identity 불일치 재발. (
use manual distribution signing in release)가설: “identity만 정렬하면 끝”
→ AAB 빌드 자체가 실패. 원인은 플러그인 모듈 JVM 타깃 —
JVM 타깃을 11로 맞춰 AAB 빌드를 되살린다 (refs #410)로 종결.
- 교훈: iOS 배포 실패는 단일 원인이 아니라 연쇄다. 각 단계를 커밋으로 분리해 둬서, 다음 앱(내일이없다면)에서 같은 연쇄를 30분 만에 통과했다.
면접용 2분 답변GitHub에서 피드백 남기기
상황
“3개 앱을 연달아 심사에 올려야 했는데, 웹 콘솔 수동 제출로는 이력도 남지 않고 실수가 쌓였습니다.”
과제
“제출을 재현 가능한 명령으로 만들고, 서명·빌드 실패까지 파이프라인으로 처리하는 게 목표였습니다.”
행동
“Fastlane 대신 ASC API를 직접 호출해 제출 전문을 통째로 증거로 남겼고, 서명은 자동→수동→정렬 세 단계의 실패를 커밋으로 분리하며 좁혔습니다. 업로드는 GitHub Actions로 옮겼습니다.”
결과
“9,100줄의 제출 기록이 남았고, 3개 앱 제출이 명령 하나가 됐습니다. 다음 앱의 서명 문제는 같은 연쇄를 30분 만에 해결했습니다.”
증거GitHub에서 피드백 남기기
| 주장 | 증거 |
|---|---|
| API 자동화 | asc_official_api.json (9,100줄) |
| 3앱 대상 | asc_summary_after_submit.json (3앱 상태 기록) |
| 서명 3단 | 커밋 연쇄 2026-08-19 (refs #410) |
| Actions | 커밋 enable signed mobile store uploads |
| 거절 대응 체계 | ios_review_recovery_2026_07_06/ (스크린샷·결과 JSON) |
다음으로GitHub에서 피드백 남기기
- 상태 전이 관점: 심사는 이벤트가 아니라 상태 머신이다
- 실패의 연쇄를 커밋으로 분리하면 다음 실패는 30분으로 줄어든다
이후 이어진 이야기GitHub에서 피드백 남기기
- 출시된 앱의 전체 이야기: case-1-from-hwp-to-appstore