> ## 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.

# Publisher Data 사용

> SetPublisherData, GetPublisherData 및 관련 API를 사용하여 PlayFab 스튜디오의 여러 타이틀에서 구성 및 플레이어 키-값 데이터를 공유합니다.

이 자습서에서는 Publisher(Studio) 데이터를 생성하고 사용하는 방법을 설명합니다.

Publisher 데이터는 *둘 이상의 타이틀에 걸쳐 있는* 데이터입니다. 예를 들어, 공통 정보를 공유해야 하는 여러 게임이 있는 경우입니다.

<Note>
  이 범주에는 여러 게임에 걸쳐 있는 플레이어 데이터도 포함됩니다. PlayFab은 데이터를 키/값 쌍(KVP)으로 저장합니다.
</Note>

이러한 API의 대부분은 전용 서버 또는 PlayFab 서비스 내의 CloudScript 함수를 통해 프로그램에서 호출해야 하는 서버 API입니다.

* 게시자별 사용자 지정 KVP를 업데이트하려면 서버 API **[SetPublisherData](xref:titleid.playfabapi.com.server.title-widedatamanagement.setpublisherdata)** 를, 검색하려면 **[GetPublisherData](xref:titleid.playfabapi.com.server.title-widedatamanagement.getpublisherdata)** 를 사용합니다.
* 플레이어에 대한 게시자별 사용자 지정 KVP를 만들거나 업데이트하려면 **[UpdateUserPublisherData](xref:titleid.playfabapi.com.client.playerdatamanagement.updateuserpublisherdata)** 를, 검색하려면 **[GetUserPublisherData](xref:titleid.playfabapi.com.client.playerdatamanagement.getuserpublisherdata)** 를 사용합니다.
* 사용자에 대한 읽기 전용 게시자별 사용자 지정 KVP를 업데이트하려면 서버 API **[UpdateUserPublisherReadOnlyData](xref:titleid.playfabapi.com.server.playerdatamanagement.updateuserpublisherreadonlydata)** 를, 검색하려면 클라이언트 API **[GetUserPublisherReadOnlyData](xref:titleid.playfabapi.com.client.playerdatamanagement.getuserpublisherreadonlydata)** 를 사용합니다.
* 사용자에 대한 내부 게시자별 사용자 지정 KVP를 업데이트하려면 서버 API **[UpdateUserPublisherInternalData](xref:titleid.playfabapi.com.server.playerdatamanagement.updateuserpublisherinternaldata)** 를, 검색하려면 **[GetUserPublisherInternalData](xref:titleid.playfabapi.com.server.playerdatamanagement.getuserpublisherinternaldata)** 를 사용합니다.

전용 서버 또는 PlayFab 서비스의 CloudScript 함수를 통해 서버 API를 호출해야 합니다. 이는 PlayFab 서버 API가 비밀 키 제공을 요구하기 때문에 의도된 설계입니다.

<Tip>
  게임 클라이언트 내에서 서버 API를 사용하는 것을 *권장하지 않습니다*. 서버 API를 사용해야 하는 경우, 이러한 유형의 기능에는 CloudScript를 사용하세요.
</Tip>

Publisher 데이터 값은 PlayFab 클러스터 서버의 잠재적으로 *수백* 대의 머신에 복사되고 배포됩니다. 이 프로세스의 일부로, 이 데이터는 캐시되며 해당 캐시에서 변경 사항이 새로 고침되는 데 최대 *15분*이 걸릴 수 있습니다.

<Note>
  Publisher 데이터는 *전역 상수/정적 데이터*에 가장 적합하며, *전역 변수*로서는 적합하거나 신뢰할 수 없습니다.
</Note>

## Publisher 데이터

Publisher 데이터는 타이틀 집합에 대한 정적 데이터를 저장하는 데 사용됩니다. 각 항목은 플레이어와 같은 PlayFab 엔티티에 *바인딩되지 않습니다*([user publisher data](#user-publisher-data)와는 반대).

### Publisher 데이터 설정

다음 스니펫은 Server API를 사용하여 Publisher 데이터를 설정하는 방법을 보여줍니다.

<Note>
  이 작업에는 관리자 API 대응 항목이 있습니다.
</Note>

```csharp theme={null}
public void ServerSetPublisherData() {
    PlayFabServerAPI.SetPublisherData(new SetPublisherDataRequest() {
            Key = "SomeKey",
            Value = "SomeValue"
        },
        result => Debug.Log("Complete setting publisher data"),
        error => {
            Debug.Log("Got error setting publisher data");
            Debug.Log(error.GenerateErrorReport());
        }
    );
}
```

### Publisher 데이터 가져오기

다음 스니펫은 Client API를 사용하여 Publisher 데이터를 가져오는 방법을 보여줍니다.

<Note>
  이 작업에는 서버 및 관리자 API 대응 항목이 있습니다.
</Note>

```csharp theme={null}
public void ClientGetPublisherData() {
    PlayFabClientAPI.GetPublisherData(new GetPublisherDataRequest(),
    result => {
        if (result.Data == null || !result.Data.ContainsKey("SomeKey")) Debug.Log("No SomeKey");
        else Debug.Log("SomeKey: " + result.Data["SomeKey"]);
    },
    error => {
        Debug.Log("Got error getting publisher data");
        Debug.Log(error.GenerateErrorReport());
    });
}
```

## 사용자 Publisher 데이터

사용자 Publisher 데이터는 PlayFab 사용자(플레이어)에 바인딩된 Publisher 데이터를 도입하는 데 사용할 수 있습니다.

일반 Publisher 데이터와 달리, 클라이언트 애플리케이션이 사용자 Publisher 데이터를 변경할 수 있습니다.

PlayFab은 Client API 관점에서 사용자 Publisher 데이터에 대해 3가지 보호 수준을 제공합니다.

1. 일반 사용자 Publisher 데이터는 클라이언트 애플리케이션에 대한 읽기 및 쓰기 액세스를 제공합니다.

   * Client, Server, Admin API를 통해 설정합니다.
   * Client, Server, Admin API를 통해 가져옵니다.
   * Client API는 현재 로그인된 플레이어에 대해서만 Publisher 데이터를 설정할 수 있습니다.

2. 읽기 전용 사용자 Publisher 데이터는 클라이언트 애플리케이션에 대한 읽기 액세스를 제공합니다.

   * Server 및 Admin API를 통해 설정합니다.
   * Client, Server, Admin API를 통해 가져옵니다.

3. 내부 사용자 Publisher 데이터는 클라이언트 애플리케이션에 대한 액세스를 제공하지 않으며, 사용자 데이터의 비밀 부분을 저장하는 데 사용됩니다.

   * Server 및 Admin API를 통해 설정합니다.
   * Server 및 Admin API를 통해 가져옵니다.

### 사용자 Publisher 데이터 설정

다음 스니펫은 Client 및 Server API를 사용하여 3가지 종류의 Publisher 데이터를 모두 설정하는 방법을 보여줍니다.

```csharp theme={null}
// Use Client API to set User Publisher Data for current user
public void ClientSetUserPublisherData() {
    PlayFabClientAPI.UpdateUserPublisherData(new UpdateUserDataRequest() {
         Data  = new Dictionary<string, string>() {
             { "SomeKey", "SomeValue" }
         }
    },
    result => Debug.Log("Complete setting Regular User Publisher Data"),
    error =>
    {
        Debug.Log("Error setting Regular User Publisher Data");
        Debug.Log(error.GenerateErrorReport());
    });
}

// Use Server API to set Read-Only User Publisher Data for selected user
public void ServerSetUserPublisherReadOnlyData() {
    PlayFabServerAPI.UpdateUserPublisherReadOnlyData(new UpdateUserDataRequest() {
         PlayFabId = "< PlayFab Player Id >",
         Data  = new Dictionary<string, string>() {
             { "SomeKey", "SomeValue" }
         }
    },
    result => Debug.Log("Complete setting Read-Only User Publisher Data"),
    error =>
    {
        Debug.Log("Error setting Read-Only User Publisher Data");
        Debug.Log(error.GenerateErrorReport());
    });
}

// Use Server API to set Internal User Publisher Data for selected user
public void ServerSetUserPublisherInternalData() {
    PlayFabServerAPI.UpdateUserPublisherInternalData(new UpdateUserInternalDataRequest() {
         PlayFabId = "< PlayFab Player Id >",
         Data  = new Dictionary<string, string>() {
             { "SomeKey", "SomeValue" }
         }
    },
    result => Debug.Log("Complete setting Internal User Publisher Data"),
    error =>
    {
        Debug.Log("Error setting Internal User Publisher Data");
        Debug.Log(error.GenerateErrorReport());
    });
}
```

### 사용자 Publisher 데이터 가져오기

다음 스니펫은 Client 및 Server API를 사용하여 3가지 종류의 Publisher 데이터를 모두 가져오는 방법을 보여줍니다.

```csharp theme={null}
// Use Client API to get Regular User Publisher Data for selected user
public void ClientGetUserPublisherData() {
    PlayFabClientAPI.GetUserPublisherData(new GetUserDataRequest() {
        PlayFabId = "<PlayFab Player Id>"
    }, result => {
        if (result.Data == null || !result.Data.ContainsKey("SomeKey")) Debug.Log("No SomeKey");
        else Debug.Log("SomeKey: " + result.Data["SomeKey"]);
    },
    error => {
        Debug.Log("Got error getting Regular Publisher Data:");
        Debug.Log(error.GenerateErrorReport());
    });
}

// Use Client API to get Read-Only User Publisher Data for selected user
public void ClientGetUserPublisherReadOnlyData() {
    PlayFabClientAPI.GetUserPublisherReadOnlyData(new GetUserDataRequest() {
        PlayFabId = "<PlayFab Player Id>"
    }, result => {
        if (result.Data == null || !result.Data.ContainsKey("SomeKey")) Debug.Log("No SomeKey");
        else Debug.Log("SomeKey: " + result.Data["SomeKey"]);
    },
    error => {
        Debug.Log("Got error getting Read-Only Publisher Data:");
        Debug.Log(error.GenerateErrorReport());
    });
}

// Use Server API to get Internal User Publisher Data for selected user
public void ServerGetUserPublisherInternalData() {
    PlayFabServerAPI.GetUserPublisherInternalData(new GetUserDataRequest() {
        PlayFabId = "<PlayFab Player Id>"
    }, result => {
        if (result.Data == null || !result.Data.ContainsKey("SomeKey")) Debug.Log("No SomeKey");
        else Debug.Log("SomeKey: " + result.Data["SomeKey"]);
    },
    error => {
        Debug.Log("Got error getting Internal Publisher Data:");
        Debug.Log(error.GenerateErrorReport());
    });
}
```

## 참고

* [Title Data 빠른 시작](/services/playfab/live-service-management/game-configuration/titledata/quickstart)
* [CloudScript 빠른 시작](/services/playfab/live-service-management/service-gateway/automation/cloudscript/quickstart))


## Related topics

- [Title Data 빠른 시작](/ko/services/playfab/live-service-management/game-configuration/titledata/quickstart.md)
- [PFPlayerDataManagementServerUpdateUserPublisherDataAsync](/ko/services/playfab/api-references/c/pfplayerdatamanagement/functions/pfplayerdatamanagementserverupdateuserpublisherdataasync.md)
- [PFPlayerDataManagementServerGetUserPublisherDataAsync](/ko/services/playfab/api-references/c/pfplayerdatamanagement/functions/pfplayerdatamanagementservergetuserpublisherdataasync.md)
- [PFPlayerDataManagementServerUpdateUserPublisherInternalDataAsync](/ko/services/playfab/api-references/c/pfplayerdatamanagement/functions/pfplayerdatamanagementserverupdateuserpublisherinternaldataasync.md)
- [PFPlayerDataManagementClientGetUserPublisherDataAsync](/ko/services/playfab/api-references/c/pfplayerdatamanagement/functions/pfplayerdatamanagementclientgetuserpublisherdataasync.md)
