본문 바로가기

Android

[Android] 결제에서 Consume은 왜 필요할까?




안드로이드에서 인앱 결제를 구현하다 보면 반드시 마주치는 개념이 있는데요, 바로 consume입니다.

저는 처음 Conosume이라는 개념을 보았을 때 무엇을 소비한다는거지..? 하고 개념이 확 와닿지 않았는데요.

결제 과정에 대한 전체 흐름을 살펴보니 그제서야 조금씩 consume에 대한 개념이 이해가 되기 시작했습니다.

공식 문서에는 보통 이렇게 적혀 있습니다.

“소모성 상품은 consume 해야 다시 구매할 수 있다.”


https://developer.android.com/google/play/billing/integrate?utm_&hl=ko#consumable_products


하지만 실제로 개발을 해보면 이런 의문이 듭니다.

  • 왜 굳이 consume이라는 단계를 따로 둘까?
  • consume을 안 하면 정확히 뭐가 문제일까?
  • 이 개념은 구글 결제에만 있는 걸까?


이 글에서는 API 설명보다는 consume에 대한 개념 중심으로, 안드로이드 결제에서 consume이 왜 필요한지 정리해보려고 합니다.




💰결제 상품 분류


우선 결제에도 종류가 있는데요, 결제 상품을 먼저 알아야 consume의 개념을 이해할 수 있습니다.

결제 상품은 일반적으로 다음과 같이 세 가지 유형으로 분류됩니다.

1. 소모성 상품


소모성 상품은 사용 시 소모되며, 동일 상품을 여러 번 구매할 수 있는 특징을 가집니다.

대표적인 예로는 게임 내 코인, 재화, 아이템 등이 있습니다.

2. 비소모성 상품


비소모성 상품은 한 번 구매하면 영구적으로 사용할 수 있으며, 재구매가 불가능합니다.

광고 제거 기능이나 프리미엄 기능 해제와 같은 상품이 이에 해당합니다.

3. 구독 상품


마지막으로 구독 상품(Subscription)은 일정 기간 동안 이용 권한을 제공하는 상품입니다.

정해진 주기에 따라 자동 갱신되며, 구독이 유지되는 동안만 서비스를 이용할 수 있습니다.

유튜브 프리미엄, 월간 멤버십과 같은 서비스가 대표적인 예입니다.

이렇게 다양한 결제 상품 중에 소모성 상품만 consume 대상이 됩니다.




🧾 이 구매는 이미 사용되었는가?


결제 시스템에서 반드시 알아야 하는 질문이 하나 있는데요,

“이 구매는 이미 사용되었는가?”


입니다.

만약 이 질문에 대한 답이 없으면

  • 같은 아이템을 여러 번 지급할 수 있고
  • 결제 복구 시 중복 지급이 발생하며
  • 환불/CS 이슈가 생기게 됩니다.


consume은 바로 이 질문에 대한 플랫폼 차원의 답변입니다.


구매가 완료되면, 해당 Store는(ex. Google Play) 이렇게 생각합니다.

“결제는 됐지만, 구매가 실제로 앱에서 사용되었는지는 아직 모른다.”




Store에서 소모성 상품은 구매(purchase)소비(consume)가 명확히 구분됩니다.

사용자가 결제를 완료하면 Store는 해당 상품을 구매된 상태로 기록하지만, 이 시점에서는 아직 소비되지 않은(unconsumed) 상태로 유지됩니다.

즉, Store의 관점에서 consume되지 않은 구매는
“사용자가 결제는 했지만, 앱에서 아직 해당 상품을 사용하지 않은 상태”를 의미합니다.

이 상태에서는 Google Play가 해당 상품을 여전히 보유 중인 것으로 인식하기 때문에,

동일한 소모성 상품에 대해 추가 구매를 허용하지 않습니다.

그래서 구매 직후의 상태는 Purchased, 하지만 Consumed 상태가 아닙니다.



이 상태에서 앱이 해야 할 일은 두 가지입니다.

1. 아이템 지급
2. 지급이 완료되었음을 구글에 알림 → consume

사실상 위 의미를 다시 정리해보면 “이 구매는 정상적으로 사용되었고, 다시 구매 가능하게 해도 된다.” 입니다.

생각보다 단순하죠?!



즉, consume은

  • 아이템 지급 완료 선언
  • 구매 상태 종료 처리
  • 재구매 가능 상태 전환


을 한 번에 처리하는 행위인 것입니다.




🫢 만약 consume 처리를 안하게 된다면?


1️⃣ 같은 상품을 다시 구매할 수 없다

우선 첫 번째로 같은 상품을 다시 구매할 수 없습니다.

consume하지 않은 구매는 구글 플레이 입장에서 아직 사용되지 않은 구매입니다.

그래서 동일 상품 재구매 불가하고, 사용자는 “결제가 안 돼요”라고 느끼게 됩니다.


2️⃣ restore 시 중복 지급 위험

앱 재설치 후 `queryPurchases()`를 호출하면 consume되지 않은 구매는 다시 조회되고, 앱이 이걸 신규 구매로 착각 시 아이템을 한 번 더 지급하게 됩니다.

위 경우가 바로 결제 버그의 대표적인 원인입니다.

* restore는 “사용자가 이전에 결제했던 상품을 다시 사용할 수 있도록 복원하는 과정”입니다.

예를 들어, 앱 삭제 후 재설치를 하거나 새 기기에서 로그인 등의 경우가 있습니다. 앱은 Store에 직접 데이터를 저장해둔 게 없기 때문에 `queryPurchases()`를 호출해서 구매 이력을 다시 조회하고, 그 결과를 기반으로 아이템을 다시 지급하거나 기능을 활성화합니다.

3️⃣ 서버 연동 시 상태 불일치

서버에서는 이미 지급 완료인데, 구글은 “아직 사용 안 됨” 상태로 인식됩니다.

이 상태가 길어지면 CS 대응이 어려워지고, 환불/차단 정책 등이 꼬이게 됩니다.




🤔 Consume은 Google Play만 있는 개념일까?


consume이라는 용어는 대표적으로 Google Play Billing에서 사용되지만, 이 개념 자체가 Google Play에만 한정된 것은 아닙니다.

플랫폼마다 사용하는 용어나 구현 방식은 다르지만, 모든 결제 시스템은 공통적으로 구매의 상태를 관리합니다.

즉, 해당 결제가 아직 사용 가능한 상태인지, 이미 사용이 완료된 상태인지를 구분하는 것이 핵심입니다.

예를 들어 Apple의 In-App Purchase(IAP)에서도 상품은 소모성(Consumable), 비소모성(Non-Consumable), 구독(Subscription)으로 구분됩니다.

https://support.apple.com/en-us/102383



소모성 상품의 경우 개발자가 별도로 consume API를 호출하지는 않지만, 구매 완료 시점에 내부적으로는 동일한 개념의 상태 전환이 이루어집니다.

이처럼 형태와 구현 방식은 달라도, 각 결제 시스템이 던지는 질문은 동일합니다.

“이 결제는 이미 사용되었는가?”



Google Play는 이 질문에 대한 답을 consume API 호출 여부로 판단하고, consume되지 않은 구매는 언제든 다시 복구 대상이 될 수 있습니다.




📚 참고


https://developer.android.com/google/play/billing/integrate?utm&hl=ko

https://support.google.com/googleplay/android-developer/answer/14590082?hl=en

https://support.apple.com/en-us/102383