Play 콘솔을 클릭하던 일을 API로 옮겼습니다 — 로케일 121곳과 출시 한 줄
스토어 등록정보의 동영상은 언어별 필드입니다. 앱마다 로케일 수가 2개·17개·29개로 다르고, 콘솔 웹으로는 언어당 12~15초씩 걸리는데 한국어 칸은 조용히 저장 실패하기도 했습니다. 서비스 계정 권한 두 개를 더해 Play Developer API로 옮기니 앱당 수 초가 됐고, AAB 업로드와 출시까지 한 줄이 됐습니다
앱 22종에 유튜브 Shorts를 붙이고 나서 이상한 걸 발견했습니다. 한국 사용자에게는 영상이 보이지 않았습니다.
원인은 단순했습니다. Play 스토어 등록정보의 동영상 URL은 언어별 필드입니다. en-US에 넣어도 ko-KR에 넣지 않으면 한국어로 보는 사용자에게는 빈칸입니다. 그리고 앱마다 등록된 로케일 수가 달랐습니다.
| 앱 | 로케일 수 |
|---|---|
| 미니게임 22종 | 2개 (en-US, ko-KR) |
| 타로 2종·몬스터 2종·사주로또 | 29개 |
| 주스 스피너·병 돌리기 | 17개 |
29개 로케일 앱 다섯 개에 동영상을 채우려면 145칸입니다. 그걸 콘솔 웹에서 드롭다운으로 언어를 바꿔가며 하나씩 저장해야 합니다.
브라우저 자동화의 현실
처음에는 콘솔 웹을 자동화했습니다. 화면 하나당 12~15초입니다. 언어 드롭다운을 열고, 항목을 찾고, 필드를 채우고, 저장하고, 다음 언어로. 121칸을 채우는 데 30분이 넘게 걸렸고 중간에 여러 번 실패했습니다.
더 나쁜 건 실패하는 방식이었습니다. 셀렉터가 바뀌거나 드롭다운 토글이 어긋나면 저장이 안 됐는데도 화면은 넘어갑니다. 그래서 “변경사항 1건”으로 표시되면 그건 성공이 아니라 한국어 칸 저장이 조용히 실패한 신호였습니다. 정상이면 2건이어야 하니까요. 이걸 알아채는 데 시간이 걸렸습니다.
이미 열려 있던 문
며칠 전에 후기를 모으려고 Play Developer API용 서비스 계정을 만들어 뒀습니다. 그때는 읽기 전용 권한만 줬습니다 — 앱 정보 보기, 앱 품질 정보 보기, 리뷰에 답하기.
등록정보를 쓰려면 권한이 하나 더 필요했습니다. 콘솔의 사용자 및 권한 → 계정 권한 탭 → 앱 정보 → ‘앱 정보 관리’ 입니다.
⚠️ 이 권한을 켤 때는 알고 켜야 합니다. 이름은 ‘앱 정보’인데 실제 범위는 가격·인앱 상품·콘텐츠 등급·프로모션 수정까지 포함합니다. 그래서 키 파일을 어디 두는지가 중요해집니다. 제 키는 저장소가 아닌 폴더에 있고, 그 폴더는 의도적으로 git 저장소가 아닙니다. 도구만 게임 저장소에서 버전 관리하고 키는 환경변수로 경로를 넘깁니다.
권한을 켜고 나니 앱당 수 초가 됐습니다. 로케일 29개를 채우는 게 한 번의 호출 묶음입니다.
결과
- 121곳 전수 채움 — 병 돌리기·주스 스피너·타로 운세·한글 몬스터·운세 타로핑
- 수학 몬스터 27곳 추가
- 운세 타로핑은 애초에 영상이 없어서 새로 촬영했습니다
작업하다 뜻밖의 것도 정리됐습니다. 주스 스피너와 병 돌리기는 로케일이 17개뿐이었습니다 — 번역이 17개 언어만 있었기 때문입니다. 이왕 API로 건드리는 중이니 빠진 12개 언어(체코·덴마크·핀란드·헝가리·히브리·네덜란드·노르웨이·루마니아·러시아·슬로바키아·스웨덴·우크라이나)의 제목과 설명을 새로 써서 추가했습니다. 두 앱 모두 29/29가 됐습니다.
콘솔 웹으로 했다면 12개 언어 × 2개 앱 = 24개 화면을 드롭다운으로 오가며 채워야 했을 일입니다. JSON 하나에 적고 한 번 돌렸습니다.
출시까지 한 줄
여기서 멈추지 않고 ‘프로덕션으로 출시’ 권한도 추가했습니다. 그러면 AAB 업로드부터 검토 제출까지 API로 됩니다.
1
py play.py release <패키지> <AAB> --notes notes.txt
이 한 줄이 업로드 → 트랙 릴리스 생성 → 출시노트 등록 → 커밋(검토 제출)까지 합니다. 그전에는 앱마다 콘솔에서 7단계를 좌표 클릭으로 밟아야 했고, 그 절차를 적어 둔 인계 문서까지 있었습니다. 그 문서는 이제 신규 앱 첫 등록에만 필요합니다.
API로 되는 것과 안 되는 것
전부 되는 건 아닙니다. 경계를 알아 두는 게 시간을 아낍니다.
| API로 되는 것 | 콘솔 웹이 필요한 것 |
|---|---|
| AAB 업로드·프로덕션 출시·출시노트 | 콘텐츠 등급·데이터 보안·타겟층 선언 |
| 등록정보 텍스트·동영상(전 로케일) | 앱 신규 생성 |
| 로케일 추가·삭제 | 스토어 설정(카테고리·연락처) |
| 스크린샷·아이콘·피처그래픽 업로드 | 정책 상태·이의제기 |
| 트랙·버전·국가 조회, 리뷰 조회·답글 | 앱인토스(토스) 관련 전부 |
정리하면 콘텐츠 선언과 앱 생성은 콘솔, 반복 작업은 API입니다. 그래서 규칙을 하나 세웠습니다 — 콘솔을 열기 전에 API로 되는지 먼저 확인할 것. 자동화 우선순위 0번으로 스킬에 적어 뒀습니다.
함정들
편집 세션이 겹치면 죽습니다. API 작업은 편집(edit)을 만들고 커밋하는 구조인데, 콘솔 탭에서 같은 앱을 열어 두면 This Edit has been deleted.가 납니다. 자동화 탭을 다른 페이지로 보내고 다시 돌리면 됩니다.
트랙 상태 completed는 심사 상태가 아닙니다. 롤아웃 비율 기준입니다. AAB가 검토 중인지는 콘솔 화면의 ‘검토 중’ 문구로만 알 수 있습니다. 그리고 검토 중인 앱에 커밋하면 검토가 처음부터 다시 시작됩니다 — 수학 몬스터는 그래서 한국어 칸만 저장하고 제출을 보류했습니다.
동영상만 바꿀 때도 제목·짧은 설명·전체 설명을 함께 보내야 합니다. 등록정보 갱신은 필드 단위가 아니라 로케일 단위 덮어쓰기입니다. 안 보내면 지워집니다. 글자 수 제한도 있습니다 — 제목 30자, 짧은 설명 80자, 전체 설명 4000자.
출시는 진짜 출시입니다. release를 돌리면 versionCode가 소모되고 검토에 들어갑니다. 같은 versionCode는 두 번 올릴 수 없습니다. 그래서 먼저 --dry로 확인합니다. 뱀게임으로 실제 그렇게 검증했습니다.
등록정보만 고치는 변경도 제출 전에 프로덕션이 ‘활성’인지 확인해야 합니다. 이건 실제로 겪고 배운 것입니다.
남은 생각
브라우저 자동화를 먼저 떠올리는 게 습관이 되어 있었습니다. 화면이 있으니 화면을 조작한 것이고, 실제로 동작하기는 했습니다. 그런데 같은 일에 30분과 수 초의 차이가 났습니다. 공개 API가 있는지 확인하는 데 든 시간은 10분이 안 됩니다.
조용히 실패하는 자동화가 가장 비쌉니다. 콘솔 자동화는 저장이 안 돼도 화면이 넘어갔습니다. “변경 1건”이라는 숫자를 의심하기 전까지 저는 다 된 줄 알고 있었습니다. API는 실패하면 예외가 납니다 — 그 차이가 속도보다 큽니다.
권한은 필요한 만큼만, 그리고 범위를 알고 켜야 합니다. ‘앱 정보 관리’는 이름보다 넓습니다. 읽기 전용으로 시작해서 필요할 때 하나씩 늘렸고, 키 파일은 저장소 밖에 두었습니다.
앱은 Google Play와 앱인토스에서 받을 수 있고, 브라우저에서 바로 해볼 수도 있습니다. 소식은 이 블로그와 인스타그램(@fadongkwon.soft) (새 창에서 열림)에서 전해드립니다.
