마스터 데이터의 CI/CD
GitHub Actions 등을 사용한 마스터 데이터 자동 업데이트
| 용어 | 의미 |
|---|---|
| 모델 마스터 | 마스터 데이터 에디터가 임시로 등록하는, 게임 플레이어별로 달라지지 않는 데이터 |
| 모델 | 게임 내에서 사용하는, 게임 플레이어별로 달라지지 않는 데이터 |
| 프로퍼티 | 모델을 바탕으로 작성한, 게임 플레이어별로 다른 데이터 |
게임을 구성하는 요소에는 소지 아이템의 파라미터나 퀘스트의 구성 데이터 등, 게임 플레이어별로는 달라지지 않는 데이터가 있습니다. 이러한 데이터를 GS2에서는 모델 이라고 부릅니다. 그리고 모델을 바탕으로 게임 플레이어가 소지하는 데이터가 된 것을 프로퍼티 라고 부릅니다.
일반적인 마스터 데이터는 GS2에서는 모델 에 해당하며, GS2에는 모델 마스터 라는 개념이 존재합니다. 모델 / 모델 마스터 의 차이는 데이터의 내용은 동일하지만, 실제로 게임에서 액세스되는 상태인지 여부에 있습니다.
graph TD
subgraph "관리용 데이터"
Master[모델 마스터]
end
subgraph "실행용 데이터"
Model[모델]
end
subgraph "플레이어 데이터"
Property[프로퍼티]
end
Master -- "내보내기/반영 (Current)" --> Model
Model -- "인스턴스화" --> PropertyGS2의 관리 화면에서 편집할 수 있는 데이터는 모델 마스터 이며, 이를 실제로 게임 내에서 사용할 수 있는 상태로 변환하면 모델 로 바뀝니다. 이 변환 공정이 필요한 이유는 모델 마스터 에 대한 변경을 일괄로 게임 내에 반영하기 위해서입니다. 이 공정이 없으면 관리 화면에서 데이터를 갱신해 나가는 과정에서, 중간 단계의 데이터가 게임 내에 반영되어 버리게 됩니다.
이 변환 공정은 모든 모델 마스터 를 일단 JSON 형식의 파일로 내보내고, 그 JSON 파일을 업로드함으로써 일괄적으로 모델 로 반영하는 구조로 되어 있습니다. GS2의 관리 화면에서 모델 마스터 를 조작하여 JSON 형식의 파일로 내보내서 이용해도 되지만, Excel이나 자체 관리 도구를 만들어 GS2에 모델 마스터 를 전혀 등록하지 않고 모델 에 데이터를 반영하는 것도 가능합니다.
또한, GS2-Deploy 템플릿 내에서 마스터 데이터를 관리할 수도 있습니다. 이 경우 git 등의 버전 관리 도구 로 다루기 쉬워지므로, 이 방법도 검토해 보십시오.
운영상 편리한 방법으로 마스터 데이터를 관리하십시오.
GS2TemplateFormatVersion: "2019-05-01"
Description: GS2 master data template Version 2010-06-26
Globals:
Alias:
NamespaceName: inventory
Resources:
Namespace:
Type: GS2::Inventory::Namespace
Properties:
Name: ${NamespaceName}
NamespaceSettings:
Type: GS2::Inventory::CurrentItemModelMaster
Properties:
NamespaceName: ${NamespaceName}
Settings: # 이 아래의 데이터는 본래 JSON으로 지정하는 부분이지만, yaml로 작성해도 반영할 수 있습니다
version: 2019-02-05
inventoryModels:
- name: item
metadata: ITEM
initialCapacity: 40
maxCapacity: 60
itemModels:
- name: item-0001
metadata: ITEM_0001
maxCount: 99
sortValue: 1
- name: item-0002
metadata: ITEM_0002
maxCount: 99
sortValue: 2
- name: item-0003
metadata: ITEM_0003
maxCount: 99
sortValue: 3
- name: character
metadata: CHARACTER
initialCapacity: 30
maxCapacity: 50
itemModels:
- name: character-0001
metadata: CHARACTER_0001
maxCount: 1
sortValue: 1
DependsOn:
- Namespace플레이어가 로그인 중에 마스터 데이터가 갱신되어도 불일치가 발생하지 않도록, 플레이어가 사용하는 마스터 데이터를 특정 일시 시점의 내용으로 고정화하는 구조가 마련되어 있습니다.
gs2 = await gs2.Distributor.Namespace(
"namespace-0001"
).Me(
_gameSession
).FreezeMasterDataAsync();이처럼 GS2-Distributor 의 FreezeMasterData 를 호출함으로써, 이 API를 호출한 시점의 마스터 데이터 내용으로 이후의 API를 처리할 수 있습니다. 단, 고정 가능한 것은 30일 이내이며 각 마이크로서비스의 마스터 데이터에서 10세대 전까지의 내용입니다. 이 제한을 초과하면 최신 마스터 데이터를 사용하게 됩니다.
WebSocketSession 의 연속 접속 가능 시간은 2시간이므로, WebSocketSession 의 OnDisconnect 가 호출되었을 때 재접속 처리를 수행하는 시점에 재고정화할 것을 권장합니다. 재고정화할 때는 마스터 데이터의 갱신 여부를 GS2-Version 등으로 확인하고, 갱신이 있는 경우에는 타이틀 화면으로 되돌리는 등의 대응도 검토하십시오.
GS2-Version 으로 마스터 데이터의 갱신 판정에 대해 권장되는 구현
마스터 데이터 버전을 마스터 데이터 갱신 시점의 YYYY.MMDD.HHMM 형식으로 VersionModel 에 warningVersion 으로 등록합니다. 클라이언트는 WebSocketSession 재접속 시 마스터 데이터의 고정화 시점의 일시로 버전 체크를 실행합니다. 만약 경고에 해당하는 경우에는 마스터 데이터의 갱신이 있다는 것이므로, 타이틀로 돌아가는 등 정합성을 유지하면서 현재 시각으로 재고정화하도록 합니다.
GitHub Actions 등을 사용한 마스터 데이터 자동 업데이트