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

# Bulk Actions for an entire Player Segment

> Tutorial for creating a PlayFab task that runs one or more bulk actions, such as granting rewards, on every player in a target segment.

이 튜토리얼에서는 세그먼트의 모든 플레이어에 대해 하나 이상의 작업을 수행하는 task를 만드는 데 필요한 단계를 안내합니다.

Task는 모든 게임의 라이브 운영에서 필수적인 부분입니다. 플레이어와의 상호작용을 위한 강력한 도구 세트를 제공합니다.

예시:

* 최근 2주 동안 로그인한 모든 플레이어에게 특별한 새해 선물을 제공.
* 지난 주에 결제한 플레이어들에게 지출 계층에 따라 보상 제공(더 많이 지출할수록 더 가치 있는 선물).
* 최근 게임 버그로 영향을 받은 모든 플레이어의 손상된 플레이어 상태를 수정.

이 튜토리얼에서는 **Unicorn Battle Sample App**을 기반으로 **2,725 XP** 이상을 가진 모든 플레이어에게 특별한 선물을 부여합니다.

## 필수 구성 요소

이 튜토리얼을 실행하려면 Unicorn Battle Sample App을 설치해야 합니다. 자세한 내용은 [블로그](https://blog.playfab.com/blog/check-out-unicorn-battle)에서 읽을 수 있으며, 또는 [GitHub 리포지토리](https://github.com/PlayFab/UnicornBattle)로 바로 이동하여 그곳의 지침을 따르세요.

<img src="https://mintcdn.com/microsoft-4404708b/YzmQFdAfhA-NTCPa/images/playfab/data-analytics/acting-data/tutorials/unicorn-battle-launch-screen.webp?fit=max&auto=format&n=YzmQFdAfhA-NTCPa&q=85&s=682e9a99bb6293229a452095255ce2f2" alt="Unicorn Battle - Launch Screen" width="2560" height="1440" data-path="images/playfab/data-analytics/acting-data/tutorials/unicorn-battle-launch-screen.webp" />

캐릭터를 최소 **Level 2**까지 레벨업하기 위해 *여러* 전투를 진행해야 하며, 이는 **2,725 XP** 포인트에서 도달합니다.

<img src="https://mintcdn.com/microsoft-4404708b/YzmQFdAfhA-NTCPa/images/playfab/data-analytics/acting-data/tutorials/unicorn-battle-level-two.webp?fit=max&auto=format&n=YzmQFdAfhA-NTCPa&q=85&s=0f47eb0af3bb618e2aa449df163305f0" alt="Unicorn Battle - Level 2" width="2560" height="1440" data-path="images/playfab/data-analytics/acting-data/tutorials/unicorn-battle-level-two.webp" />

## 1단계 - 세그먼트 만들기

첫 번째 단계는 이 작업의 영향을 받을 플레이어 그룹을 정의하는 세그먼트를 만드는 것입니다. 이 경우 **2,725 XP** 이상을 가진 모든 플레이어로 정의되는 **High XP Segment**를 만들어야 합니다.

* 왼쪽 메뉴에서 **PlayStream**을 선택합니다.
* **Segments** 탭을 선택합니다.
* **New Segment** 버튼을 선택합니다.
* **Segment Name**을 **High XP Players**로 설정합니다.
* 이를 **Statistic Value**인 **Total\_XP Gained**가 **2725**보다 큰 **Player**로 정의합니다.

<Note>
  **참고:** 현재 예약된 태스크 시스템은 세그먼트당 초당 10-15개의 태스크를 처리할 수 있습니다. 세그먼트를 설계할 때 크기와 작업 실행 시간을 미리 계획하세요. 태스크가 실행되는 데 대한 시간 제한은 없지만, 특정 시간 프레임 내에 태스크를 실행해야 한다면 세그먼트의 크기를 적절하게 설정해야 합니다.
</Note>

<img src="https://mintcdn.com/microsoft-4404708b/IwSYTY5BEqd_x-HK/images/playfab/data-analytics/acting-data/tutorials/game-manager-segments-high-xp-players.png?fit=max&auto=format&n=IwSYTY5BEqd_x-HK&q=85&s=277244d7f9813aa8821acc626b4a903a" alt="Game Manager - PlayStream - Segments - High XP Players" width="1394" height="817" data-path="images/playfab/data-analytics/acting-data/tutorials/game-manager-segments-high-xp-players.png" />

## 2단계 - 이 세그먼트에 대한 태스크 만들기

* **Segments** 탭을 선택합니다.
* \*\*RUN TASK …\*\*를 선택합니다.

<img src="https://mintcdn.com/microsoft-4404708b/IwSYTY5BEqd_x-HK/images/playfab/data-analytics/acting-data/tutorials/game-manager-segments-run-task.png?fit=max&auto=format&n=IwSYTY5BEqd_x-HK&q=85&s=82870774c3122881a0419e880078401d" alt="Game Manager - PlayStream - Segments - Run Task" width="902" height="598" data-path="images/playfab/data-analytics/acting-data/tutorials/game-manager-segments-run-task.png" />

이렇게 하면 **Servers**->**Tasks** 탭의 **Create Task** 뷰로 이동하고, 선택한 세그먼트를 기반으로 다양한 필드가 미리 채워집니다.

<img src="https://mintcdn.com/microsoft-4404708b/IwSYTY5BEqd_x-HK/images/playfab/data-analytics/acting-data/tutorials/game-manager-servers-task-create-task.png?fit=max&auto=format&n=IwSYTY5BEqd_x-HK&q=85&s=155bf1e0a504d077fc5aeea920791f65" alt="Game Manager - Servers - Task - Create Task" width="1280" height="900" data-path="images/playfab/data-analytics/acting-data/tutorials/game-manager-servers-task-create-task.png" />

## 3단계 - 태스크에 작업 추가

다음으로 태스크 설정을 마무리할 수 있습니다.

* 이름을 **Reward High XP Players**로 변경합니다.
* 다음 설명을 추가합니다: **Give a gift to Players who are level 2 or higher**.
* **ADD ACTION**을 선택합니다.
  * 제공된 필드에 **Grant virtual currency**를 입력합니다.
  * **Virtual Currency** 코드: **GM**(**Gems**의 약자).
  * 금액: **20**
* 지금은 예약을 **Manually**로 두세요.
* 태스크를 실행하려면 **SAVE AND RUN** 버튼을 선택하세요.

<img src="https://mintcdn.com/microsoft-4404708b/IwSYTY5BEqd_x-HK/images/playfab/data-analytics/acting-data/tutorials/game-manager-servers-task-add-action-save-and-run.png?fit=max&auto=format&n=IwSYTY5BEqd_x-HK&q=85&s=88be2126823b5296a972acebe78fb0e8" alt="Game Manager - Servers - Task - Add Action - Save and Run" width="1280" height="900" data-path="images/playfab/data-analytics/acting-data/tutorials/game-manager-servers-task-add-action-save-and-run.png" />

## 4단계 - 태스크 모니터링

**Tasks** 뷰에는 실행 중인 태스크가 표시됩니다. 초기에는 태스크 상태가 **InProgress**이지만 세그먼트가 작기 때문에 곧 **Succeeded**로 변경됩니다.

<img src="https://mintcdn.com/microsoft-4404708b/IwSYTY5BEqd_x-HK/images/playfab/data-analytics/acting-data/tutorials/game-manager-servers-tasks-task-succeeded.png?fit=max&auto=format&n=IwSYTY5BEqd_x-HK&q=85&s=f947e3bac92c4b78e3dd01f55d9a1ca3" alt="Game Manager - Servers - Tasks - Task Succeeded" width="1280" height="720" data-path="images/playfab/data-analytics/acting-data/tutorials/game-manager-servers-tasks-task-succeeded.png" />

이제 태스크 실행 세부 정보를 확인해 보겠습니다. 이전에 실행한 **Tasks** 목록에서 완료된 태스크를 선택합니다. 다음과 같은 중요한 정보를 볼 수 있습니다.

* 처리된 플레이어 수.
* 태스크 시작 시간.
* 완료에 걸린 시간.
* 실행 시의 매개 변수.
* 실행한 사람.
* 수동으로 예약되었는지 여부 등.

태스크가 아직 진행 중이라면 **Task Instance Detail** 뷰에서 진행 상황을 확인하고 남은 예상 시간을 볼 수 있습니다.

<img src="https://mintcdn.com/microsoft-4404708b/IwSYTY5BEqd_x-HK/images/playfab/data-analytics/acting-data/tutorials/game-manager-servers-tasks-task-instance-details.png?fit=max&auto=format&n=IwSYTY5BEqd_x-HK&q=85&s=6a29866408f6240c680cc1a48d0d0130" alt="Game Manager - Servers - Tasks - Task Instance Details" width="1280" height="900" data-path="images/playfab/data-analytics/acting-data/tutorials/game-manager-servers-tasks-task-instance-details.png" />

태스크가 성공적으로 실행되었는지 확인하려면:

* **Players** 탭으로 이동합니다.
* **플레이어**를 선택합니다.
* 그런 다음 **Event History** 탭을 선택합니다.
* 목록의 가장 최근 이벤트는 **player\_virtual\_currency\_balance\_changed**여야 하며, 이는 **플레이어**의 gems이 **20** 증가했음을 보여줘야 합니다.

<Note>
  이 이벤트를 확장하여 세부 정보를 볼 수 있습니다.
</Note>

<img src="https://mintcdn.com/microsoft-4404708b/IwSYTY5BEqd_x-HK/images/playfab/data-analytics/acting-data/tutorials/game-manager-event-history-event-detail.png?fit=max&auto=format&n=IwSYTY5BEqd_x-HK&q=85&s=8f5be92d094f953e458edc23c05339b9" alt="Game Manager - Event History - Event Detail" width="1458" height="622" data-path="images/playfab/data-analytics/acting-data/tutorials/game-manager-event-history-event-detail.png" />

## 다음 단계

이 튜토리얼에서는 세그먼트의 모든 플레이어에 대해 작업을 수행하는 데 관련된 단계를 소개했지만, 태스크로 할 수 있는 것이 훨씬 더 많습니다.

시도할 수 있는 다른 것들에 대한 몇 가지 아이디어입니다...

### 태스크 예약

태스크를 수동으로 실행할 필요가 없습니다 - *반복적*으로 *자동* 실행되도록 태스크를 예약할 수 있습니다. 예를 들어 지난 24시간 동안 게임을 플레이한 모든 플레이어의 세그먼트를 만든 다음, 매일 예약된 태스크를 실행하여 해당 플레이어에게 XP 부스트를 제공할 수 있습니다.

<img src="https://mintcdn.com/microsoft-4404708b/IwSYTY5BEqd_x-HK/images/playfab/data-analytics/acting-data/tutorials/game-manager-segments-players-in-24-hours.png?fit=max&auto=format&n=IwSYTY5BEqd_x-HK&q=85&s=011c1636bdcf356fef0958937679cdb6" alt="Game Manager - PlayStream - Segments - Players in 24 hours" width="780" height="815" data-path="images/playfab/data-analytics/acting-data/tutorials/game-manager-segments-players-in-24-hours.png" />

<img src="https://mintcdn.com/microsoft-4404708b/IwSYTY5BEqd_x-HK/images/playfab/data-analytics/acting-data/tutorials/game-manager-servers-tasks-scheduled-task.png?fit=max&auto=format&n=IwSYTY5BEqd_x-HK&q=85&s=b818b7055457a8d9e13d6128d9e0e31b" alt="Game Manager - Servers - Tasks - Scheduled Task" width="1280" height="900" data-path="images/playfab/data-analytics/acting-data/tutorials/game-manager-servers-tasks-scheduled-task.png" />

### 각 플레이어에 대해 CloudScript 실행

대량 작업의 가장 강력한 활용법은 각 플레이어에 대해 임의의 CloudScript 함수를 실행하는 것입니다. 이 CloudScript는 PlayFab 서버 API가 할 수 있는 모든 것을 할 수 있습니다 - 아이템 부여, 화폐 부여, 플레이어 데이터 검사 및 변경 등.

예를 들어, 매주 재설정되는 이벤트 리더보드가 있고, 재설정 전의 *마지막* 이벤트 값에 기반하여 모든 플레이어에게 보상을 지급하고 싶다고 가정해 보세요. 아래 예시는 **Unicorn Battle**을 사용하고 있습니다.

1. 매주 재설정되고 집계 방식으로 **Last**를 사용하는 새 통계 **Event\_QuestsCompleted**를 만듭니다.

   <img src="https://mintcdn.com/microsoft-4404708b/IwSYTY5BEqd_x-HK/images/playfab/data-analytics/acting-data/tutorials/players-leaderboards-edit-leaderboard.png?fit=max&auto=format&n=IwSYTY5BEqd_x-HK&q=85&s=dc418906c884b0c685d0a4d05393dd7a" alt="Players - Leaderboards - Edit Leaderboard" width="571" height="541" data-path="images/playfab/data-analytics/acting-data/tutorials/players-leaderboards-edit-leaderboard.png" />

2. `Total_QuestsCompleted`가 변경될 때마다 이 `Event_QuestsCompleted` 통계를 증가시키는 새 PlayStream 작업을 만듭니다.

   <img src="https://mintcdn.com/microsoft-4404708b/IwSYTY5BEqd_x-HK/images/playfab/data-analytics/acting-data/tutorials/playstream-event-actions-edit-event-action.png?fit=max&auto=format&n=IwSYTY5BEqd_x-HK&q=85&s=7f0d65c83146783af200454981eec9c6" alt="PlayStream - Event Actions - Edit Event Action" width="1043" height="943" data-path="images/playfab/data-analytics/acting-data/tutorials/playstream-event-actions-edit-event-action.png" />

3. 대량 작업 태스크에서 호출되는 CloudScript 함수를 작성하여 플레이어를 훑고 마지막 값에 기반한 보상을 지급합니다.

```javascript theme={null}
// this function will be called as a bulk action by a scheduled task for players in a segment
handlers.GiveTieredReward = function (args, context) {
    var profile = context.playerProfile;

    var statVersion = 0;        // set to whatever version you need to use

    var getStatRequest = {};
    getStatRequest.PlayFabId = profile.PlayerId;
    getStatRequest.StatisticNameVersions = [{ "StatisticName": "Event_QuestsCompleted", "Version": statVersion }];

    try {
        getStatRequest.PlayerResult = server.GetPlayerStatistics(getStatRequest);
    } catch (e) {
    };

    if (getStatRequest.PlayerResult && getStatRequest.PlayerResult.Statistics.length > 0) {
        getStatRequest.lastScore = getStatRequest.PlayerResult.Statistics[0].Value
    }

    if (getStatRequest.lastScore && getStatRequest.lastScore > 2) {
        // give gift to all players with more than 2 quests completed in last event
        // in a real event we would want to use a lookup table of gifts
        // but here we are just hard-coding it
        var giftRequest = {};
        giftRequest.PlayFabId = profile.PlayerId;
        giftRequest.ItemIds = ["CrystalKey"];
        giftRequest.grantResult = server.GrantItemsToUser(giftRequest);
        return giftRequest;
    } else {
        return getStatRequest;
    }
}
```

4. 새 CloudScript 버전을 **Live**로 설정하고, 모든 플레이어에 대해 `GiveTieredReward` 함수를 호출하는 새 태스크를 만듭니다. 태스크를 **저장**하고 **실행**하는 것을 잊지 마세요.

   <img src="https://mintcdn.com/microsoft-4404708b/IwSYTY5BEqd_x-HK/images/playfab/data-analytics/acting-data/tutorials/servers-tasks-new-scheduled-task.png?fit=max&auto=format&n=IwSYTY5BEqd_x-HK&q=85&s=984b0ca050712fd0ad357ed1aa8365dd" alt="Servers - Tasks - New Scheduled Task" width="1280" height="900" data-path="images/playfab/data-analytics/acting-data/tutorials/servers-tasks-new-scheduled-task.png" />

5. 이 태스크에서 발생한 이벤트가 PlayStream 이벤트 디버거에 나타나는 것을 확인할 수 있습니다.

   <img src="https://mintcdn.com/microsoft-4404708b/IwSYTY5BEqd_x-HK/images/playfab/data-analytics/acting-data/tutorials/playstream-dashboard-event-debugger.png?fit=max&auto=format&n=IwSYTY5BEqd_x-HK&q=85&s=aed7ba302609d3de83967a15e6ffaff4" alt="PlayStream - Dashboard - Event Debugger" width="3079" height="1050" data-path="images/playfab/data-analytics/acting-data/tutorials/playstream-dashboard-event-debugger.png" />

6. 타임스탬프를 선택하여 임의의 플레이어 트리거 작업 실행 CloudScript 이벤트를 선택하면 각 플레이어에 대한 CloudScript 실행의 상세 결과를 볼 수 있습니다. 여기에는 CloudScript 실행 시점의 플레이어 프로필 스냅샷과 같은 유용한 진단 정보가 포함됩니다.

   <img src="https://mintcdn.com/microsoft-4404708b/IwSYTY5BEqd_x-HK/images/playfab/data-analytics/acting-data/tutorials/playstream-dashboard-raw-event-json.png?fit=max&auto=format&n=IwSYTY5BEqd_x-HK&q=85&s=02ea8cca957596e793448dfa583d7c0c" alt="PlayStream - Dashboard - Raw Event JSON" width="1464" height="1923" data-path="images/playfab/data-analytics/acting-data/tutorials/playstream-dashboard-raw-event-json.png" />


## Related topics

- [player_action_executed](/ko/services/playfab/api-references/events/Player/player-action-executed.md)
- [Content & Configuration Reads 미터 API 설명](/ko/services/playfab/pricing/meters/file-reads.md)
- [PFSegmentsGetPlayerSegmentsResult](/ko/services/playfab/api-references/c/pfsegmentstypes/structs/pfsegmentsgetplayersegmentsresult.md)
- [PFSegmentsGetPlayersInSegmentResult](/ko/services/playfab/api-references/c/pfsegmentstypes/structs/pfsegmentsgetplayersinsegmentresult.md)
- [PFSegmentsGetPlayersSegmentsRequest](/ko/services/playfab/api-references/c/pfsegmentstypes/structs/pfsegmentsgetplayerssegmentsrequest.md)
