바이너리 등록 후 남은 것들: 자동화되는 일과 사람이 해야 하는 일
빌드가 끝나고 양쪽 스토어 콘솔에 바이너리가 올라갔습니다. 저는 그때 "이제 다 됐다"고 생각했습니다. 실제로는 거기서부터가 절반이었습니다.
남은 목록을 적어봤습니다
- 개인정보 처리 방침 주소
- 스크린샷
- 앱 설명, 부제, 키워드
- 콘텐츠 등급
- 데이터 수집 신고
- 심사 제출
여섯 개인데 성격이 제각각입니다. 어떤 건 명령 한 줄로 끝나고 어떤 건 아무리 해도 기계가 대신 못 합니다. 그 경계가 어디인지 몰라서 처음엔 전부 손으로 할 생각을 했습니다.
기계가 할 수 있는 것
오늘 실제로 API 로 처리한 것들이 있습니다.
앱 이름 바꾸기. 처음에 이름을 띄어쓰기 없이 등록했다가 고쳤는데, 양쪽 다 콘솔에 안 들어가고 API 로 했습니다. Apple 은 로케일별 앱 정보를 수정하는 요청 하나, Google 은 편집 세션을 열고 등록정보를 고친 뒤 커밋하는 세 단계였습니다. 둘 다 200 이 떨어졌습니다.
식별자 등록. Apple 쪽 Bundle ID 는 API 로 만들어집니다. 201 이 돌아왔습니다.
빌드 상태 확인. 업로드한 바이너리가 처리됐는지, 어느 트랙에 들어갔는지 전부 조회됩니다. TestFlight 목록이 비어 보일 때 이걸로 확인했더니 "처리 중"이라 안 보이는 것이었습니다.
여기에 더해 스토어에 들어가는 글과 스크린샷도 API 가 있습니다. 설명, 부제, 키워드, 이미지 업로드까지 자동화할 수 있습니다. 심사 제출 자체도 Apple 은 API 를 제공합니다.
기계가 못 하는 것
반대로 오늘 확실하게 막힌 것들이 있습니다.
앱 레코드 만들기. Apple 은 이렇게 거절합니다.
{
"code": "FORBIDDEN_ERROR",
"detail": "The resource 'apps' does not allow 'CREATE'.
Allowed operations are: GET_COLLECTION, GET_INSTANCE, UPDATE"
}권한이 부족한 줄 알고 역할을 관리자까지 올려 키를 새로 만들어 봤지만 같은 답이었습니다. 세 번 만들어 보고 나서야 권한 문제가 아니라는 걸 알았습니다. Google 은 더 단순합니다. 그런 엔드포인트가 아예 없습니다.
자격증명 처음 등록하기. 비대화형으로 제출을 시도하면 여기서 멈춥니다.
App Store Connect API Keys cannot be set up in --non-interactive mode.키를 환경 변수로 넘겨 봐도 같은 자리에서 막혔습니다. 그때그때 값을 건네는 구조가 아니라 한 번 등록해 두는 구조이고, 그 등록이 대화형이기 때문입니다.
설문 형태의 신고들. 콘텐츠 등급, 데이터 수집 신고 같은 것들은 제가 확인한 범위에서는 콘솔에서만 됩니다.
경계가 기술이 아니었습니다
처음에는 "API 가 아직 안 만들어진 것"이라고 생각했습니다. 앱 만들기 정도는 당연히 자동화될 줄 알았거든요. 목록이 있으니 만들기도 있겠지 싶었습니다.
그런데 막힌 자리를 모아 놓고 보니 공통점이 보였습니다. 전부 누군가 책임지고 선언해야 하는 일이었습니다.
- 이 앱을 내가 만든다 (앱 레코드)
- 이 키를 내가 발급받는다 (자격증명)
- 이 앱은 데이터를 수집하지 않는다 (수집 신고)
- 이 앱은 몇 세 이상에게 적합하다 (등급)
반대로 자동화되는 것들은 성격이 다릅니다. 이름을 고치고, 스크린샷을 올리고, 상태를 조회하는 일은 이미 한 선언 안에서 내용을 채우는 작업입니다. 새로 책임질 게 없습니다.
2단계 인증이 벽처럼 느껴졌는데, 그것도 같은 얘기였습니다. 선언의 주체가 사람인지 확인하는 장치입니다. 기계가 못 넘는 게 아니라 넘으면 안 되는 자리입니다.
정리하면
| 남은 일 | 자동화 | 왜 |
|---|---|---|
| 앱 설명, 부제, 키워드 | 가능 | 내용 채우기 |
| 스크린샷 | 가능 | 내용 채우기 |
| 버전 만들고 빌드 연결 | 가능 | 내용 채우기 |
| 심사 제출 | Apple 은 가능 | 이미 한 선언의 실행 |
| 개인정보 처리 방침 | 페이지 만들기는 가능 | 내용은 사람이 씀 |
| 콘텐츠 등급 설문 | 불가 | 새 선언 |
| 데이터 수집 신고 | 불가 | 새 선언 |
| 앱 레코드 생성 | 불가 | 새 선언 |
그래서 순서가 정해집니다
이 구분을 알고 나니 남은 일의 순서가 자연스럽게 잡혔습니다.
사람이 해야 하는 것을 먼저 합니다. 등급 설문과 수집 신고를 채워야 나머지가 열립니다. Google 은 이것들이 안 끝나면 프로덕션 승격 버튼 자체가 잠겨 있습니다.
그다음 기계가 할 수 있는 것을 몰아서 합니다. 설명과 스크린샷은 한 번 규격을 맞춰 두면 다음 버전부터 반복이라, 여기서 자동화가 값을 합니다.
처음부터 전부 콘솔에서 손으로 하려던 계획을 접은 이유가 이것입니다. 손으로 해야 하는 건 생각보다 적고, 대신 그것들은 정말로 손으로만 됩니다.
메타데이터를 채우고 다시 세어 봤습니다
글을 쓴 뒤 실제로 API 로 채울 수 있는 것을 다 채우고, 남은 것을 다시 조회해 봤습니다. 추측이 아니라 스토어가 지금 무엇을 비어 있다고 보는지 확인한 값입니다.
App Store
이름, 부제, 설명, 키워드, 카테고리, 저작권, 지원 주소, 개인정보 처리 방침 주소까지 전부 API 로 들어갔습니다. 빌드도 버전에 자동으로 붙어 있었고 심사용 연락처도 채워져 있었습니다.
| 남은 것 | 누가 |
|---|---|
| 스크린샷 (0장) | 기계 |
| 연령 등급 설문 | 사람 |
| 앱 프라이버시 설문 | 사람 |
Google Play
제목, 짧은 설명, 전체 설명, 연락처가 들어갔습니다.
| 남은 것 | 누가 |
|---|---|
| 스크린샷 (0장, 최소 2장) | 기계 |
| 아이콘 512×512 (0장) | 기계 |
| 피처 그래픽 1024×500 (0장) | 기계 |
| 개인정보 처리 방침 주소 | 사람 (쓰기 API 가 없음) |
| 콘텐츠 등급 설문 | 사람 |
| 데이터 보안 양식 | 사람 |
| 타깃 사용자층, 광고 여부, 앱 접근 권한 | 사람 |
예상한 자리에서 정확히 갈렸습니다
앞에서 "새로 선언해야 하는 것은 기계가 못 한다"고 썼는데, 남은 목록이 그 선을 따라 그대로 갈렸습니다. 기계 쪽에 남은 건 전부 이미지이고, 사람 쪽에 남은 건 전부 설문입니다.
그중 하나는 예외처럼 보입니다. Play 의 개인정보 처리 방침 주소는 설문이 아니라 그냥 문자열인데도 쓰기 API 가 없습니다. Apple 은 같은 값을 API 로 넣을 수 있었습니다. 같은 성격의 데이터를 한쪽은 열어 두고 한쪽은 막아 둔 셈이라, 이건 원칙이라기보다 각 회사가 그은 선으로 보입니다.
이미지는 "재료가 없던 것"에서 "만들면 되는 것"으로
앞에서 자동화를 세 갈래로 나누면서, 스크린샷을 "API 는 있는데 재료가 없어서 못 넣은 것"에 두었습니다. 지금 보니 그 칸은 머무는 자리가 아니라 지나가는 자리였습니다. 앱을 켜서 찍으면 곧바로 "기계가 넣는 것"으로 옮겨 갑니다.
정말로 사람에게 남는 건 설문뿐입니다. 그 앱이 몇 세에게 적합한지, 어떤 데이터를 다루는지는 앱을 실행해도 알 수 없고 만든 사람이 답해야 합니다.
오늘 어디까지
바이너리는 양쪽 다 올라갔고 심사 전입니다. Apple 은 처리가 끝나 TestFlight 에 나타났고, Google 은 내부 테스트 트랙에 들어갔습니다.
아직 제출은 못 합니다. 이미지가 비어 있고 설문이 남아 있어 두 스토어 모두 제출 버튼이 열리지 않습니다. 이미지는 만들면 되고, 설문은 앉아서 답해야 합니다.
함께 읽기
- 스토어 메타데이터 API 정리: 항목별로 되는 것과 안 되는 것앱 설명과 키워드를 채우면서 두 스토어의 API 를 항목별로 다 두드려 봤습니다. 콘솔에 들어가지 않고 어디까지 갈 수 있는지 궁금했거든요.
- Expo 앱 스토어 배포 준비 체크리스트: 순서가 중요한 이유새 Expo 앱 하나를 두 스토어에 올릴 준비를 했습니다. 필요한 항목 자체는 검색하면 다 나옵니다. 그런데 정작 저를 막은 건 항목이 아니라 순서였습니다. 앞 단계가 끝나야 뒤 단계의 값이 생기는 구간이 몇 군데 있고, 그걸 모르고 덤비면 "왜 이 필드가 비어 있지"에서 멈춥니다.
- App Store Connect와 Google Play API 비교: 인증·권한·한계앱 하나를 두 스토어에 등록하면서 양쪽 API를 같은 날 연달아 만졌습니다. 목적이 똑같았기 때문에 차이가 잘 보였습니다. 인증 방식부터 다르고, 권한을 다루는 사고방식이 다르고, 심지어 "안 되는 걸 알려주는 방식"까지 달랐습니다.
- RN 앱 두 번째 배포: 재사용되는 인증서, 새로 해야 하는 등록몇 주 전에 만든 고객 포털 앱을 반쯤 복사해서 새 RN 앱을 하나 더 만들었습니다. 성경 속 여정을 지도에 그리는 화면 하나를 웹에서 옮겨온 것뿐인데, 옮기고 나니 "인증서까지 그대로 가져다 쓸 수 있나"가 궁금해졌습니다. 결론부터 적으면 절반만 맞았습니다.
- 빌드 우회 셋 정리: 어디까지가 내가 고칠 수 있는 문제인가앱 하나를 두 스토어에 올리는 동안 빌드가 여러 번 깨졌고, 그때마다 우회를 하나씩 넣었습니다. 다 끝나고 저장소를 보니 임시방편이 셋 쌓여 있었습니다.