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

# Multiplayer 세션 고급 항목

> 구성원 속성, 기능, 크기 제한, 사용자 상태, 시간 초과, 중재자, 프로세스 수명 관리 등을 다루는 MPSD 세션에 대한 심층 분석입니다.

<a id="top" />

이 항목을 사용하여 Multiplayer Session의 고급 개념에 대해 알아보세요.

이 항목에서는 다음을 다룹니다.

* [세션 개요](#session-overview)
* [구성원 속성](#member-properties)
* [세션 기능](#session-capabilities)
* [세션 크기](#session-size)
* [세션 사용자 상태](#session-user-states)
* [표시 여부 및 참가 가능성](#visibility-and-joinability)
* [세션 시간 초과](#session-timeouts)
* [단일 콘솔의 여러 로그인 사용자](#multiple-signed-in-users-on-a-single-console)
* [프로세스 수명 관리](#process-lifecycle-management)
* [비활성 세션 정리](#cleanup-of-inactive-sessions)
* [세션 중재자](#session-arbiter)

<a id="session-overview" />

## 세션 개요

Multiplayer Session Directory(MPSD)의 *세션*은 세션 이름을 가지며 세션 템플릿의 인스턴스로 식별됩니다.
*세션 템플릿*은 세션에 대한 기본 설정을 제공하는 JSON 문서입니다.

세션 템플릿은 GUID인 서비스 구성 식별자(SCID)를 가진 서비스 구성의 일부입니다.
세션 템플릿은 [Partner Center](https://partner.microsoft.com/dashboard/windows/overview)에 있습니다.

*서비스 구성*은 수집, 관리 및 보안 정책에 사용되는 개발자 대상 리소스입니다.
MPSD를 통해 세션에 액세스할 때, 개발자가 Partner Center를 통해 설정한 액세스 정책에 따라 서비스 구성에 대한 주 인증이 수행됩니다.
세션 구성원 검증과 같은 보조 액세스 검사는 서비스 구성에 대한 액세스가 승인된 후 세션이 로드될 때 세션 수준에서 수행됩니다.

<Info>템플릿을 통해 설정된 기능은 MPSD에 대한 쓰기를 통해 변경할 수 없습니다. 값을 변경하려면 필요한 변경 사항을 포함하는 새 템플릿을 만들고 제출해야 합니다. 템플릿을 통해 설정되지 않은 항목은 MPSD에 대한 쓰기를 통해 변경할 수 있습니다.</Info>

### 계약 버전 번호

이 항목에서는 사용자의 템플릿이 XBOX One(또는 이후 버전)의 현재 MPSD에서 사용하는 버전인 계약 버전 107을 사용한다고 가정합니다.

### 세션 참조

각 MPSD 세션은 세션 참조에 의해 고유하게 참조되며, 이는 멀티플레이어 API에서 [XblMultiplayerSessionReference](/reference/live/xsapi-c/multiplayer_c/structs/xblmultiplayersessionreference) 구조체로 표현됩니다.
세션 참조는 다음 문자열 값을 포함합니다.

* 서비스 구성 식별자(SCID)
* 세션 템플릿 이름
* 세션 이름

세션 참조는 세션을 식별하는 URI에 매핑되며, 다음과 같이 표시됩니다.
다음 예제 매핑에서 `authority`는 sessiondirectory.xboxlive.com입니다.

```HTTP theme={null}
https://{authority}/serviceconfigs/{service-config-id}/sessiontemplates/{session-template-name}/sessions/{session-name}
```

### 세션의 요소

각 세션에는 가변성 및 보안 규칙을 적용하는 요소 그룹이 포함되어 있습니다. 이들은 읽기 전용 관리 정보(메타데이터)와 함께 세션 요소별로 다릅니다.
이 섹션에서는 세션을 구성하기 위한 JSON 파일과 사용자가 선택한 템플릿용 JSON 파일에 포함된 세션 요소의 그룹에 대해 설명합니다.

<Note>HTTP/REST 구현을 위해 사용자 지정 래퍼를 사용하는 경우, 세션 및 템플릿은 구현의 기능을 정확하게 반영하는 JSON 개체를 정의해야 합니다.</Note>

각 요소 그룹 안에는 두 개의 내부 개체가 있습니다.

* **시스템 개체:** 이러한 개체는 MPSD가 적용하고 해석하는 고정된 스키마를 가집니다. 검증되고 병합됩니다. MPSD가 이들을 정의하고 그 의미를 알기 때문에 이들에 대해 작동할 수 있습니다. 각 시스템 개체의 전체 정의는 `XblMultiplayerSession` 접두사와 Session Directory URI 모두에 대한 참조를 확인하세요.

* **사용자 지정 개체:** 이러한 개체는 선택 사항이며 스키마가 없습니다. 이들은 멀티플레이어 게임과 관련된 메타데이터를 저장하는 데 사용됩니다. MPSD는 이 데이터를 해석할 수 없기 때문에, 이 데이터에 대해 작동하지 않습니다. 게임 데이터나 저장된 정보는 Title-Managed Storage(TMS)에 저장되어야 합니다. TMS에 대한 자세한 내용은 [XBOX services 타이틀 저장소 개요](/services/xbox-services/storage/title-storage/live-title-storage-overview)를 참조하세요.

다음은 사용자 지정 JSON 개체의 예입니다.

```JSON theme={null}
    "custom": {
      "myField1": true,
      "myField2": "string",
      "myField3": 5.5,
      "myField4": { "myObject": null },
      "myField5": [ "my", "array" ]
    }
```

#### 세션 상수

*세션 상수*는 만든이나 세션 템플릿에서 만들 때만 설정됩니다.
`/constants/system` 개체는 MPSD를 통해 알려진 멀티플레이어 시스템의 상수를 정의하는 데 사용됩니다.
이 개체와 연결된 래퍼는 [XblMultiplayerSessionConstants](/reference/live/xsapi-c/multiplayer_c/structs/xblmultiplayersessionconstants) 구조체로 표현됩니다.

`/constants/system` 개체는 여러 항목을 정의할 수 있습니다. 여기에는 `capabilities` 개체, `metrics` 개체, `managedInitialization`(템플릿 계약 버전 104 또는 105) 또는 `memberInitialization`(계약 버전 107) 개체, `peerToPeerRequirements` 개체, `peerToHostRequirements` 개체, `measurementsServerAddresses` 개체가 포함됩니다.

#### 세션 속성

MPSD의 세션 속성을 정의하는 데 `/properties/system` 개체를 사용합니다.
이 개체와 연결된 래퍼는 [XblMultiplayerSessionProperties](/reference/live/xsapi-c/multiplayer_c/structs/xblmultiplayersessionproperties) 구조체입니다.
세션 속성은 언제든지 세션 구성원이 쓸 수 있습니다.

JSON 형식의 세션 속성 예제는 `joinRestriction`, `initializationSucceeded`, `matchmaking` 개체입니다.
이 요소 그룹의 사용 예에 대한 자세한 내용은 [대상 세션 초기화 및 QoS](/services/xbox-services/multiplayer/matchmaking/concepts/live-matchmaking-target-session)를 참조하세요.

#### 구성원 상수

각 세션 구성원에 대해 참가 시점에 구성원 상수를 설정합니다.
JSON 개체는 `/members/{index}/constants/system`입니다.
세션 구성원을 나타내는 래퍼 클래스는 [XblMultiplayerSessionMember](/reference/live/xsapi-c/multiplayer_c/structs/xblmultiplayersessionmember) 구조체입니다.

[이 항목의 맨 위로 돌아갑니다.](#top)

<a id="member-properties" />

## 구성원 속성

구성원 속성은 세션 구성원만 쓸 수 있습니다.
`/members/{index}/properties/system` 개체에 설정되며 [XblMultiplayerSessionMember](/reference/live/xsapi-c/multiplayer_c/structs/xblmultiplayersessionmember) 구조체의 요소를 반영합니다.

예제는 다음과 같습니다.

```JSON theme={null}
    {
      // These flags control the member status and "activeTitle" and are mutually exclusive (it's an error to set both to true).
      // For each, false is the same as not present. The default status is "inactive"; that is, neither present.
      "ready": true,
      "active": false,

      // Base-64 blob, or not present. An empty string is the same as not present.
      "secureDeviceAddress": "ryY=",

      // During member initialization, if any members in the list fail, this member will also fail.
      // Can't be set on large sessions.
      "initializationGroup": [ 5 ],

      // List of the groups I'm in and the encounters I just had.
      // An encounter is a brief interaction with a group. When an encounter is reported, it counts as retroactively joining the group 30 seconds ago and just now leaving.
      // Group names use the session name validation rules (like case-insensitive).
      // On large sessions, groups are used to report who played with whom (rather than just session membership). Members
      // who are active in at least one group together at the same time are counted as playing together.
      // Empty lists are the same as no value specified.
      // The set of encounters is a point-in-time property, so it's immediately consumed and will never appear on a response.
      "groups": [ "team-buzz", "posse.99" ],
      "encounters": [ "CoffeeShop-757093D8-E41F-49D0-BB13-17A49B20C6B9" ],

      // Optional list of role preferences that the player has specified for role-based game modes.
      // All role names have to match across all members in the session. Role weights are
      // defined from 0-100.
      "RolePreference": { "medic": 75, "sniper": 25, "assault": 50, "support": 100 },

      // Quality of Service (QoS) measurements by lowercase device token.
      // Like all fields, "measurements" must be updated as a whole. It should be set once when measurement is complete, not incrementally.
      // Metrics can be omitted if they weren't successfully measured; that is, the peer is unreachable.
      // If a "measurements" object is set, it can't contain an entry for the member's own address.
      "measurements": {
        "e69c43a8": {
          "bandwidthDown": 19342,  // Kilobits per second.
          "bandwidthUp": 944,  // Kilobits per second.
          "custom": { }
        }

      // QoS measurements by game-server connection string. Like all fields, "serverMeasurements" must be updated as a whole, so it should be set once when measurement is complete.
      // If empty, it means that none of the measurements were completed within the "serverMeasurementTimeout".
      "serverMeasurements": {
        "server farm a": {
          "latency": 233  // Milliseconds.
        }
      },

      // Subscriptions for shoulder taps on session changes. The "profile" indicates which session changes to tap and other properties of the registration like the minimum time between taps.
      // The subscription is named with a title-generated GUID that's also sent back with the tap as a context ID.
      // Subscriptions can be added and removed individually, without affecting other subscriptions in the "subscriptions" object.
      // To remove a subscription, set its context ID to null.
      // (Like the "ready" and "active" flags, the "subscriptions" data is copied out and maintained internally, so the normal replace-all rule on system fields doesn't apply to "subscriptions".)
      // Can't be set on large sessions.
      "subscriptions": {
        "961dc162-3a8c-4982-b58b-0347ed086bc9": {
          "profile": "party",  // Or "matchmaking", "initialization", "roster", "queuehost", or "queue".
          "onBehalfOfTitleId": "3948320593",  // Optional decimal title ID of the registered channel. If not set, the title ID is taken from the token.
        },
        "709fef70-4638-4b94-905b-24cb02706eb5": null
      }
    }
```

#### 서버 요소

*서버*는 세션에 참가했거나 초대된 비사용자입니다.
연관된 JSON 개체는 `/servers/{server-name}/constants/system` 및 `/servers/{server-name}/properties/system`입니다.
이러한 개체는 서버만 쓸 수 있습니다.

<Note>`/servers/{server-name}/constants/system` 개체는 현재 사용되지 않습니다.</Note>

### 세션 구성

다음과 같은 방법으로 세션의 구성을 제어할 수 있습니다.

* Partner Center를 통해 수집된 세션 템플릿을 사용합니다.
* 멀티플레이어 및 매치메이킹 API 또는 REST API에 대한 호출을 사용합니다. 여전히 템플릿을 사용해야 하지만 구성하려는 값을 포함할 필요는 없습니다. 타이틀은 템플릿에 이미 설정된 상수를 재정의할 수 없습니다.

세션 자체를 정의하기 위해 별도의 JSON 문서가 제공됩니다.
또한 특정 타이틀에 필요한 래퍼 기능을 구현해야 합니다.
JSON 문서와 모든 래퍼 코드의 내용은 서로 정확하게 반영되어야 하며 최신 템플릿 계약 버전을 반영해야 합니다.

세션에 대한 스키마는 세션 버전(주 버전)과 프로토콜 개정판(부 버전)으로 버전 관리됩니다.
버전은 X-Xbl-Contract-Version 헤더에 "100 \* major + minor"로 결합됩니다.
예를 들어, v1.7 타이틀은 최신 템플릿 계약 버전 107을 가정할 때 모든 REST 요청에 다음 헤더를 포함합니다: X-Xbl-Contract-Version: 107.

<Note>대부분의 타이틀(XBOX Services API(XSAPI)를 사용하는)은 계약 버전 105 및 세션 템플릿 버전 107을 사용하는 것을 권장합니다.</Note>

### 세션 템플릿

각 세션 템플릿은 서비스 구성의 일부인 JSON 문서로, 만들어지는 세션의 프레임워크를 정의하고 새 세션에 대한 상수를 제공합니다.
자세한 내용은 [멀티플레이어 세션 템플릿](/services/xbox-services/multiplayer/mpsd/concepts/live-session-templates)을 참조하세요.

[이 항목의 맨 위로 돌아갑니다.](#top)

<a id="session-capabilities" />

## 세션 기능

*기능*은 MPSD가 세션에 적용해야 하는 동작을 구성하는 MPSD 세션의 상수입니다.
가장 일반적으로 Partner Center를 사용하여 세션 템플릿에서 기능을 설정합니다.

기능은 `/constants/system/capabilities` 개체에 설정됩니다.
필요한 기능이 없는 경우 빈 `capabilities` 개체를 사용하세요.

<Note>타이틀은 멀티플레이어 API나 매치메이킹 API를 사용하여 세션 기능을 변경하거나 액세스하는 일이 거의 없습니다.</Note>

세션 기능은 [XblMultiplayerSessionCapabilities](/reference/live/xsapi-c/multiplayer_c/structs/xblmultiplayersessioncapabilities) 구조체로 표현됩니다.
이들은 세션이 지원할 수 있는 것을 나타내는 부울 값입니다.

* 연결
* 게임 플레이
* 대형 크기
* 활성 구성원에 대한 연결 필수

[XblMultiplayerSessionConstants](/reference/live/xsapi-c/multiplayer_c/structs/xblmultiplayersessionconstants) 구조체에는 세션 기능과 관련된 다음 속성을 정의하는 `SessionCapabilities` 구성원([XblMultiplayerSessionCapabilities](/reference/live/xsapi-c/multiplayer_c/structs/xblmultiplayersessioncapabilities) 유형)이 포함되어 있습니다.

* `CapabilitiesConnectivity`
* `CapabilitiesGameplay`
* `CapabilitiesLarge`

<Note>타이틀이 동적 세션 기능을 정의하는 경우 세션 상수에 대해 해당 속성이 `true`로 설정됩니다.</Note>

[이 항목의 맨 위로 돌아갑니다.](#top)

<a id="session-size" />

## 세션 크기

MPSD 세션의 크기는 해당 세션의 구성원 수에 의해 결정됩니다.

### 최대 세션 크기

세션의 최대 크기는 수용할 수 있는 최대 세션 구성원 수입니다.
[XblMultiplayerSessionConstants](/reference/live/xsapi-c/multiplayer_c/structs/xblmultiplayersessionconstants)`::MaxMembersInSession` 속성으로 표현됩니다.
최대 구성원 크기는 `/constants/system` 개체에 설정됩니다.

최대 세션 크기는 1에서 100 사이의 세션 구성원이며, 만들 때 설정되지 않은 경우 기본값은 100입니다.
필요한 크기가 100을 초과하면 세션은 "대형" 세션으로 불리며 특별한 방법으로 설정됩니다.

#### 연결 끊김

세션에 최대 크기를 설정하면 특정 연결 끊김 시나리오에서 열린 슬롯이 가득 찬 것으로 표시될 수 있습니다.
예를 들어 네트워크 또는 정전으로 인해 플레이어의 연결이 끊어졌다면, 이 지연은 즉시 세션에 반영되지 않습니다.
구성원은 연결 끊김 감지 기능을 사용하여 Inactive로 설정됩니다. 자세한 내용은 Multiplayer Session Directory 개요 항목의 [MPSD 변경 알림 처리 및 연결 끊김 감지](/services/xbox-services/multiplayer/mpsd/live-mpsd-overview#mpsd-change-notification-handling-and-disconnect-detection) 섹션을 참조하세요.

이에 비해 하트비트를 사용하여 연결 끊김을 감지하는 피어 메시는 종종 2\~3초 이내에 연결 끊김을 인식하고 플레이어 슬롯을 즉시 열 수 있습니다.
그러나 중재자는 다른 구성원을 제거할 수 없습니다.

### 대형 세션

대형 MPSD 세션은 최대 1,000명의 구성원을 가질 수 있지만, 모든 구성원 목록 가져오기와 같은 일부 세션 기능이 비활성화됩니다.
세션 대형성은 [XblMultiplayerSessionCapabilities](/reference/live/xsapi-c/multiplayer_c/structs/xblmultiplayersessioncapabilities)`::Large` 속성으로 표현됩니다.

이 속성은 대형 세션을 나타내기 위해 `true`로 설정됩니다. "large" 기능은 `/constants/system/capabilities` 개체에 표시됩니다.
자세한 내용은 [세션 기능](#session-capabilities)을 참조하세요.

[이 항목의 맨 위로 돌아갑니다.](#top)

<a id="session-user-states" />

## 세션 사용자 상태

MPSD는 *사용자 상태*를 세션에 추가된 사용자의 상태로 정의합니다.
가능한 사용자 상태는 [XblMultiplayerSessionStatus](/reference/live/xsapi-c/multiplayer_c/enums/xblmultiplayersessionstatus) 열거형에 의해 정의됩니다.
사용자는 세션에 추가되기 전에 "사용 가능" 상태로 간주되기도 합니다.

세션 사용자 상태를 변경하는 데 [XblMultiplayerSessionCurrentUserSetStatus](/reference/live/xsapi-c/multiplayer_c/functions/xblmultiplayersessioncurrentusersetstatus)를 사용할 수 있습니다.
REST의 경우 게임 세션 JSON 문서에서 `/members/{index}/properties/system`을 올바르게 설정하여 이 변경을 수행합니다.

### Reserved 사용자 상태

중재자가 세션 내에서 열린 슬롯 중 하나를 채우기 위해 사용자를 선택한 경우 사용자는 Reserved 사용자 상태에 놓입니다.
이 상태에서 사용자는 아직 공식적으로 세션 초대를 수락하지 않았거나 피어와의 연결을 시작하기 위해 세션에 참가하지 않았습니다.

### Active 사용자 상태

사용자가 Active 상태에 있을 때 타이틀은 사용자를 대신하여 세션에 참가했으며, 사용자는 세션에 적극적으로 참여하고 있습니다.
사용자는 게임을 플레이하는 한 이 상태를 계속 유지합니다.

타이틀이 처음 시작되면 일반적으로 세션 상태를 확인하여 사용자가 이미 세션의 구성원인지 확인해야 합니다.
사용자가 세션 구성원이면 타이틀은 게임으로 바로 진입하고 참여 중인 로컬 구성원을 Active 사용자 상태로 설정할 수 있습니다.

사용자는 세션에서 플레이하는 동안 Active 상태를 유지해야 합니다.
사용자가 게임 내 UI를 사용하여 세션을 나가면, [XblMultiplayerSessionLeave](/reference/live/xsapi-c/multiplayer_c/functions/xblmultiplayersessionleave)를 호출하여 세션에서 제거해야 합니다.
타이틀이 제약된 상태와 같이 사용자가 게임에서 일시적으로 자리를 비웠을 때는, 사용자를 Active 상태로 합리적인 시간 동안 유지해야 합니다.

사용자가 타이틀 지정 시간 동안 돌아오지 않는 경우 사용자 상태를 Inactive로 변경하는 것이 적절합니다.

### Inactive 사용자 상태

Inactive 상태에서 사용자는 현재 게임에 참여하고 있지 않지만 여전히 세션에 저장된 슬롯이 있습니다.
즉, 사용자는 "활성 상태가 아닙니다."

세션에서 사용자를 Inactive 사용자 상태로 설정할 책임은 사용자 자신의 콘솔에 있습니다.
중재자는 이 작업을 수행할 수 없습니다.

사용자가 Inactive 상태로 전환되는 예제 시나리오는 다음과 같습니다.

* 타이틀이 Suspending 이벤트를 받습니다.

* 사용자가 타이틀 정의 시간 동안 비활성(입력 또는 컨트롤러 응답 없음) 상태에 있었습니다. 경쟁 멀티플레이어 게임의 경우 2분을 권장합니다.

* 타이틀이 2분 이상 또는 타이틀 정의 시간 동안 제약 모드에 있었습니다. 이 제약 모드 시간 초과 기간은 관련 앱이나 타이틀과 관련된 다른 경험을 사용하기 위해 사용자가 타이틀에서 떠나 있을 예상 시간입니다.

* 사용자가 세션에서 비정상적으로 연결이 끊어졌습니다. 자세한 내용은 Multiplayer Session Directory 개요 항목의 [MPSD 변경 알림 처리 및 연결 끊김 감지](/services/xbox-services/multiplayer/mpsd/live-mpsd-overview#mpsd-change-notification-handling-and-disconnect-detection) 섹션을 참조하세요.

타이틀이 시작되고 특정 세션 구성원의 사용자 상태가 Inactive로 설정되어 있으면, 타이틀이 일시 중단되었거나 사용자가 세션에서 너무 오랫동안 비활성 상태였다는 뜻입니다.
타이틀이 다시 시작되고 있기 때문에, 이 신호는 사용자가 자신이 속한 게임 세션을 계속하고 싶다는 것을 나타냅니다.

타이틀 시작 시 사용자의 상태가 Active이면 이 상황은 아마도 네트워크 연결 끊김이나 타이틀이 중단되기 전에 사용자를 Inactive로 설정할 수 없었던 다른 시나리오 때문일 것입니다.
이 두 경우 모두, 타이틀은 사용자를 게임에 다시 연결하려고 시도하고 다른 사용자가 계속 플레이할 수 있도록 하거나 사용자를 세션에서 제거해야 합니다.

### 세션이 끝났을 때의 사용자 상태

세션이 끝나면 게임 플레이가 중단됩니다.
타이틀은 모든 사용자가 [XblMultiplayerSessionLeave](/reference/live/xsapi-c/multiplayer_c/functions/xblmultiplayersessionleave)를 사용하여 자신을 제거할 수 있도록 허용해야 합니다.
사용자와 연결된 세션 액티비티는 사용자가 세션을 나갈 때 자동으로 지워집니다.

[이 항목의 맨 위로 돌아갑니다.](#top)

<a id="visibility-and-joinability" />

## 표시 여부 및 참가 가능성

세션 액세스는 세션 표시 여부와 세션 참가 가능성이라는 두 가지 설정으로 MPSD 수준에서 제어됩니다.
이 항목에서 제공하는 표시 여부 및 참가 가능성 권장 사항은 가장 일반적인 타이틀 시나리오에 적용됩니다.
가능한 경우 타이틀은 이러한 설정을 따라야 합니다. 타이틀은 새 플레이어가 세션에 승인되는지에 대한 최종 권위 있는 결정을 내리기 위해 타이틀 내 로직을 사용해야 합니다.

### 세션 표시 여부

*세션 표시 여부*는 세션 생성 시 설정되는 상수로 표현됩니다.
일반적으로 세션 템플릿에 정의되며, 어떤 유형의 사용자가 세션에 대한 읽기 및 쓰기 액세스 권한을 갖는지 결정합니다.

세션 표시 여부에 대한 가능한 값은 [XblMultiplayerSearchHandleGetVisibility](/reference/live/xsapi-c/multiplayer_c/functions/xblmultiplayersearchhandlegetvisibility)에 의해 정의됩니다.
JSON 파일에서 표시 여부 상수에 허용되는 설정은 `open`, `visible`, `private`입니다.

#### 권장 게임 세션 표시 여부: open

Open 게임 세션은 플레이어 예약이 필요하지 않으며, 이는 초대 프로세스를 단순화합니다.

중재자는 초대를 보낸 후 MPSD에서 플레이어를 예약하지 않고, 초대된 플레이어만 로컬로 추적합니다.
그 결과, 플레이어는 즉시 중재자에 연결하고 세션에 참가할지, 거부되는지, 대기해야 하는지(대기 플레이어를 지원하는 경우)를 결정할 수 있습니다.

중재자는 궁극적인 권한자입니다. 중재자가 응답하고 새 구성원에게 세션에 남아 있거나 나가라고 지시합니다.

Open 게임 세션 표시 여부를 사용하려면 최종 결정이 내려지기 전에 초대된 플레이어가 타이틀을 시작하고 중재자에 연결해야 합니다.
세션이 가득 찼거나 초대가 거부된 경우 사용자에게 오류 메시지를 표시할 수 있습니다.

중재자에 대한 연결을 설정하려면 보안 디바이스 주소가 필요합니다.
[XblMultiplayerSessionProperties](/reference/live/xsapi-c/multiplayer_c/structs/xblmultiplayersessionproperties)`::HostDeviceToken` 속성은 어떤 세션 구성원이 세션의 현재 중재자이며, 초대된 플레이어가 연결에 사용해야 하는 보안 디바이스 주소가 무엇인지 확인하는 데 사용됩니다.

### 세션 참가 가능성

*세션 참가 가능성*은 어떤 유형의 사용자가 세션에 참가할 수 있는지 결정합니다.
세션 중에 동적으로 설정할 수 있습니다.

세션 참가 가능성에 대한 가능한 값은 다음과 같습니다.

* **None(기본값):** 세션에 참가할 수 있는 사람에게는 제한이 없습니다.
* **Local:** 로컬 사용자만 세션에 참가할 수 있습니다.
* **Followed:** 로컬 사용자와 다른 세션 구성원이 팔로우하는 사용자만 예약 없이 세션에 참가할 수 있습니다.

세션 중재자는 참가 가능성 설정을 통해 비공개 세션을 만들 수 있습니다.
참가 가능성을 local 또는 followed로 설정하면 세션 액세스가 제한되고 비공개로 설정됩니다.

중재자는 필요한 경우 이전 세션 초대가 호스트 수준에서 거부될 수 있도록 세션 참가 가능성도 추적해야 합니다.
예를 들어 초대된 플레이어가 세션이 이미 가득 찰 때까지 참가하지 않은 경우, 중재자는 참가하는 플레이어에게 세션이 잠겼고 자동으로 세션을 떠나야 함을 알릴 수 있습니다.

[이 항목의 맨 위로 돌아갑니다.](#top)

<a id="session-timeouts" />

## 세션 시간 초과

세션은 타이머 및 기타 외부 이벤트에 의해 변경될 수 있습니다.
*세션 시간 초과*는 세션 구성원이 자동으로 비활성으로 만들어지거나 세션에서 제거되기 전에 특정 상태로 유지될 수 있는 기간을 정의합니다.
MPSD는 또한 세션 수명 관리를 위한 시간 초과를 지원합니다.

<Note>시간 초과 설정은 템플릿 계약 버전 104 또는 105의 경우 `/constants/system/timeouts`에서 또는 managed initialization 개체 내에서 이루어집니다. 버전 107 이상의 경우 설정은 `/constants/system`에서 개별적으로 이루어지거나 managed initialization 개체 내에서 이루어집니다.</Note>

타이머가 만료되면 MPSD는 그 순간 세션을 자동으로 업데이트하거나 변경 사항에 대해 중재자에게 알리지 않습니다.
세션 및 시간 초과 상태는 읽기 또는 쓰기 요청이 전송되기 직전에만 업데이트됩니다.
즉각적인 업데이트는 반환되는 데이터가 가장 최신임을 보장합니다.

<Note>세션 시간 초과는 누적되지 않습니다. 업데이트에서 각 세션 구성원에 대한 상태 전환에 하나만 적용됩니다.</Note>

### 현재 정의된 시간 초과

이 섹션에서는 MPSD에서 현재 정의된 시간 초과에 대해 설명합니다.

* 모든 시간 초과는 밀리초 단위로 지정됩니다.
* 0 값이 허용되며 즉시 시간 초과를 나타냅니다.
* 값이 없는 시간 초과는 무한으로 간주됩니다.

시간 초과에 기본값이 있으므로 무한 시간 초과에 대해서는 명시적으로 `null`을 지정해야 합니다.

#### evaluationTimeout

이 시간 초과는 세션 구성원이 평가 결정을 내리고 업로드할 시간의 양을 나타냅니다.
결정이 수신되지 않으면 결정은 실패로 간주됩니다.
이 시간 초과는 managed initialization 개체에 배치됩니다.

#### inactiveRemovalTimeout

이 시간 초과는 세션에 참가했지만 현재 게임에 참여하지 않는 세션 구성원에 대해 설정됩니다.
기본적으로 구성원은 2시간 후에 세션에서 제거됩니다.

<Note>이 시간 초과는 템플릿 계약 버전 104 또는 105의 경우 inactive 시간 초과로 지정됩니다.</Note>

많은 경우 inactive 시간 초과를 0으로 설정하는 것이 좋습니다. 그러면 Inactive 상태로 설정된 모든 사용자가 즉시 세션에서 제거되고 해당 슬롯이 지워집니다.
이 동작은 사용자가 비활성 상태이거나 Inactive 상태에 도달한 경우 새 플레이어를 빠르게 추가할 수 있도록 대부분의 경쟁 멀티플레이어 게임에 바람직합니다.

협동 또는 기타 멀티플레이어 디자인의 경우, 사용자가 연결이 끊기거나 일정 기간 동안 타이틀에 참여하지 않는 경우 다시 연결할 시간을 더 많이 허용하도록 타이틀에서 원할 수 있습니다.
모든 디자인 시나리오에 맞는 단일 솔루션은 없다는 점에 유의하세요.

#### joinTimeout

이 시간 초과는 사용자가 세션에 참가해야 하는 밀리초 수를 나타냅니다.
세션 참가에 실패한 사용자에 대한 예약이 제거됩니다.
이 시간 초과는 managed initialization 개체에 배치됩니다.

#### measurementTimeout

이 시간 초과는 세션 구성원이 측정을 업로드해야 하는 시간의 양을 나타냅니다.
측정 업로드에 실패한 구성원은 "timeout" 실패 이유로 표시됩니다.
이 시간 초과는 managed initialization 개체에 배치됩니다.

<Note>매치메이킹 중에는 QoS 측정에 대해 45초 시간 초과가 적용됩니다. 그 결과 매치메이킹 중 30초 이하의 측정 시간 초과를 사용하는 것을 권장합니다.</Note>

#### readyRemovalTimeout

이 시간 초과는 세션에 참가하고 게임에 진입하려는 세션 구성원에 대해 설정됩니다.
이는 일반적으로 셸이 타이틀을 대신하여 사용자를 참가시켰고 타이틀이 시작되는 것을 의미합니다.
기본적으로 구성원은 3분 후에 세션에서 제거되고 Inactive 상태로 설정됩니다.

<Note>이 시간 초과는 계약 버전 104 또는 105의 경우 ready 시간 초과로 지정됩니다.</Note>

#### reservedRemovalTimeout

이 시간 초과는 다른 사람이 세션에 추가했지만 아직 세션에 참가하지 않은 세션 구성원에 대해 설정됩니다.
시간 초과가 만료되면 예약이 삭제되고 구성원은 비활성으로 간주됩니다.
기본값은 30초입니다.

<Note>이 시간 초과는 계약 버전 104 또는 105의 경우 reserved 시간 초과로 지정됩니다.</Note>

#### sessionEmptyTimeout

이 시간 초과는 세션이 비어지고 나서 세션이 삭제되기까지의 밀리초 수를 나타냅니다.
기본값은 0입니다.

<Note>이 시간 초과는 계약 버전 104 또는 105의 경우 `sessionEmpty` 시간 초과로 지정됩니다.</Note>

### 세션 시간 초과 예제

1. 세션이 네 명의 플레이어로 시작됩니다.

2. 두 명의 플레이어 A와 B가 정전으로 인해 연결이 끊어집니다. 게임에서의 상태는 Active로 유지됩니다.

3. 다른 두 명의 플레이어 C와 D는 [XblMultiplayerSessionLeave](/reference/live/xsapi-c/multiplayer_c/functions/xblmultiplayersessionleave)를 사용하여 올바르게 종료합니다.

4. 세션은 열린 상태로 유지됩니다. 플레이어 A와 B는 연결이 끊어졌지만 여전히 Active 상태입니다.

5. 며칠 후 플레이어 A가 돌아와서 게임을 시작합니다.

6. 플레이어 A의 게임은 플레이어 A가 구성원인 세션을 확인하고(읽기 수행) 며칠 전의 고아 세션을 찾습니다.

7. 세션은 여전히 세션에 있는 두 명의 플레이어(A와 B)에 대해 존재 여부 확인을 수행합니다.
   1. 플레이어 A가 타이틀을 실행 중이므로 플레이어 A에 대한 존재 여부 확인이 성공합니다. 매치에서 플레이어의 Active 상태는 그대로 유지됩니다.
   2. 플레이어 B는 타이틀을 실행하고 있지 않습니다. 그 결과 플레이어 B에 대한 존재 여부 확인이 실패합니다. 서비스가 플레이어 B의 상태를 Inactive로 설정합니다. 이때 플레이어 B에 대한 inactive 시간 초과가 시작됩니다.

8. 플레이어 A는 [XblMultiplayerSessionLeave](/reference/live/xsapi-c/multiplayer_c/functions/xblmultiplayersessionleave) 메서드를 사용하여 세션을 올바르게 종료합니다.

9. 플레이어 B에 대한 inactive 시간 초과가 만료되고, 플레이어 B는 누군가가 수행하는 다음 읽기 또는 쓰기에서 세션에서 제거됩니다.

10. 이제 세션에는 구성원이 0명이며 서비스에서 제거됩니다.

예제 세션에 대한 inactive 시간 초과가 0으로 설정된 경우, 플레이어 B는 7.1단계의 존재 여부 확인 직후에 시간 초과되며 아마도 세션 쓰기에 의해 제거됩니다.
이 경우 세션은 세션에 대한 추가 읽기나 쓰기 없이 닫힙니다.

[이 항목의 맨 위로 돌아갑니다.](#top)

<a id="multiple-signed-in-users-on-a-single-console" />

## 단일 콘솔의 여러 로그인 사용자

여러 사용자가 동일한 콘솔에 로그인되어 있는 경우, 일부 사용자는 게임 세션에 있고 다른 사용자는 세션에 없거나 현재 타이틀에서 활성 상태가 아닐 수 있습니다.
게임 초대는 여러 사용자에 대해 수신 및 수락될 수 있으며, 이는 게임 세션 구성원 자격에 영향을 미칩니다.
타이틀이 모든 세션 구성원 자격 시나리오를 올바르게 처리할 수 있도록 이 정보를 고려하세요.

일반적인 시나리오에서는 새 플레이어가 로그인하고 게임에서 활성 상태가 되며 기존 게임 세션에 추가되어야 합니다.
새 게임 세션을 만들 때와 마찬가지로, 타이틀은 게임 플레이 중에 적절한 시기에만 사용자를 추가해야 합니다.

여러 로그인 사용자가 있을 때 하나 이상의 사용자가 다른 게임 세션에 초대를 받을 수도 있습니다.
타이틀은 이러한 시나리오를 특별한 방식으로 처리할 필요가 없습니다.
세션 상태 및 구성원 이벤트는 게임 세션 및 사용자 구성원 자격에 대한 업데이트를 타이틀에 알립니다.

온라인 세션에 대한 여러 로그인 사용자를 처리하기 위해, 타이틀은 각 사용자에 대해 별도의 `XboxLiveContext Class` 개체를 사용하여 모든 사용자에 대한 숄더 탭을 구독합니다.
타이틀은 [XblMultiplayerSessionInfo](/reference/live/xsapi-c/multiplayer_c/structs/xblmultiplayersessioninfo)`::ChangeNumber` 속성을 사용하여 세션의 특정 변경 사항을 결정하고 중복된 숄더 탭을 무시합니다.

[이 항목의 맨 위로 돌아갑니다.](#top)

<a id="process-lifecycle-management" />

## 프로세스 수명 관리

멀티플레이어가 아닌 타이틀과 마찬가지로, 멀티플레이어 세션의 타이틀은 타이틀 일시 중단 및 프로세스 수명 이벤트의 종료를 만날 수 있습니다.
그 결과 세션 중재자는 세션 상태를 주기적으로 저장해야 합니다.

중재자가 일시 중단될 경우 타이틀은 중재자 마이그레이션을 시도하고 필요에 따라 게임 상태를 저장해야 합니다. 그러면 새로운 중재자가 세션 상태를 복원할 수 있습니다.
그러면 세션이 MPSD에서 여전히 유효한 경우 나중에 전체 멀티플레이어 세션을 일시 중단하고 다시 시작하는 것이 가능합니다.

일반적으로 게임 호스트인 한 명의 지정된 피어만 글로벌 게임 상태를 업데이트해야 합니다.

### 게임 메타데이터 저장

타이틀은 게임 메타데이터를 MPSD 세션에 저장합니다.
게임 메타데이터는 세션 데이터를 표시하고 타이틀이 게임 세션을 찾아 참가할 수 있도록 하는 데 필요한 정보입니다.

타이틀은 플레이어별 메타데이터를 세션 구성원에 대한 사용자 지정 속성 섹션에 저장합니다. 예를 들어 플레이어 색상 및 세션에 대해 선호하는 플레이어 무기 등입니다.
현재 맵과 같이 세션 전체 메타데이터는 MPSD 세션의 전역 사용자 지정 속성 섹션에 저장됩니다.

### 게임 상태 저장

게임 상태는 Title Storage 서비스를 사용하여 TMS에 저장됩니다.
이 위치를 사용하는 저장소는 타이틀이 권한 문제 없이 중재자를 마이그레이션할 수 있도록 합니다.
자세한 내용은 [중재자 마이그레이션](/services/xbox-services/multiplayer/concepts/live-migrating-an-arbiter)을 참조하세요.

<Note>타이틀은 일시 중단되지 않는 한 5분에 한 번 이상 게임 상태를 TMS에 저장하려고 시도해서는 안 됩니다.</Note>

[이 항목의 맨 위로 돌아갑니다.](#top)

<a id="cleanup-of-inactive-sessions" />

## 비활성 세션 정리

`sessionEmptyTimeout`이 0으로 설정된 경우 마지막 플레이어가 세션을 나갈 때 MPSD 세션이 자동으로 삭제됩니다.
충돌이나 연결 끊김 후 사용되지 않은 세션에 플레이어가 남아 있지 않도록 하는 방법을 알아보려면 Multiplayer Session Directory 개요 항목의 [MPSD 변경 알림 처리 및 연결 끊김 감지](/services/xbox-services/multiplayer/mpsd/live-mpsd-overview#mpsd-change-notification-handling-and-disconnect-detection) 섹션을 참조하세요.
충돌이나 연결 끊김 후 사용되지 않은 세션의 부적절한 처리는 타이틀이 플레이어에 대한 세션을 쿼리할 때 문제를 일으킬 수 있습니다.

비활성 세션을 정리하려면 타이틀이 [XblMultiplayerGetSessionAsync](/reference/live/xsapi-c/multiplayer_c/functions/xblmultiplayergetsessionasync)를 호출하여 특정 사용자에 대한 모든 세션을 쿼리한 다음 세션을 평가하도록 하는 것을 권장합니다.
타이틀이 오래된 세션을 만나면, 타이틀은 세션의 모든 로컬 플레이어에 대해 [XblMultiplayerSessionLeave](/reference/live/xsapi-c/multiplayer_c/functions/xblmultiplayersessionleave)를 호출합니다.
이 호출은 결국 구성원 수를 0으로 낮추고 세션을 정리합니다.

[이 항목의 맨 위로 돌아갑니다.](#top)

<a id="session-arbiter" />

## 세션 중재자

일부 멀티플레이어 메서드는 게임 세션 내의 한 클라이언트에서만 호출되어야 합니다.
이 클라이언트는 *중재자* 또는 호스트라고 하며, 세션에 참여하고 있는 콘솔 중 하나입니다.
게임에 최소 한 명의 세션 구성원이 있는 경우, 세션은 진행 중인 참가를 모니터링할 중재자를 가져야 합니다.

### 중재자 설정

세션이 클라이언트에 의해 만들어지면 하나의 콘솔이 중재자로 지정됩니다.
자세한 내용은 멀티플레이어 작업 항목의 [MPSD 세션에 대한 중재자 설정](/services/xbox-services/multiplayer/mpsd/how-to/live-mpsd-how-tos#set-an-arbiter-for-an-mpsd-session) 섹션을 참조하세요.

### 세션 상태 저장

[프로세스 수명 관리](#process-lifecycle-management) 섹션에서 설명한 것처럼, 중재자는 세션 상태를 주기적으로 저장해야 합니다.
새 중재자는 타이틀에 의한 중재자 마이그레이션이 발생하는 경우 세션 상태를 복원할 수 있어야 합니다.
자세한 내용은 [중재자 마이그레이션](/services/xbox-services/multiplayer/concepts/live-migrating-an-arbiter)을 참조하세요.

### 게임 세션 구성원 및 진행 중인 참가 관리

세션 중재자의 가장 중요한 역할은 플레이하러 게임 세션에 들어오는 사용자를 관리하는 것입니다.
여기에는 게임 초대 처리, 대기 중인 플레이어에게 알림 전송, 게임을 종료하는 플레이어 처리가 포함됩니다.

#### 알림 수신

중재자는 [XblMultiplayerSessionChangedHandler](/reference/live/xsapi-c/multiplayer_c/functions/xblmultiplayersessionchangedhandler)를 사용하여 게임 세션에 참가하려는 새 플레이어를 수신 대기해야 합니다.

#### 비어있는 게임 세션 슬롯을 채울 플레이어 찾기

중재자는 다음 작업 중 하나를 사용하여 비어있는 게임 세션 슬롯을 채울 플레이어를 찾습니다.

* 타이틀이 로비 세션이나 지연된 참가를 허용하는 다른 메커니즘을 사용한다면 해당 메커니즘을 사용하여 새 세션 구성원을 찾습니다.
* 다른 매치 티켓 세션을 만듭니다.

자세한 내용은 멀티플레이어 작업 항목의 [매치메이킹 중 열려 있는 세션 슬롯 채우기](/services/xbox-services/multiplayer/mpsd/how-to/live-mpsd-how-tos#fossdm) 섹션을 참조하세요.

#### 초대된 세션 구성원 처리

중재자는 초대된 세션 구성원을 모니터링하고 단일 사용자에 대한 초대 사이에 최소 간격을 적용해야 합니다.
자세한 내용은 멀티플레이어 작업 항목의 [게임 초대 전송](/services/xbox-services/multiplayer/mpsd/how-to/live-mpsd-how-tos#sgi) 섹션을 참조하세요.


## Related topics

- [중재자 마이그레이션](/ko/services/xbox-services/multiplayer/concepts/live-migrating-an-arbiter.md)
- [멀티플레이어 세션 템플릿](/ko/services/xbox-services/multiplayer/mpsd/concepts/live-session-templates.md)
- [XblMultiplayerSessionStatus](/ko/reference/live/xsapi-c/multiplayer_c/enums/xblmultiplayersessionstatus.md)
- [XblMultiplayerSessionVisibility](/ko/reference/live/xsapi-c/multiplayer_c/enums/xblmultiplayersessionvisibility.md)
- [XblMultiplayerSessionCapabilities](/ko/reference/live/xsapi-c/multiplayer_c/structs/xblmultiplayersessioncapabilities.md)
