안드로이드 앱의 수익화(인앱 결제, 정기 구독)를 구현하려면 단순히 SDK만 붙이는 것이 아니라, 결제의 신뢰성과 실시간성을 보장하기 위한 환경 설정이 선행되어야 한다. 이 글에서는 백엔드와 프론트엔드 개발자가 로직 구현에만 집중할 수 있도록, Google Play Console, Google Cloud Platform(GCP), Pub/Sub 설정을 단계별로 정리한다.
전체 구조도
설정을 시작하기 전, 구축해야 할 흐름은 다음과 같다.
- GCP Service Account: 백엔드 서버가 구글 API(영수증 검증)를 호출할 수 있는 권한을 가진다.
- Google Play Console: 앱과 결제 상품을 관리하고, GCP 프로젝트와 연결된다.
- Cloud Pub/Sub: 구글 결제 시스템에서 발생하는 이벤트(구독 갱신, 취소 등)를 우리 서버(Webhook)로 실시간 전송한다.
Step 1. GCP 프로젝트 생성 및 API 활성화
가장 먼저 구글 클라우드 플랫폼(GCP)에서 결제 관련 API를 사용할 준비를 해야 한다.
- Google Cloud Console 접속 및 새 프로젝트를 생성한다 (이미 있다면 해당 프로젝트 선택).
- 좌측 메뉴 [API 및 서비스] > [라이브러리]로 이동한다.
- 검색창에
Google Play Android Developer API를 검색한다. - [사용(Enable)] 버튼을 클릭한다.
- Note: 이 API가 활성화되어야 백엔드 서버에서 영수증 검증 요청을 보낼 수 있다.
Step 2. 서비스 계정(Service Account) 생성 및 키 발급
백엔드 서버가 구글 플레이에 접근할 수 있는 '출입증(JSON Key)'을 만드는 과정이다.
- GCP Console 좌측 메뉴 [IAM 및 관리] > [서비스 계정]으로 이동한다.
- [+ 서비스 계정 만들기]를 클릭한다.
- 서비스 계정 이름: 식별하기 쉬운 이름을 입력한다 (예:
google-play-billing-server). - 액세스 권한: 현재 단계에서는 비워두거나 '소유자(Owner)' 혹은 '뷰어(Viewer)'로 설정한다 (실제 권한은 Play Console에서 부여함).
- 서비스 계정 이름: 식별하기 쉬운 이름을 입력한다 (예:
- 생성된 서비스 계정을 클릭하고 [키(Keys)] 탭으로 이동한다.
- [키 추가] > [새 키 만들기] > JSON을 선택 후 [만들기]를 누른다.
- ★중요: 다운로드된
.json파일을 백엔드 개발자에게 전달한다. (이 파일이 있어야 서버 인증이 가능하다.)
Step 3. Google Play Console에 서비스 계정 연결
이제 방금 만든 'GCP 서비스 계정'을 'Google Play Console'의 관리자로 초대하여 권한을 위임해야 한다.
- Google Play Console에 접속한다.
- 좌측 메뉴 [사용자 및 권한]으로 이동한다.
- [새 사용자 초대]를 클릭한다.
- 이메일 주소: Step 2에서 생성한 서비스 계정의 이메일 주소를 입력한다 (예:
...iam.gserviceaccount.com). - 권한 설정 (앱 권한):
- 대상 앱을 선택하고 [적용]한다.
- [금융 데이터 보기] 및 [주문 관리] 권한을 필수로 체크한다. (이 권한이 없으면 영수증 검증 시 401/403 에러가 발생한다.)
- [사용자 초대]를 클릭하여 완료한다.
Step 4. 실시간 알림(RTDN)을 위한 Pub/Sub 주제(Topic) 생성
구독 갱신, 취소, 환불 등의 이벤트가 발생했을 때 구글이 메시지를 보낼 '채널'을 만든다.
- GCP Console로 돌아가서 검색창에
Pub/Sub검색 > [주제(Topics)]로 이동한다. - [주제 만들기]를 클릭한다.
- 주제 ID:
play-billing-topic등 식별 가능한 이름을 입력 후 [만들기]를 누른다. - 권한 부여 (가장 많이 실수하는 부분!):
- 생성된 주제 이름을 클릭 > 우측 정보 패널(없으면 '정보 패널 표시' 클릭)을 확인한다.
- [주체 추가]를 클릭한다.
- 새 주체:
google-play-developer-notifications@system.gserviceaccount.com- Tip: 이 이메일은 구글 플레이 시스템 계정이다. 이 계정이 우리 주제에 메시지를 '게시(Publish)'할 수 있어야 한다.
- 역할: [Pub/Sub 게시자 (Pub/Sub Publisher)]를 선택한다.
- [저장]한다.
Step 5. Pub/Sub 구독(Subscription) 및 Webhook 설정
주제(Topic)로 들어온 메시지를 우리 서버의 특정 URL(Webhook)로 쏘아주도록 설정한다.
- Pub/Sub 화면 좌측 [구독(Subscriptions)]으로 이동한다.
- [구독 만들기]를 클릭한다.
- 구독 ID:
play-billing-sub등을 입력한다. - Cloud Pub/Sub 주제: Step 4에서 만든 주제를 선택한다.
- 전송 유형: [밀어넣기(Push)]를 선택한다.
- 엔드포인트 URL: 백엔드 개발자가 만든 Webhook URL을 입력한다 (예:
https://api.myapp.com/v1/webhooks/google-play).- Note: 반드시 SSL(https)이 적용된 도메인이어야 한다.
- 기타 설정(재시도 정책 등)은 기본값을 유지하고 [만들기]를 누른다.
Step 6. Play Console과 Pub/Sub 최종 연결
이제 모든 준비가 끝났다. Play Console에게 "결제 이벤트가 생기면 저 Topic으로 보내줘"라고 설정한다.
- [Google Play Console] 접속 > 해당 앱을 선택한다.
- 좌측 메뉴 [수익 창출(Monetization)] > [수익 창출 설정(Monetization setup)]으로 이동한다.
- 실시간 개발자 알림(Real-time developer notifications) 섹션을 찾는다.
- 주제 이름: Step 4에서 생성한 전체 주제 이름을 입력한다.
- 형식:
projects/{프로젝트ID}/topics/{주제ID}
- 형식:
- [테스트 알림 보내기] 버튼을 클릭한다.
- 성공 시: "테스트 알림을 전송했습니다" 메시지가 출력된다. → 백엔드 로그를 확인한다.
- 실패 시: Step 4의 권한 설정(google-play-developer-notifications...)을 다시 확인해야 한다.
- [변경사항 저장]을 클릭한다.
Step 7. 인앱 상품/구독 상품 등록
코드로 상품 ID를 호출하기 위해선 콘솔에 상품이 등록되어 있어야 한다.
- [Google Play Console] > [수익 창출] > [제품] > [인앱 상품] 또는 [구독]으로 이동한다.
- [상품 만들기]를 클릭한다.
- 제품 ID: 코드에서 사용할 고유 ID를 입력한다 (예:
com.sample.app.premium.monthly). 한 번 만들면 수정 불가능하니 신중히 결정해야 한다. - 가격 및 세부 정보를 입력 후 [활성화] 상태로 변경한다.
셋팅 체크리스트
도입 전 마지막으로 확인해 본다.
- GCP: Google Play Android Developer API가 활성화되었는가?
- GCP: 서비스 계정(JSON) 키를 발급받아 백엔드에 전달했는가?
- Console: 서비스 계정을 사용자로 초대하고 '금융 데이터 보기' 권한을 주었는가?
- Pub/Sub:
google-play-developer-notifications@...계정에 '게시자' 권한을 주었는가? - Console: 수익 창출 설정에서 Topic을 연결하고 테스트 알림이 성공했는가?
- Console: 인앱 상품(Product ID)이 생성되고 '활성화' 상태인가?
마치며
이 과정을 통해 "앱에서 결제 발생 → 구글 서버가 감지 → Pub/Sub으로 메시지 발행 → 백엔드 Webhook 수신 → 서비스 계정으로 영수증 검증 → 아이템 지급"의 안전한 파이프라인이 구축되었다.
