> ## Documentation Index
> Fetch the complete documentation index at: https://devdocs.xbox.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Economy(레거시)에서의 스토어 및 세일

> 카탈로그에서 PlayFab 레거시 Economy 스토어를 구축하고 선택한 아이템에 대해 사용자 지정 가상 화폐 또는 실제 통화 가격 책정으로 시간이 지정된 세일을 운영합니다.

# 스토어 및 세일(레거시 Economy)

<Info>
  Economy v1 API는 유지 관리 모드에 있으며 새 기능은 제공되지 않고 버그 수정만 이루어집니다. **v1 API는 예측 가능한 미래 동안 유지됩니다.** 다음 버전의 PlayFab Economy에 대해 자세히 알아보려면 [Economy v2 개요](/services/playfab/economy-monetization/economy-v2/overview)를 참조하세요!
</Info>

PlayFab에서 **스토어**는 [카탈로그](/services/playfab/economy-monetization/economy/items/catalogs)와 [화폐](/services/playfab/economy-monetization/economy/tutorials/currencies)를 기반으로 구축됩니다. 기본 카탈로그는 게임의 모든 아이템을 정의하고 만든 화폐로 가격을 할당해야 합니다.

스토어는 카탈로그의 아이템 하위 집합을 정의하고 카탈로그 가격과 다를 수 있는 특정 가격으로 구매할 수 있도록 해야 합니다.

스토어를 사용하면 특정 아이템 세트를 선별하고 정해진 기간 동안 특정 가격으로 사용할 수 있게 할 수 있습니다.

이 튜토리얼은 가상 화폐 및 실제 통화를 기반으로 스토어를 정의하는 모범 사례를 설명합니다.

## 요구 사항

* PlayFab [Game Manager](/services/playfab/live-service-management/gamemanager/quickstart)에 대한 이해.
* 하나 이상의 [가상 화폐](/services/playfab/economy-monetization/economy/tutorials/currencies)를 정의해야 합니다. 이 튜토리얼의 후자 예제에서는 다음을 사용합니다.
  * **SP** (**Silver Pieces**)
  * **GP** (**Gold Pieces**).
* 하나 이상의 아이템이 정의된 \_기본 카탈로그\_가 있어야 합니다.
  * 첫 번째 예제는 [드롭 테이블](/services/playfab/economy-monetization/economy/tutorials/drop-tables) 튜토리얼에 설명된 것과 유사한 여러 아이템/번들을 사용합니다.
  * 이 튜토리얼의 두 번째 예제에서는 소, 중, 대 체력 물약을 사용합니다.

### 모범 사례

카탈로그 가격은 장기적으로 고정되어야 합니다. 아이템의 *실제* 가격을 정의합니다.

스토어는 LiveOps 전략에 따라 추가되고 제거되어 \_일시적\_이어야 합니다.

<Note>
  스토어를 순환하고 활성 스토어의 아이템을 교체하여 대부분의 수익을 얻을 것으로 예상하세요.
</Note>

## 스토어 및 카탈로그 가격 책정에 대한 일반 정보

* **가격 책정**: 카탈로그에 정의된 가격은 아이템의 *정규* 가격으로 정의되어야 합니다. 스토어를 사용하면 일반적인 소매 전술을 활용해 아이템에 대한 일시적인 할인 가격을 정의할 수 있습니다. 또는 스토어에서 일반적으로 판매되지 않는 아이템에 대한 일시적인 가격을 제공할 수 있습니다.
* **제로 비용**: 카탈로그와 스토어 모두 특정 화폐로 아이템의 비용이 설정되지 않았거나(**null**) **0**인 경우 해당 화폐를 사용해 구매할 수 없습니다. 제로 비용을 사용하면 다른 화폐 항목을 비워두거나 **0**으로 재설정하여 아이템을 무료 화폐 전용 또는 프리미엄 화폐 전용으로 만들 수 있습니다.
* **실제 통화**: **RM** 화폐는 모든 카탈로그와 스토어에서 사용할 수 있습니다. RM은 *실제 통화 트랜잭션만* 나타내는 제한된 화폐 키입니다. 상당한 가치가 있는 아이템 또는 프리미엄 화폐가 포함된 번들/컨테이너에 대해서만 RM으로 요금을 청구해야 합니다.
* **가격은 양자택일**: 아이템에 두 가격이 정의된 경우 아이템은 하나 또는 다른 하나로 구매할 수 있습니다. 단일 아이템에 두 화폐가 모두 필요하도록 하는 것은 \_불가능\_합니다.

## 실제 통화 스토어 정의

**Game Manager**에서:

* **Title**로 이동합니다.
* 왼쪽 메뉴에서 **Economy**를 선택합니다.
* **Catalogs** 탭에서 기본 카탈로그를 선택하고 **Stores**를 선택합니다.
* **New Store** 버튼을 선택합니다.

[드롭 테이블](/services/playfab/economy-monetization/economy/tutorials/drop-tables) 예제에서 11개 아이템 드롭 번들을 만들었습니다. 이 예제에서는 실제 통화 스토어에서 유사한 번들 세 개를 사용할 수 있도록 만듭니다.

<Note>
  모든 아이템을 실제 통화로 판매할 수 있지만, *특정* 가치 있는 아이템 또는 번들만 직접 사용할 수 있도록 하는 것이 모범 사례입니다.
</Note>

아래에 제공된 스크린샷은 **실제 통화**로 사용 가능한 세 개의 **아이템 번들**이 포함된 완전한 새 **스토어**를 보여줍니다.

<img src="https://mintcdn.com/microsoft-4404708b/Oa_DP1q6U1lat7c2/images/playfab/economy-monetization/economy/tutorials/game-manager-economy-edit-store.png?fit=max&auto=format&n=Oa_DP1q6U1lat7c2&q=85&s=9195fb8062f1c7ce7ba7caa050d5229c" alt="Game Manager - economy - edit Store" width="1280" height="1500" data-path="images/playfab/economy-monetization/economy/tutorials/game-manager-economy-edit-store.png" />

실제 통화 구매 완료에 대한 세부 사항은 고급 튜토리얼 [비영수증 결제 처리](/services/playfab/economy-monetization/economy/tutorials/non-receipt-payment-processing)에서 다룹니다.

### 실제 통화 스토어 모범 사례

실제 통화를 사용하는 방법은 주로 게임의 특정 디자인에 따라 다릅니다. 게임 내 아이템의 직접 구매는 유효하지만 덜 일반적입니다.

일반적으로 게임은 실제 통화를 사용하여 프리미엄 가상 화폐 구매를 허용해야 합니다. 프리미엄 화폐 대 실제 통화의 비율이 다른 여러 스토어를 순환할 수 있습니다.

<Tip>
  주요 결론은 플레이어가 *언제나* 돈을 지불할 수 있도록 하는 것입니다.
</Tip>

## 가상 화폐 스토어 정의

가상 화폐로 게임 내 아이템을 구매하는 세부 사항과 코드를 살펴보겠습니다.

초기 단계는 앞의 예제와 거의 동일합니다.

1. *무료* **화폐** 가격과 *프리미엄* **화폐** 가격을 사용해 **소**, **중**, **대 체력 물약** 세 개의 새 아이템을 만듭니다.
2. 판매 아이템이 있는 새 스토어를 만듭니다.

<img src="https://mintcdn.com/microsoft-4404708b/Oa_DP1q6U1lat7c2/images/playfab/economy-monetization/economy/tutorials/game-manager-economy-new-store.png?fit=max&auto=format&n=Oa_DP1q6U1lat7c2&q=85&s=c64cebc85f1e45eae8aa51e7c9bdab9a" alt="Game Manager - Economy - New Store" width="1280" height="1300" data-path="images/playfab/economy-monetization/economy/tutorials/game-manager-economy-new-store.png" />

## 단일 구매에서 여러 아이템 구매

가상 화폐로 단일 아이템을 구매하려면 [스토어 빠른 시작](/services/playfab/economy-monetization/economy/stores/quickstart)에서 설명한 [PurchaseItem](xref:titleid.playfabapi.com.client.playeritemmanagement.purchaseitem) 메서드를 사용합니다. 이 튜토리얼은 단일 구매에서 여러 아이템 구매를 다룹니다.

이 프로세스의 첫 번째 단계는 스토어를 가져와 사용자에게 표시하는 것이어야 합니다.

```csharp theme={null}
void GetVcStore()
{
    var primaryCatalogName = "TestCatalog-001"; // In your game, this should just be a constant matching your primary catalog
    var storeId = "Potion Store"; // In your game, this should be a constant for a permanent store, or retrieved from titleData for a time-sensitive store
    var request = new GetStoreItemsRequest
    {
        CatalogVersion = primaryCatalogName,
        StoreId = storeId
    };
    PlayFabClientAPI.GetStoreItems(request, LogSuccess, LogFailure);
}
```

이 예제의 `LogSuccess` 콜백은 스토어의 모든 아이템, *스토어* 가격 및 스토어 자체에 포함된 모든 메타데이터에 대한 완전한 설명이 포함된 [GetStoreItemsResult](xref:titleid.playfabapi.com.client.title-widedatamanagement.getstoreitems#getstoreitemsresult)를 받습니다.

### 스토어 표시 모범 사례

스토어가 있는 게임은 [GetCatalogItems](xref:titleid.playfabapi.com.server.title-widedatamanagement.getcatalogitems) 메서드를 사용해 기본 카탈로그를 호출하고 캐시해야 합니다. 카탈로그 가격과 스토어 가격을 모두 표시할 수 있으며, 판매 아이템 옆에 10% 할인 또는 유사한 보너스 장식을 표시할 수 있습니다.

<Tip>
  플레이어는 판매 아이템, 특히 세일이 한정 기간 오퍼일 때 구매할 가능성이 더 높습니다.
</Tip>

이 시점에서, 사용자에게 어떤 아이템을 얼마나 구매할지 선택할 기회를 제시하는 것은 GUI 코드의 책임입니다.

* 게임과 PlayFab 사이에서 남은 단계는 여러 개의 별도 API 호출이지만, 여러 호출의 시퀀스를 플레이어에게 보이지 않게 만들 수 있습니다.
* 구매에 대한 모든 정보를 미리 수집하고 *모든* 플레이어 입력이 수집된 후 전체 호출 시퀀스를 만듭니다.

```csharp theme={null}
void DefinePurchase()
{
    var primaryCatalogName = "TestCatalog-001"; // In your game, this should just be a constant matching your primary catalog.
    var storeId = "Potion Store"; // At this point in the process, it's just maintaining the same storeId used above.
    var request = new StartPurchaseRequest
    {
        CatalogVersion = primaryCatalogName,
        StoreId = storeId,
        Items = new List<ItemPurchaseRequest> {
             // The presence of these lines are based on the results from GetStoreItems, and user selection - Yours will be more generic.
            new ItemPurchaseRequest { ItemId = "Small Health Potion", Quantity = 20,},
            new ItemPurchaseRequest { ItemId = "Medium Health Potion", Quantity = 100,},
            new ItemPurchaseRequest { ItemId = "Large Health Potion", Quantity = 2,},
        }
    };
    PlayFabClientAPI.StartPurchase(request, result => { Debug.Log("Purchase started: " + result.OrderId); }, LogFailure);
}
```

아이템 선택 프로세스 동안 사용자가 이러한 아이템에 대해 지출할 화폐를 선택할 수 있도록 해야 합니다. 이 예에서 모든 아이템은 **SP**와 **GP**로 비용이 있으며, 이는 사용자가 어떤 화폐를 지출할지 선택할 수 있음을 의미합니다.

<Note>
  위의 코드 예에서 `StartPurchase` API의 [결과](xref:titleid.playfabapi.com.client.playeritemmanagement.startpurchase#startpurchaseresult)에는 `PaymentOptions` 목록이 포함되어 있습니다. 각 결제 옵션에는 구매를 만드는 데 사용할 수 있는 `Currency`, `Price`, `ProviderName`이 포함되어 있습니다.
</Note>

### 제한 사항

단일 구매에서는 \_하나\_의 가상 화폐만 허용됩니다. 선택한 모든 아이템은 \_단일 화폐\_로 구매 가능해야 합니다.

호출에서 화폐를 지정해야 하며, 이는 가능한 화폐가 여러 개인 경우 중요합니다. 요청에 선택한 화폐로 해당 비용이 없는 아이템이 있으면 시퀀스가 실패합니다.

`ProviderName`도 호출에서 지정해야 합니다. 실제 통화 구매의 경우 제공자 이름은 Facebook, PayPal 또는 Steam과 같이 구매 자금을 조달하는 데 사용되는 사람입니다. VC 구매의 경우 타이틀 ID를 기반으로 하는 문자열입니다. `ProviderName`은 이전 **참고**에서 설명한 대로 [StartPurchaseResult](xref:titleid.playfabapi.com.client.playeritemmanagement.startpurchase#startpurchaseresult)의 `PaymentOptions` 필드에서 얻을 수 있습니다.

<Tip>
  VC 구매의 경우 타이틀의 `ProviderName`은 "Title"이라는 단어와 16진수 `TitleId`의 10진수 등가물을 연결하여 구성된 문자열입니다. 예를 들어, "Title123456".
</Tip>

### 스토어 아이템 표시 모범 사례

스토어의 모든 아이템에 일관된 옵션이 있는지 확인하여 플레이어의 혼란을 피하세요.

실제 통화 아이템은 프리미엄 VC 아이템과 별도의 스토어에 있어야 하며, 무료 VC 아이템과 다시 별도로 있어야 합니다. 단일 스토어가 여러 화폐를 허용하는 경우 해당 스토어의 *모든* 아이템은 동일한 여러 화폐 세트를 일관되게 사용해야 합니다. 원활한 고객 경험을 제공하는 데 필요한 만큼 많은 스토어를 만드세요.

```csharp theme={null}
void DefinePaymentCurrency(string orderId, string currencyKey, string providerName)
{
    var request =new PayForPurchaseRequest {
        OrderId = orderId, // orderId comes from StartPurchase above.
        Currency = currencyKey, // User defines which currency they wish to use to pay for this purchase (all items must have a defined/non-zero cost in this currency).
        ProviderName = providerName // providerName comes from the PaymentOptions in the result from StartPurchase above.
    };
    PlayFabClientAPI.PayForPurchase(request, LogSuccess, LogFailure);
}
```

마지막으로 구매가 완전히 정의되면 아래와 같이 프로세스를 완료할 수 있습니다.

```csharp theme={null}
// Unity/C#
void FinishPurchase(string orderId)
{
    var request = new ConfirmPurchaseRequest { OrderId = orderId };
    PlayFabClientAPI.ConfirmPurchase(request, LogSuccess, LogFailure);
}
```

### API 오류 결과 처리 모범 사례

단일 API 호출은 다양한 이유로 실패할 수 있습니다. 휴대 전화와 같은 무선 장치는 종종 간헐적인 연결을 가질 수 있으며, 모든 인터넷 호출은 무작위 지연으로 인해 실패할 수 있습니다.

각 호출은 여러 실패 조건을 확인해야 합니다. 응답이 요청이 유효하지 않음을 보여주는 경우(예: 단일 화폐로 여러 아이템을 구매할 수 없음) 중단해야 합니다. 스토어 디자인에 문제가 있을 수 있습니다.

응답이 연결 실패를 나타내는 경우, 지수 백오프 지연으로 다시 시도할 수 있습니다.

## 결론

스토어는 플레이어가 아이템을 구매하도록 장려하는 훌륭한 메커니즘입니다.

스토어는 모든 종류의 가상 화폐와 함께 작동합니다. 스토어는 대체 API 메서드 세트를 통해 실제 통화와도 작동할 수 있습니다.

* [PurchaseItem](xref:titleid.playfabapi.com.client.playeritemmanagement.purchaseitem)을 통해 VC로 단일 아이템 구매를 설정할 수 있습니다.
* 다음 시퀀스를 통해 실제 통화 또는 VC로 여러 아이템 구매를 설정할 수 있습니다.
  * [StartPurchase](xref:titleid.playfabapi.com.client.playeritemmanagement.startpurchase)
  * [PayForPurchase](xref:titleid.playfabapi.com.client.playeritemmanagement.payforpurchase)
  * [ConfirmPurchase](xref:titleid.playfabapi.com.client.playeritemmanagement.confirmpurchase)

실제 통화 구매에 대한 자세한 내용은 [비영수증 결제 처리](/services/playfab/economy-monetization/economy/tutorials/non-receipt-payment-processing)를 참조하세요.

고급 스토어 사용법은 [플레이어 세그먼트용 사용자 지정 스토어](/services/playfab/economy-monetization/economy/tutorials/custom-stores-for-player-segments) 튜토리얼을 참조하세요.


## Related topics

- [Economy(레거시)에서의 플레이어 세그먼트용 사용자 지정 스토어](/ko/services/playfab/economy-monetization/economy/tutorials/custom-stores-for-player-segments.md)
- [Economy(레거시)에서의 스토어 세분화 모범 사례](/ko/services/playfab/economy-monetization/economy/tutorials/best-practices-for-store-segmentation.md)
- [스토어(Economy 레거시) 빠른 시작](/ko/services/playfab/economy-monetization/economy/stores/quickstart.md)
- [Economy(레거시)에서의 드롭 테이블](/ko/services/playfab/economy-monetization/economy/tutorials/drop-tables.md)
- [Economy(레거시)에서의 쿠폰 및 프로모션](/ko/services/playfab/economy-monetization/economy/tutorials/coupons-and-promotions.md)
