Documentation index for AI agents

SDK의 캐시 메커니즘

GS2 SDK가 내부에 보유하는 캐시의 구조와, 이를 활용하기 위한 설계 지침

GS2의 Game Engine용 SDK(GS2 SDK for Unity, GS2 SDK for Unreal Engine, GS2 SDK for Godot 등)에는, 서버에서 취득한 데이터를 SDK 내부에 캐싱하는 메커니즘이 내장되어 있습니다. 이 캐시 메커니즘을 이해하면, API 호출 횟수를 줄여 게임의 응답성과 비용을 모두 개선할 수 있습니다.

캐시의 기본 동작

Domain 객체(gs2.Inventory.Namespace(...).Me(...).Inventory(...)와 같은 접근)를 통해 데이터를 취득하면, 취득한 데이터는 SDK 내부의 캐시에 보관됩니다. 동일한 리소스에 대한 재취득은 서버에 문의하지 않고 캐시에서 반환됩니다.

따라서 UI 각 부분에서 필요한 값을 매번 서버에서 가져오지 않아도, Domain 객체를 통해 몇 번이든 안심하고 값을 참조할 수 있습니다.

캐시의 자동 갱신

서버 측에서 데이터가 갱신된 경우에는, SDK 측의 캐시도 자동으로 최신 상태를 따라갑니다. 구체적으로는 다음과 같은 시점에 반영됩니다.

  • API 호출 응답에 포함된 리소스 정보를 받았을 때
  • WebSocket 연결을 통해 리소스 갱신 알림을 받았을 때
  • 스탬프 시트 실행 결과로 반환된 리소스 정보를 받았을 때

예를 들어, Gs2-Showcase에서 상품을 구매하면, 그 구매 처리로 인해 증가한 Gs2-Inventory의 아이템 소지 수도, 구매 API 응답에 포함된 결과로부터 자동으로 SDK 내 캐시에 반영됩니다. UI 측에서 일부러 “아이템 목록을 다시 가져오는” 작업을 할 필요가 없습니다.

설계 지침

취득 API는 망설임 없이 호출한다

Domain 객체를 통한 ModelAsync / Model / Fetch와 같은 취득 처리는, 최초 1회는 서버에 요청을 발행하고, 이후에는 캐시에서 값을 반환합니다. 따라서 UI를 갱신할 때마다 값을 읽으러 가는 구현으로 만들어도, 과도한 요청 비용이 발생하지 않습니다.

// UI를 다시 그릴 때마다 호출해도, 최초 이후에는 SDK 내 캐시에서 반환됩니다
var item = await gs2.Inventory.Namespace("namespace-0001")
    .Me(GameSession)
    .Inventory("inventory-0001")
    .ItemSet("item-0001")
    .ModelAsync();

캐시 갱신을 능동적으로 수신한다

Domain 객체는 SDK 내 캐시가 갱신된 시점을 구독하기 위한 이벤트 메커니즘을 가지고 있습니다. UI 측에서 이벤트를 구독해 두면, 소지 수의 변동 등을 폴링 없이 반영할 수 있습니다.

자세한 내용은 각 Game Engine SDK의 레퍼런스를 참조해 주세요.

서버의 최신 상태를 보장하고 싶은 경우

저수준 API(Gs2*RestClient / Gs2*WebSocketClient를 직접 호출하는 방식)는 캐시를 거치지 않고 반드시 서버로 요청을 보냅니다. 치트 대책을 위한 서버 재검증 등, 확실하게 서버 측의 최신 상태를 취득하고 싶은 경우에는 저수준 API를 이용해 주세요.

존 전환 시의 동작

GS2는 하나의 리전 안에 여러 존을 Active / Active로 구성하고 있습니다(리전 참조). 존 사이에서는 데이터베이스 동기화에 약간의 지연이 발생하기 때문에, 존이 전환된 순간 “방금 기록했을 값을 읽어올 수 없는” 현상이 발생할 수 있습니다.

SDK의 캐시 메커니즘은 이러한 순간적인 불일치가 있어도 UI가 오래된 값으로 고정되지 않도록, 최선의 노력으로 최신 상태를 따라가도록 설계되어 있습니다. 게임 개발자가 특별한 추가 구현을 하지 않아도, 새로운 존의 최신 값에 캐시가 맞춰집니다.

관련 항목