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

# Leaderboards using Azure Functions

> Tutorial for building PlayFab leaderboards with Azure Functions CloudScript, showing how to submit scores and query rankings from server-side code.

이 튜토리얼에서는 CloudScript, 특히 [Azure Functions](/services/playfab/live-service-management/service-gateway/automation/cloudscript-af)를 통해 리더보드를 구현하는 방법을 배웁니다. 이 접근 방식은 클라이언트 업데이트 없이 사용자 지정 서버 측 로직을 만들 수 있기 때문에 강력합니다.

Azure Function 내에 리더보드 관련 로직을 정의하면 클라이언트는 해당 함수를 호출하여 코드를 실행할 수 있습니다. 나중에 변경이 필요할 경우, 업데이트의 복잡도에 따라 대부분 클라이언트를 수정하지 않고도 Azure Function을 독립적으로 업데이트할 수 있습니다.

## 필수 구성 요소

이 튜토리얼을 따라하려면 다음이 필요합니다.

* PlayFab 계정. 계정이 없는 경우 [여기](https://developer.playfab.com/)에서 만들 수 있습니다.
* Azure 구독. 구독이 없는 경우 [여기](https://azure.microsoft.com/free/)에서 만들 수 있습니다.

Azure Function을 만드는 방법에 대한 자세한 내용은 이 가이드를 확인하세요. [Visual Studio를 사용해 Azure에서 첫 번째 함수 만들기](https://learn.microsoft.com/azure/azure-functions/functions-create-your-first-function-visual-studio)

## Azure Functions를 사용해 리더보드 만들기

이 섹션에서는 점수를 제출하고 상위 점수를 검색할 수 있는 리더보드를 만들어 보겠습니다.

```C# theme={null}
[Function("LeaderboardExample")]
public async Task<HttpResponseData> RunAsync([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequestData req)
{
    _logger.LogInformation("C# HTTP trigger function processed a request.");

    PlayFabSettings.staticSettings.TitleId = "78C3E"; // Change this value to your own titleId from PlayFab Game Manager
    PlayFabSettings.staticSettings.DeveloperSecretKey = "WJT5SBP7PUFH61JHE39QQ4F1SJKGBWBJR647CH1WYB9CS3MZDD"; // Change this to your title's secret key from Game Manager
                                                                                                              // Check if parameter exists
    if (string.IsNullOrEmpty(req.Query["leaderboardName"]))
    {
        var badResponse = req.CreateResponse(HttpStatusCode.BadRequest);
        badResponse.Headers.Add("Content-Type", "text/plain; charset=utf-8");
        badResponse.WriteString("Please pass a leaderboardName on the query string");
        return badResponse;
    }

    PlayFabAuthenticationContext authContext = await LoginAsTitleEntity();
    var result = await CreateLeaderboardDefinitionAsync(authContext, req.Query["leaderboardName"]);
    if (result != null)
    {
        if (result.Error != null) {
            PlayFabError apiError = result.Error;
            var response = req.CreateResponse(HttpStatusCode.BadRequest);
            response.Headers.Add("Content-Type", "text/plain; charset=utf-8");
            if (apiError != null)
            {
                response.WriteString("Something went wrong with your API call.  :");
                response.WriteString("Here's some debug information:");
                response.WriteString(PlayFabUtil.GenerateErrorReport(apiError));
                return response;
            }
            response.WriteString("Something went wrong with your API call but it wasn't possible to get a PlayFab error description.");
            return response;
        }
        else
        {
            var response = req.CreateResponse(HttpStatusCode.OK);
            response.Headers.Add("Content-Type", "text/plain; charset=utf-8");
            response.WriteString("Leaderboard created successfully!");
            return response;
        }
    }
    else 
    {
        var response = req.CreateResponse(HttpStatusCode.BadRequest);
        response.Headers.Add("Content-Type", "text/plain; charset=utf-8");
        response.WriteString("Something went wrong with your API call.  :");
        return response;
    }    
    
}

```

* 함수 특성 `[Function("LeaderboardExample")]`는 함수의 이름을 정의합니다. 이 경우 `LeaderboardExample`입니다.
* 이 함수는 `[HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")]` 특성에서 알 수 있듯이 HTTP 요청에 의해 트리거됩니다. 즉, 이 함수는 인증 없이 HTTP GET 및 POST 메서드를 통해 액세스할 수 있습니다.
* 함수 내에서 PlayFab Title ID와 Developer Secret Key를 설정하여 PlayFab 서비스에 대한 요청을 인증합니다. 특정 상황과 보안 요구 사항에 가장 적합한 방식으로 이러한 값에 액세스하는 방법을 변경할 수 있습니다.
* 이 함수는 요청에 "leaderboardName" 쿼리 매개 변수가 제공되었는지 확인합니다.
* 그런 다음 `LoginAsTitleEntity` 메서드를 호출하여 리더보드 정의 생성에 필요한 title 엔티티로 인증합니다.
* 마지막으로 `CreateLeaderboardDefinitionAsync` 메서드를 호출하여 제공된 이름으로 리더보드 정의를 만듭니다. 리더보드 생성에 대한 자세한 내용은 [기본 리더보드 만들기](/services/playfab/community/leaderboards/create-basic-leaderboard) 및 [리더보드 더 활용하기](/services/playfab/community/leaderboards/doing-more-with-leaderboards)를 확인하세요.

RunAsync 메서드는 Azure Function의 진입점 역할을 합니다. 여기서 추가 메서드를 정의하고 호출하여 사용자 지정 게임 로직을 구축할 수 있습니다. 오류를 처리하거나 여러 PlayFab 서비스와 상호작용하는 방식은 전적으로 여러분의 선택이며, 구현에 완전한 유연성을 제공합니다.

또한, 특정 이벤트를 기반으로 이 Azure Function을 트리거하도록 자동화 규칙을 구성할 수 있습니다. 자세한 내용은 [여기](/services/playfab/live-service-management/service-gateway/automation/cloudscript-af/quickstart)를 참조하세요.

## 함께 보기

* [리더보드 더 활용하기](/services/playfab/community/leaderboards/doing-more-with-leaderboards).
* [기본 리더보드 만들기](/services/playfab/community/leaderboards/create-basic-leaderboard).
* [수동 계층](/services/playfab/community/leaderboards/manual-tiers).
* [제한 사항](/services/playfab/community/leaderboards/limits-leaderboards).
* [할당량](/services/playfab/community/leaderboards/quota-leaderboards).
* [시즌 리더보드](/services/playfab/community/leaderboards/seasonal-leaderboards).
* [통계로 플레이어 순위 매기기](/services/playfab/community/leaderboards/leaderboards-linked-to-stats).
* [리더보드에 상황 데이터 추가](/services/playfab/community/leaderboards/metadata-leaderboards).
* [PlayStream과 함께 사용하는 리더보드](/services/playfab/community/leaderboards/leaderboards-with-playstream-and-telemetry).
* [API 참조](/services/playfab/community/leaderboards/api-reference).


## Related topics

- [PlayFab CloudScript using Azure Functions](/ko/services/playfab/live-service-management/service-gateway/automation/cloudscript-af/index.md)
- [Using resettable statistics and leaderboards](/ko/services/playfab/community/leaderboards/tournaments-leaderboards/using-resettable-statistics-and-leaderboards.md)
- [Using the Profile for Advanced Leaderboards](/ko/services/playfab/community/leaderboards/tournaments-leaderboards/using-the-profile-for-advanced-leaderboards.md)
- [Leaderboards with PlayStream and Telemetry](/ko/services/playfab/community/leaderboards/leaderboards-with-playstream-and-telemetry.md)
- [Using text moderation](/ko/services/playfab/community/voice-communications/concepts-text-moderation.md)
