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

# 네이티브 및 Android Studio용 Java 빠른 시작

> PlayFab Java 클라이언트 SDK JAR 파일을 다운로드하고, 클래스패스를 설정한 후 네이티브 Java 또는 Android에서 첫 번째 LoginWithCustomID API 호출을 수행합니다.

이 빠른 시작을 통해 PlayFab JavaSDK와 간단한 Java 프로그램을 실행할 수 있습니다.

PlayFab API를 호출하려면 먼저 [PlayFab 개발자 계정](https://developer.playfab.com)이 있어야 합니다.

이 자습서의 목표는 다음과 같습니다:

* 필요한 JAR 파일 확보.

* 클래스패스에 JAR 파일 추가.

* [Custom ID Login API 호출](xref:titleid.playfabapi.com.client.authentication.loginwithcustomid)을 실행하는 최소한의 Java 콘솔 애플리케이션 만들기.

## 필요한 JAR 파일 확보

PlayFab JavaSDK를 활용하려면 PlayFab Client JavaSDK와 그 종속성인 Google GSON이 필요합니다.

PlayFab Client JavaSDK JAR 라이브러리는 [여기](https://github.com/PlayFab/JavaSDK/tree/versioned/builds)에서 다운로드하세요. **client-sdk-\*.jar** 및 해당 Java Doc를 찾으세요 \[선택 사항이지만 유용함].

최신 Google GSON은 [여기](https://repo1.maven.org/maven2/com/google/code/gson/gson/2.8.0/)에서 다운로드할 수 있습니다. **gson-\*.jar**를 찾으세요.

## Intellij Idea로 프로젝트 설정

간단한 Intellij Idea Java 프로젝트를 초기화한 후 다음 예시와 같이 필요한 JAR 파일을 배치해야 합니다.

<img src="https://mintcdn.com/microsoft-4404708b/N3T1ucKV7zIMBudj/images/playfab/sdks/java/intellij-proj-setup.png?fit=max&auto=format&n=N3T1ucKV7zIMBudj&q=85&s=85dc548792dd8ba7c4dffd3eaddd3d43" alt="Intellij - 프로젝트 설정" width="473" height="299" data-path="images/playfab/sdks/java/intellij-proj-setup.png" />

다음 단계는 클래스패스에 JAR 파일을 추가하는 것입니다. 아래 예시와 같이 **File** -> **,** 로 이동합니다.

<img src="https://mintcdn.com/microsoft-4404708b/N3T1ucKV7zIMBudj/images/playfab/sdks/java/intellij-add-jar-files-to-classpath.png?fit=max&auto=format&n=N3T1ucKV7zIMBudj&q=85&s=167ce0cbbce7cefb93979d2ccfa8b896" alt="Intellij - 클래스패스에 jar 파일 추가" width="388" height="435" data-path="images/playfab/sdks/java/intellij-add-jar-files-to-classpath.png" />

**Libraries**로 이동한 다음, 아래 이미지에 표시된 대로 새 Java 라이브러리를 추가합니다.

<img src="https://mintcdn.com/microsoft-4404708b/N3T1ucKV7zIMBudj/images/playfab/sdks/java/intellij-add-new-java-library.png?fit=max&auto=format&n=N3T1ucKV7zIMBudj&q=85&s=db7b46a3ccb01057f0d1e66474ab828c" alt="Intellij - 새 Java 라이브러리 추가" width="395" height="361" data-path="images/playfab/sdks/java/intellij-add-new-java-library.png" />

libs 폴더에 추가한 JAR 파일을 선택한 후 아래와 같이 **OK**를 선택합니다.

<img src="https://mintcdn.com/microsoft-4404708b/N3T1ucKV7zIMBudj/images/playfab/sdks/java/intellij-select-jar-files.png?fit=max&auto=format&n=N3T1ucKV7zIMBudj&q=85&s=e60d7b28a9a1880a0ddd32661d6c7765" alt="Intellij - jar 파일 선택" width="574" height="529" data-path="images/playfab/sdks/java/intellij-select-jar-files.png" />

**Module**을 묻는 경우 목록의 첫 번째 것을 선택합니다. 모든 JAR 파일이 라이브러리 목록에 추가되었는지 확인하세요.

<img src="https://mintcdn.com/microsoft-4404708b/N3T1ucKV7zIMBudj/images/playfab/sdks/java/intellij-ensure-jar-files-added.png?fit=max&auto=format&n=N3T1ucKV7zIMBudj&q=85&s=6dc524df20ee6c2b4a2cb3a894fd83c2" alt="Intellij - jar 파일 추가 확인" width="876" height="372" data-path="images/playfab/sdks/java/intellij-ensure-jar-files-added.png" />

## 모든 IDE로 프로젝트 설정

주요 요구 사항은 JAR 파일이 클래스패스에 추가되어 있어야 한다는 것입니다. 클래스패스에 JAR 파일을 추가하는 방법은 사용 중인 IDE의 가이드를 참조하세요.

## 첫 번째 API 호출 설정

아래 표시된 코드를 기본 클래스 코드로 사용하세요.

```java theme={null}
import java.util.concurrent.*;
import java.util.*;

import com.playfab.PlayFabErrors.*;
import com.playfab.PlayFabSettings;
import com.playfab.PlayFabClientModels;
import com.playfab.PlayFabClientAPI;

public class Main
{
    private static boolean _running = true;

    public static void main(String[] args) {
        PlayFabSettings.TitleId = "144";

        PlayFabClientModels.LoginWithCustomIDRequest request = new PlayFabClientModels.LoginWithCustomIDRequest();
        request.CustomId = "GettingStartedGuide";
        request.CreateAccount = true;

        FutureTask<PlayFabResult<com.playfab.PlayFabClientModels.LoginResult>> loginTask = PlayFabClientAPI.LoginWithCustomIDAsync(request);
        loginTask.run();

        while (_running) {
            if (loginTask.isDone()) { // You would probably want a more sophisticated way of tracking pending async API calls in a real game
                OnLoginComplete(loginTask);
            }

            // Presumably this would be your main game loop, doing other things
            try {
                Thread.sleep(1);
            } catch(Exception e) {
                System.out.println("Critical error in the example main loop: " + e);
            }
        }
    }

    private static void OnLoginComplete(FutureTask<PlayFabResult<com.playfab.PlayFabClientModels.LoginResult>> loginTask) {
        PlayFabResult<com.playfab.PlayFabClientModels.LoginResult> result = null;
        try {
            result = loginTask.get(); // Wait for the result from the async call
        } catch(Exception e) {
            System.out.println("Exception in PlayFab api call: " + e); // Did you assign your PlayFabSettings.TitleId correctly?
        }

        if (result != null && result.Result != null) {
            System.out.println("Congratulations, you made your first successful API call!");
        } else if (result != null && result.Error != null) {
            System.out.println("Something went wrong with your first API call.");
            System.out.println("Here's some debug information:");
            System.out.println(CompileErrorsFromResult(result));
        }

        _running = false; // Because this is just an example, successful login triggers the end of the program
    }

    // This is a utility function we haven't put into the core SDK yet. Feel free to use it.
    private static <RT> String CompileErrorsFromResult(PlayFabResult<RT> result) {
        if (result == null || result.Error == null)
            return null;

        String errorMessage = "";
        if (result.Error.errorMessage != null)
            errorMessage += result.Error.errorMessage;
        if (result.Error.errorDetails != null)
            for (Map.Entry<String, List<String>> pair : result.Error.errorDetails.entrySet() )
                for (String msg : pair.getValue())
                    errorMessage += "\n" + pair.getKey() + ": " + msg;
        return errorMessage;
    }
}
```

## 완료 및 실행

애플리케이션을 실행하려면:

1. 오른쪽 상단 모서리에 있는 \*\*재생 화살표 >\*\*를 선택합니다. 이렇게 하면 프로그램 실행이 시작되고 출력 패널이 나타납니다.
2. **디버그 메시지**를 찾습니다. 이는 API 호출이 성공했음을 나타냅니다.

<img src="https://mintcdn.com/microsoft-4404708b/N3T1ucKV7zIMBudj/images/playfab/sdks/java/intellij-run-program.png?fit=max&auto=format&n=N3T1ucKV7zIMBudj&q=85&s=04ce4add6100b9b56db869bf97baadbb" alt="Intellij - 프로그램 실행" width="968" height="719" data-path="images/playfab/sdks/java/intellij-run-program.png" />

이 시점에서 다른 API 호출을 시작하고 게임을 구축할 수 있습니다.

사용 가능한 모든 클라이언트 API 호출 목록은 [PlayFab API 참조](/services/playfab/api-references) 문서를 확인하세요.

## 코드 분석

이 선택적 마지막 섹션에서는 `GettingStarted.java`의 모든 줄을 자세히 설명합니다.

* Imports
  * 이는 PlayFab API 호출을 수행하는 데 사용되는 최소한의 import 세트입니다.

* public static void `main(String[] args) {`
  * API 호출을 시작하고 완료를 기다리는 기본 루프일 뿐입니다.

  * `PlayFabSettings.TitleId = "xxxx"`;
    * 모든 PlayFab 개발자는 Game Manager에서 타이틀을 만듭니다. 게임을 게시할 때 해당 titleId를 게임에 코딩해야 합니다. 이를 통해 클라이언트는 PlayFab 내의 올바른 데이터에 액세스하는 방법을 알 수 있습니다. 대부분의 사용자에게는 이것을 PlayFab이 작동하도록 만드는 필수 단계로 간주하십시오.

  * `PlayFabClientModels.LoginWithCustomIDRequest request = new PlayFabClientModels.LoginWithCustomIDRequest();`
    * 대부분의 PlayFab API 메서드는 입력 매개 변수를 요구하며 이러한 입력 매개 변수는 요청 객체로 패키지화됩니다.

    * 모든 API 메서드는 선택적 매개 변수와 필수 매개 변수가 혼합된 고유한 요청 객체를 요구합니다.
      * `LoginWithCustomIDRequest`의 경우 플레이어를 고유하게 식별하는 필수 매개 변수 `CustomId`와 이 호출로 새 계정을 만들 수 있게 하는 `CreateAccount`가 있습니다.

    * 로그인의 경우 대부분의 개발자는 더 적절한 로그인 방법을 사용하고자 할 것입니다.
      * 모든 로그인 방법 목록과 입력 매개 변수는 PlayFab Login 문서를 참조하세요. 일반적인 선택은 다음과 같습니다:
        * `LoginWithAndroidDeviceID`
        * `LoginWithIOSDeviceID`
        * `LoginWithEmailAddress`

  * `FutureTask<PlayFabResult<com.playfab.PlayFabClientModels.LoginResult>> loginTask = PlayFabClientAPI.LoginWithCustomIDAsync(request)`;
    * 이는 Java FutureTask 프레임워크를 사용하여 `LoginWithCustomID`에 대한 비동기 요청을 시작합니다.

  * While (running) `{ if (loginTask.isDone()) { OnLoginComplete(loginTask); } }`
    * 간단한 메인 루프를 실행하고 loginTask가 완료될 때까지 비동기적으로 대기합니다.
    * 완료되면 `OnLoginComplete`를 호출합니다.

* `OnLoginComplete (loginTask)`
  * `result = loginTask.get()`;
    * 비동기 결과를 가져옵니다(FutureTask가 이미 완료된 것을 확인했으므로 차단이 발생하지 않습니다).

  * if (`result.Result != null`)이면 API 호출이 성공한 것입니다.
    * 성공하면 많은 API 콜백의 `result.Result` 객체에 요청된 정보가 포함됩니다.

    * `LoginResult`에는 구체적으로 플레이어에 대한 몇 가지 기본 정보가 포함되어 있습니다. 그러나 대부분의 사용자에게 로그인은 단순히 다른 API를 호출하기 전의 필수 단계입니다.

  * If (`result.Error != null`)이면 API 호출이 실패한 것입니다.
    * API 호출은 여러 이유로 실패할 수 있으며 항상 실패를 처리하려고 시도해야 합니다.
    * API 호출이 실패하는 이유(가능성 순서대로)
      * `PlayFabSettings.TitleId`가 설정되지 않았습니다. `TitleId`를 타이틀로 설정하는 것을 잊으면 아무것도 작동하지 않습니다.
      * 요청 매개 변수. 특정 API 호출에 대한 올바른 정보 또는 필수 정보를 제공하지 않은 경우 실패합니다. 자세한 정보는 `error.errorMessage`, `error.errorDetails` 또는 `error.GenerateErrorReport()`를 참조하세요.
      * 장치 연결 문제. 휴대 전화는 지속적으로 연결이 끊어졌다가 다시 연결되므로 언제든지 API 호출이 무작위로 실패할 수 있으며 즉시 다시 작동할 수 있습니다. 터널에 들어가면 완전히 연결이 끊길 수 있습니다.
      * PlayFab 서버 문제. 모든 소프트웨어와 마찬가지로 문제가 있을 수 있습니다. 업데이트는 [릴리스 노트](/services/playfab/release-notes)를 참조하세요.
      * 인터넷은 100% 신뢰할 수 없습니다. 때때로 메시지가 손상되거나 PlayFab 서버에 도달하지 못합니다.

  * 문제를 디버깅하는 데 어려움이 있고 오류 정보 내의 정보가 충분하지 않다면 [포럼](https://community.playfab.com/index.html)을 방문해 주세요.


## Related topics

- [네이티브 및 Phaser용 JavaScript 빠른 시작](/ko/services/playfab/sdks/javascript/quickstart.md)
- [빠른 시작 Android](/ko/services/playfab/sdks/c/quickstart-android.md)
- [Windows용 C++ 빠른 시작](/ko/services/playfab/sdks/playfab-cpp/quickstart-windows.md)
- [Linux용 C++ 빠른 시작](/ko/services/playfab/sdks/playfab-cpp/quickstart-linux.md)
- [GDK용 C/C++ 빠른 시작](/ko/services/playfab/sdks/playfab-cpp/quickstart-gdk.md)
