# 구성

> Retrieve your Economy configuration using the Configuration namespace.

`Configuration` 네임스페이스에서 메서드를 사용하면 전체 경제 구성에서 아이템을 가져올 수 있습니다.

> **Note:**
>
> [Config Caching](../config-caching) 참고

`SyncConfigurationAsync()`는 최신 버전의 Economy 구성을 캐시한 후 캐시에서 구성을 읽을 수 있도록 `GetCurrencies()`와 같은 메서드를 호출할 수 있습니다. 새 구성을 퍼블리시하는 경우 `SyncConfigurationAsync()`를 다시 호출하여 캐시를 업데이트해야 합니다.

### SyncConfigurationAsync##syncconfigurationasync

현재 퍼블리시된 Economy 구성을 가져와 SDK에 캐시합니다. 다른 구성 메서드(예: `GetCurrencies()`)를 호출하기 전에 먼저 이 메서드를 호출해야 예외가 발생하지 않습니다.

*C#*

```cs
await EconomyService.Instance.Configuration.SyncConfigurationAsync();
```

## 재화##currencies

### GetCurrencies##getcurrencies

캐시된 구성에서 모든 재화를 가져옵니다. `CurrencyDefinition` 오브젝트의 목록이 반환됩니다.

```cs title="C#"
List<CurrencyDefinition> definitions = EconomyService.Instance.Configuration.GetCurrencies();
```

### GetCurrency##getcurrency

캐시된 구성에서 재화 ID를 사용하여 특정 `CurrencyDefinition`을 가져옵니다. 재화가 없으면 `null` 값이 반환됩니다.

```cs title="C#"
string currencyID = "GOLD_BARS";
CurrencyDefinition goldCurrencyDefinition = EconomyService.Instance.Configuration.GetCurrency(currencyID);
```

### CurrencyDefinition##currencydefinition

`CurrencyDefinition` 오브젝트는 단일 재화 구성을 나타내며, 여기에 포함되는 데이터는 다음과 같습니다.

* `Id`: 재화 ID입니다.
* `Name`: 사람이 읽을 수 있는 재화 이름입니다.
* `Type`: Economy 대시보드에 정의되어 있는 아이템 유형입니다. 모든 `CurrencyDefinition` 오브젝트는 `CURRENCY`입니다.
* `Initial`: 플레이어에게 처음 제공되는 재화의 금액입니다.
* `Max`: 플레이어가 최대로 소유할 수 있는 재화의 금액이며, 필요에 따라 값을 0으로 나타내면 최댓값이 없는 것입니다.
* `CustomData`: `Dictionary<string, object>`이며, 재화 정의와 연결된 모든 커스텀 데이터입니다([CustomDataDeserializable 사용](#using-customdata) 참고).
* `Created`: 이 재화가 생성된 날짜입니다. [EconomyDate](./common-objects.md#economydate) 오브젝트입니다.
* `Modified`: 이 재화가 수정된 날짜입니다. [EconomyDate](./common-objects.md#economydate) 오브젝트입니다.

다음과 같이 유용한 메서드도 있습니다.

#### GetPlayerBalance##c

이 메서드는 `CurrencyDefinition`에 명시된 재화를 기반으로 현재 로그인된 플레이어의 잔액을 가져옵니다. [플레이어 잔액](./player-balances.md)에 명시된 대로 `PlayerBalance`가 반환됩니다.

```cs title="C#"
string currencyID = "GOLD_BARS";
CurrencyDefinition goldCurrencyDefinition = EconomyService.Instance.Configuration.GetCurrency(currencyID);
PlayerBalance playersGoldBarBalance = await goldCurrencyDefinition.GetPlayerBalanceAsync();
```

## 인벤토리##inventories

### GetInventoryItems##getinventoryitems

캐시된 구성에서 모든 인벤토리 아이템을 가져옵니다. `InventoryItemDefinition` 오브젝트의 목록이 반환됩니다.

```cs title="C#"
List<InventoryItemDefinition> definitions = EconomyService.Instance.Configuration.GetInventoryItems();
```

### GetInventoryItem##getinventoryitem

캐시된 구성에서 아이템 ID를 사용하여 특정 `InventoryItemDefinition`을 가져옵니다. 아이템이 없으면 `null` 값이 반환됩니다.

```cs title="C#"
string itemID = "SWORD";
InventoryItemDefinition definition = EconomyService.Instance.Configuration.GetInventoryItem(itemID);
```

### InventoryItemDefinition##inventoryitemdefinition

`InventoryItemDefinition` 오브젝트는 단일 인벤토리 아이템 구성을 나타내고, 여기에 포함되는 데이터는 다음과 같습니다.

* `Id`: 인벤토리 아이템 ID입니다.
* `Name`: 사람이 읽을 수 있는 이름입니다.
* `Type`: Economy 대시보드에 정의되어 있는 아이템 유형입니다. 모든 `InventoryItemDefinition` 오브젝트는 `INVENTORY_ITEM`입니다.
* `CustomData`: `Dictionary<string, object>`이며, 아이템 정의와 연결된 모든 커스텀 데이터입니다([](#using-customdata)[CustomDataDeserializable 사용](#using-customdata) 참고).
* `Created`: 이 아이템이 생성된 날짜입니다. [EconomyDate](./common-objects.md#economydate) 오브젝트입니다.
* `Modified`: 이 아이템이 수정된 날짜입니다. [EconomyDate](./common-objects.md#economydate) 오브젝트입니다.

다음의 헬퍼 메서드도 포함되어 있습니다.

### GetAllPlayersInventoryItems##getallplayersinventoryitems

현재 로그인된 플레이어의 모든 인벤토리 아이템을 가져옵니다. [플레이어 인벤토리](./player-inventory.md)에 명시된 대로 `GetInventoryResult`가 반환됩니다.

```cs title="C#"
string itemID = "SWORD";
InventoryItemDefinition definition = EconomyService.Instance.Configuration.GetInventoryItem(itemID);
GetInventoryResult allThePlayersSwords = await definition.GetAllPlayersInventoryItemsAsync();
```

## 구매##purchases

### 가상 구매##virtual-purchases

#### GetVirtualPurchases##c

캐시된 구성에서 모든 가상 구매를 가져옵니다. `VirtualPurchaseDefinition` 오브젝트의 목록이 반환됩니다.

```cs title="C#"
List<VirtualPurchaseDefinition> definitions = EconomyService.Instance.Configuration.GetVirtualPurchases();
```

#### GetVirtualPurchase##c

캐시된 구성에서 단일 가상 구매를 가져옵니다. 단일 `VirtualPurchaseDefinition` 오브젝트가 반환됩니다.

```cs title="C#"
string purchaseId = "VIRTUAL_PURCHASE_ID"
VirtualPurchaseDefinition definition = EconomyService.Instance.Configuration.GetVirtualPurchase(purchaseId);
```

#### VirtualPurchaseDefinition##getplayerbalance

`VirtualPurchaseDefinition` 오브젝트는 구성의 가상 구매 정의를 나타냅니다. 아래 나열된 바와 같이 여러 구성 요소 오브젝트로 이루어져 있습니다.

`VirtualPurchaseDefinition`에 포함되는 필드는 다음과 같습니다.

* `Id`: 구매 정의 ID입니다.
* `Name`: 사람이 읽을 수 있는 이름입니다.
* `Type`: Economy 대시보드에 정의되어 있는 아이템 유형입니다. 모든 `VirtualPurchaseDefinition` 오브젝트는 `VIRTUAL_PURCHASE`입니다.
* `CustomData`: `Dictionary<string, object>`이며, 이 구매 정의와 연결된 모든 커스텀 데이터입니다([](#using-customdata)[CustomDataDeserializable 사용](#using-customdata) 참고).
* `CustomDataDeserializable`: `IDeserializable`이며, 이 구매 정의와 연결된 모든 커스텀 데이터입니다([CustomDataDeserializable 사용](#using-customdata) 참고).
* `Created`: 이 구매 정의가 생성된 날짜입니다. [EconomyDate](./common-objects.md#economydate) 오브젝트입니다.
* `Modified`: 이 구매 정의가 수정된 날짜입니다. [EconomyDate](./common-objects.md#economydate) 오브젝트입니다.
* `Costs`: [`PurchaseItemQuantity`](#purchaseitemquantity)이며, 이 구매와 연결된 비용 목록입니다.
* `Rewards`: [`PurchaseItemQuantity`](#purchaseitemquantity)이며, 이 구매와 연결된 보상 목록입니다.

### 현금 구매##real-money-purchases

> **Warning:**
>
> Economy SDK 3.0.0에는 `GetRealMoneyPurchase())`/`GetRealMoneyPurchases()` 메서드로 `StoreIdentifiers`가 반환되지 않는 문제가 있습니다. 권장하는 해결책은 개발자가 문제가 해결될 때까지 SDK 버전 2.0.4로 되돌려 이 문제가 발생하지 않도록 방지하는 것입니다.

#### GetRealMoneyPurchases##c

캐시된 구성에서 모든 현금 구매를 가져옵니다. `RealMoneyPurchaseDefinition` 오브젝트의 목록이 반환됩니다.

```cs title="C#"
List<RealMoneyPurchaseDefinition> definitions = EconomyService.Instance.Configuration.GetRealMoneyPurchases();
```

#### GetRealMoneyPurchase##c

캐시된 구성에서 단일 현금 구매를 가져옵니다. 단일 `RealMoneyPurchaseDefinition` 오브젝트가 반환됩니다.

```cs title="C#"
string purchaseId = "REAL_MONEY_PURCHASE_ID"
RealMoneyPurchaseDefinition definition = EconomyService.Instance.Configuration.GetRealMoneyPurchase(purchaseId);
```

#### RealMoneyPurchaseDefinition##c

`RealMoneyPurchaseDefinition` 오브젝트는 구성의 현금 구매 정의를 나타냅니다. 아래 나열된 바와 같이 여러 구성 요소 오브젝트로 이루어져 있습니다.

`RealMoneyPurchaseDefinition`에 포함되는 필드는 다음과 같습니다.

* `Id`: 구매 정의 ID입니다.
* `Name`: 사람이 읽을 수 있는 이름입니다.
* `Type`: Economy 대시보드에 정의되어 있는 아이템 유형입니다. 모든 `RealMoneyPurchaseDefinition` 오브젝트는 `MONEY_PURCHASE`입니다.
* `CustomData`: `Dictionary<string, object>`이며, 이 구매 정의와 연결된 모든 커스텀 데이터입니다([](#using-customdata)[CustomDataDeserializable 사용](#using-customdata) 참고).
* `Created`: 이 구매 정의가 생성된 날짜입니다. [EconomyDate](./common-objects.md#economydate) 오브젝트입니다.
* `Modified`: 이 구매 정의가 수정된 날짜입니다. [EconomyDate](./common-objects.md#economydate) 오브젝트입니다.
* `StoreIdentifiers`: 이 구매에 해당하는 스토어 ID입니다. [StoreIdentifiers](#getvirtualpurchases) 오브젝트입니다.
* `Rewards`: [`PurchaseItemQuantity`](#purchaseitemquantity)이며, 이 구매와 연결된 보상 목록입니다.

#### StoreIdentifiers##getvirtualpurchases

`StoreIdentifers` 오브젝트에는 Google과 Apple 스토어 ID가 모두 포함되어 있습니다. 이는 [Unity Dashboard](https://dashboard.unity3d.com/)의 ‘스토어 연결’ 단계에서 구매를 생성할 때 설정합니다. Unity Dashboard에서 구매를 클릭하고 ‘스토어 연결’이 나올 때까지 스크롤하여 편집할 수 있습니다.

## PurchaseItemQuantity##purchaseitemquantity

`PurchaseItemQuantity`는 구매와 연결된 재화나 인벤토리 아이템의 수량을 나타냅니다. 각각은 단일 재화나 인벤토리 아이템 유형(예: 검 4개, 금 10개 등)과 관련되어 있습니다. 포함되는 필드는 다음과 같습니다.

* `Item`: 이 수량으로 표시되는 아이템 정의를 가리키는 `EconomyReference`입니다.
* `Amount`: 표시되는 아이템의 금액(정수)입니다.

### EconomyReference##economyreference

`EconomyReference`는 구매 내에서 다른 정의를 참조합니다. 다음과 같이 단일 메서드가 포함됩니다.

* `GetReferencedConfigurationItem()`은 연결된 아이템을 가져옵니다.

이 방법으로 참조 아이템을 가져오면 추가 네트워크 요청이 필요하지 않으므로 동기식으로 작동하며, 구매를 가져왔을 때 참조 아이템을 그대로 가져옵니다. 구매 가져오기와 참조 액세스 간의 정의에 변경 사항이 생기면 참조 아이템에는 반영되지 않습니다.

## CustomDataDeserializable 사용##using-customdata

커스텀 데이터는 [Unity Dashboard](https://dashboard.unity3d.com/)에서 설정됩니다. 재화, 인벤토리 아이템, 구매를 선택하고 **커스텀 데이터**로 이동한 다음 JSON 포맷으로 데이터를 추가합니다.

커스텀 데이터는 가져온 구성 아이템의 `CustomDataDeserializable`에 저장됩니다. 유형은 `IDeserializable`입니다. 이렇게 하면 아이템의 커스텀 데이터를 커스텀 클래스에 역직렬화할 수 있습니다.

예를 들어 게임에 컬러 희귀도 시스템이 있으면 대시보드에서 아이템에 다음 JSON 코드를 포함할 수 있습니다.

```js title="JSON"
{
    "rarity": "purple"
}
```

다음을 사용하여 인스턴스 데이터를 역직렬화할 수 있습니다.

```cs title="C#"
class MyCustomData{
    public string Rarity
}
MyCustomData fetchedCustomData = fetchedConfigItem.CustomDataDeserializable.GetAs<MyCustomData>();
string rarity = fetchedCustomData.Rarity;
```
