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

# 첫 번째 사용자 생성 콘텐츠 게시

> Postman 또는 Game Manager를 사용해 PlayFab Economy v2에서 사용자 생성 콘텐츠를 게시하고, CreateUploadUrls, Azure Blob Storage, 초안 아이템 API를 활용합니다.

<Info>
  Economy v2는 이제 정식 출시(GA)되었습니다. 지원 및 피드백은 [PlayFab 포럼](https://community.playfab.com)을 참조하세요.
</Info>

이 튜토리얼은 API와 Game Manager UX를 통해 콘텐츠로 UGC를 게시하는 과정을 안내하며, 빠른 시작보다 더 자세히 살펴봅니다.

## 요구 사항

* [PlayFab 개발자 계정](https://developer.playfab.com)
* UGC가 활성화된 타이틀

## API를 통해

이 섹션에서는 [Postman Collections](/services/playfab/sdks/postman/postman-quickstart)을 사용해 PlayFab UGC API와 상호 작용하지만, [SDK](/services/playfab/sdks/playfab-sdk-intro) 중 어느 것이든 사용할 수 있습니다.

### Blob URL 만들기

* UGC 시스템은 PlayFab Entity 모델과 함께 작동하므로 이러한 API를 호출하려면 세션 티켓 대신 엔터티 토큰을 사용해야 합니다. [Postman Collections 빠른 시작](/services/playfab/sdks/postman/postman-quickstart)에서 타이틀 엔터티 토큰을 얻는 방법을 배울 수 있습니다.

* UGC 시스템은 [Azure Blob Storage](https://learn.microsoft.com/en-us/azure/storage/blobs/storage-blobs-introduction)를 사용해 타이틀 UGC와 관련된 모든 콘텐츠(파일 및 이미지)를 저장합니다. 콘텐츠를 업로드하려면 먼저 파일 이름과 크기(바이트 단위)를 전달하여 새 blob을 만드는 `CreateUploadUrls` API를 호출해야 합니다. 예를 들어, 텍스트 파일과 PNG 이미지를 업로드하려면 요청 본문에 다음을 전달합니다.

  ```JSON theme={null}
  {
    "Files": [
      {
        "FileName": "HelloWorld.txt",
        "FileSize": 12
      },
      {
        "FileName": "PlayFabLogo.png",
        "FileSize": 20725
      }
    ]
  }
  ```

* 응답에는 각 콘텐츠에 대한 `Id`와 `Url`이 포함됩니다.

  ```JSON theme={null}
  {
      "code": 200,
      "status": "OK",
      "data": {
          "UploadUrls": [
              {
                  "Id": "[Content ID]",
                  "Url": "[Content Url + '?' + Token]",
                  "FileName": "HelloWorld.txt"
              },
              {
                  "Id": "[Image ID]",
                  "Url": "[Image Url + '?' + Token]",
                  "FileName": "PlayFabLogo.png"
              }
          ]
      }
  }
  ```

<Note>
  각 create 토큰(응답의 "Url" 필드에 반환됨)은 6시간 동안 유효하며, 그 이후에는 blob에 콘텐츠를 업로드할 수 없습니다. blob에 콘텐츠를 업로드하지 않은 경우 서비스에서 정리되며 `CreateUploadUrls`를 다시 호출하여 새 blob을 만들어야 합니다. 이 URL은 콘텐츠가 초안 아이템에 업로드되어 다른(이제 공개적으로 액세스할 수 있는) URL을 받을 때까지 콘텐츠에 대한 액세스도 허용하지 않습니다.
</Note>

<Note>
  각 blob은 **하나의** 아이템에만 사용해야 합니다. 콘텐츠 조각이 여러 아이템에서 반복되기를 원한다면 콘텐츠를 다른 blob에 다시 업로드해야 합니다.
</Note>

### Blob에 콘텐츠 업로드

이러한 URL에 콘텐츠를 업로드하는 몇 가지 다른 방법이 있습니다.

#### Postman을 통해

* `CreateUploadUrls` 호출에서 생성된 URL로 `PUT` 요청을 만들고 `comp: blob` 및 `x-ms-blob-type: blockblob`을 헤더로 추가합니다.
  <img src="https://mintcdn.com/microsoft-4404708b/Oa_DP1q6U1lat7c2/images/playfab/economy-monetization/economy-v2/tutorials/publish-ugc-postman-public-ugc-example.png?fit=max&auto=format&n=Oa_DP1q6U1lat7c2&q=85&s=ec80f04739aa449009946c6f34bc3223" alt="Postman 게시 예제" width="1058" height="634" data-path="images/playfab/economy-monetization/economy-v2/tutorials/publish-ugc-postman-public-ugc-example.png" />

* 그런 다음 본문 유형으로 *binary*를 선택하여 파일을 업로드할 수 있습니다.
  <img src="https://mintcdn.com/microsoft-4404708b/Oa_DP1q6U1lat7c2/images/playfab/economy-monetization/economy-v2/tutorials/publish-ugc-postman-upload-binary.png?fit=max&auto=format&n=Oa_DP1q6U1lat7c2&q=85&s=426a8a5b3178b8053ae0063a1f5d6dd0" alt="Postman 바이너리 업로드" width="1010" height="265" data-path="images/playfab/economy-monetization/economy-v2/tutorials/publish-ugc-postman-upload-binary.png" />

#### AzCopy를 통해

* 또 다른 옵션은 AzCopy 도구를 사용하는 것입니다. 도구를 다운로드하고 여기에서 [AzCopy 시작하기](https://learn.microsoft.com/en-us/azure/storage/common/storage-use-azcopy-v10)를 확인할 수 있습니다.
* 원하는 터미널에서 다음 매개 변수와 함께 azcopy를 호출합니다.

  ```powershell theme={null}
  [relative path to azcopy.exe] copy [relative path to local content] [Url + '?' + Token]
  ```

### 초안 UGC 만들기

* 이제 파일과 이미지가 성공적으로 업로드되었으므로 콘텐츠와 이미지의 URL을 전달하여 `CreateDraftItem`을 호출해 초안 카탈로그에 첫 번째 아이템을 만들 수 있습니다.

  ```JSON theme={null}
  {
    "Item": {
      "Type": "ugc",
      "Title": {
        "NEUTRAL": "Hello World!"
      },
      "Description": {
        "NEUTRAL": "My first UGC item (with content!)"
      },
      "ContentType": "Game Item",
      "IsHidden": false,
      "Contents": [
        {
          "Id": "[Content ID]",
          "Url": "[Content Url]"
        }
      ],
      "Images": [
        {
          "Id": "[Image ID]",
          "Type": "Thumbnail",
          "Url": "[Image Url]"
        }
      ]
    },
    "Publish": false,
    "AllowOverwrite": false
  }
  ```

<Note>
  아이템에 이미지를 업로드할 때 모든 이미지는 `Type` 매개 변수로 분류되어야 합니다. "Thumbnail" 또는 "Screenshot"일 수 있습니다. 각 아이템은 "Thumbnail" 유형의 이미지 하나로 제한되며 기본적으로 [검색](/services/playfab/economy-monetization/economy-v2/catalog/search#select)은 기본적으로 "Thumbnail" 이미지를(있는 경우) 반환합니다.
</Note>

* 응답은 전달한 메타데이터와 함께 아이템 ID를 반환합니다.

  ```json theme={null}
  {
  "code": 200,
  "status": "OK",
  "data": {
      "Item": {
          ...
          "Id": "e5427509-1b72-4ee1-9e6c-03fc055a94f3",
          ...
      }
    }
  }
  ```

* 이제 초안 카탈로그에 초안 UGC 아이템이 존재합니다! UGC 아이템이 아직 게시되지 않는 한 공개 카탈로그를 통해 검색할 수 없습니다. 다음 API 중 하나를 호출하여 이 UGC 아이템을 찾을 수 있습니다.

  * `CreateDraftItem` 응답에서 얻은 아이템 ID를 전달하여 `GetDraftItem`
  * 알려진 아이템 ID 목록을 전달하여 `GetDraftItems`
  * 엔터티 ID를 전달하거나 이전 응답의 ContinuationToken을 전달하여 초안 아이템 목록을 페이지로 표시하는 `GetEntityDraftItems`

<Note>
  즉시 게시하고 싶다면 `Publish` 필드를 true로 변경할 수 있습니다.
</Note>

* UGC 아이템을 게시할 준비가 되면 `PublishDraftItem`을 호출하고 (`CreateDraftItem` 응답에서 얻은) 아이템 ID를 전달합니다.
* UGC 아이템에 특별히 큰 파일이 여러 개 포함되어 있는 경우 아이템 게시에 다소 시간이 걸릴 수 있으며, 많은 다른 플레이어가 동시에 콘텐츠를 업로드할 때 이 프로세스는 더 많은 시간이 걸릴 수 있습니다. `GetItemPublishStatus`를 호출하고 (`CreateDraftItem` 응답에서 얻은) 아이템 ID를 전달하여 게시 상태를 확인할 수 있습니다. 몇 가지 가능한 상태가 있습니다.
  * `Succeeded` - UGC 아이템이 성공적으로 게시되었습니다.
  * `Pending` - UGC 아이템이 아직 게시 중입니다.
  * `Failed` - UGC 아이템 게시가 실패했으며 위반된 콘텐츠가 수정될 때까지 게시되지 않습니다.
  * `Unknown` - 기본 상태이며 UGC 아이템에 `PublishDraftItem`을 호출하기 전에 반환됩니다.
  * `Canceled` - 내부 오류가 발생했습니다. 아이템을 다시 게시해 보세요(이 상태가 여러 번 표시되면 PlayFab 엔지니어링 팀에 문의하세요).
* UGC 아이템이 성공적으로 게시되면 `SearchItems`를 통해 검색하거나 아이템 ID가 있으면 `GetItem`을 통해 직접 가져올 수 있습니다.
* 다음을 수행하여 게시 전이나 후에 UGC 아이템을 변경할 수 있습니다.
  * (`CreateDraftItem` 응답에서 얻은) 아이템 ID를 전달하여 `GetDraftItem`을 호출합니다.
  * UGC 아이템 데이터(`data` 필드의 모든 내용)를 복사합니다.
  * 수정된 UGC 아이템 데이터를 전달하여 `UpdateDraftItem`을 호출합니다.
  * 파일이나 이미지를 업데이트하려면 `CreateUploadUrls`를 다시 호출하여 다른 blob을 만들어야 합니다.
  * `PublishDraftItem`을 호출하여 UGC 아이템을 다시 게시합니다.

## Game Manager를 통해

이 섹션에서는 Game Manager 환경 내에서 완전히 UGC 아이템을 만들 것입니다. 코드가 필요 없습니다!

### 초안 카탈로그 아이템 만들기

* **Economy** > \*\*Catalog (v2)\*\*를 선택하여 UGC 페이지로 이동합니다.

* **New Item**을 선택합니다.

* UGC 아이템에 대한 적절한 메타데이터를 입력합니다.

  | 필드 이름        | 값                                                    |
  | ------------ | ---------------------------------------------------- |
  | Entity type  | title\_player\_account                               |
  | Entity ID    | \[플레이어 ID]                                           |
  | Content type | Game Item                                            |
  | Start date   | \[과거의 아무 날짜]                                         |
  | Title        | `{ "NEUTRAL": "Hello World!" }`                      |
  | Description  | `{ "NEUTRAL": "My first UGC item (with content!)" }` |

  <img src="https://mintcdn.com/microsoft-4404708b/Oa_DP1q6U1lat7c2/images/playfab/economy-monetization/economy-v2/tutorials/publish-ugc-new-ugc-item.png?fit=max&auto=format&n=Oa_DP1q6U1lat7c2&q=85&s=69782b702c8090b62e6baae411bb684b" alt="새 UGC 아이템" width="1200" height="616" data-path="images/playfab/economy-monetization/economy-v2/tutorials/publish-ugc-new-ugc-item.png" />

* **Files** 및 **Images** 섹션 아래에서 **Upload** 버튼을 선택하여 적절한 콘텐츠를 업로드합니다.

* **Save and publish**를 선택합니다.

* 이제 UGC 아이템이 자동으로 초안 아이템으로 만들어지고 공개 카탈로그에 게시됩니다. 이제 다른 게시된 UGC 아이템과 함께 테이블에서 이 아이템을 찾을 수 있습니다.

<Note>
  현재 Game Manager 내에서 초안 아이템이나 게시 상태를 확인할 방법이 없습니다. 이는 API를 통해서만 수행할 수 있습니다.
</Note>

* 게시된 UGC 아이템을 변경하려면 다음을 수행하여 그렇게 할 수 있습니다.
  * 테이블에서 게시된 UGC 아이템을 선택합니다.
  * 적절한 편집을 수행합니다.
  * **Save and publish**를 선택합니다.

## 문제 해결

* Invalid Request - The content type 'Game Item' isn't supported.
  * 콘텐츠 유형이 (`GetCatalogConfig`/`UpdateCatalogConfig`을 통해 또는 Game Manager의 **Economy Settings** 탭에서) 타이틀 구성에 지정되었다면 목록에 **Game Item**을 추가하거나 타이틀이 이미 지원하는 콘텐츠 유형으로 변경해야 합니다.
* Invalid Request - This title isn't configured to use this service.
  * 현재 타이틀에 UGC가 비활성화되어 있습니다. 타이틀 구성을 업데이트하여 활성화할 수 있습니다(`GetCatalogConfig`/`UpdateCatalogConfig`을 통해, Game Manager의 **Economy Settings** 탭에서, 또는 **Economy > Catalog (Preview)** 탭으로 이동하여 **Enable**을 선택).

## 다음 단계

이제 카탈로그에 UGC 아이템이 게시되었습니다! `SearchItems`를 사용해 플레이어를 위한 콘텐츠 검색 경험을 만들 수 있습니다.

<Note>
  \[!div class="nextstepaction"] [Search >](/services/playfab/economy-monetization/economy-v2/catalog/search)
</Note>


## Related topics

- [사용자 생성 콘텐츠(UGC) 빠른 시작](/ko/services/playfab/economy-monetization/economy-v2/ugc/quickstart.md)
- [PlayFab 사용자 생성 콘텐츠](/ko/services/playfab/economy-monetization/economy-v2/ugc/overview.md)
- [PlayFab UGC 문서](/ko/services/playfab/economy-monetization/economy-v2/ugc/index.md)
- [PlayFab Economy v2 문서](/ko/services/playfab/economy-monetization/index.md)
- [XR-018 사용자 생성 콘텐츠](/ko/publishing/certification/xr/xr-018.md)
