Skip to main content

개요

InventoryInfo 컴포넌트는 캐릭터 인벤토리 데이터를 서버 중심으로 관리하며, 아이템 메타데이터를 ItemInfosSackItemInfos 두 모듈로 분리해 운용한다. 본 문서는 두 레지스트리가 InventoryInfo와 상호 작용하는 전체 구조를 설명한다.

아이템 분류

  • Item: 일반 슬롯(ItemSlot)에 배치되는 아이템. 즉시 사용형, 소비형, 장착형 등이 포함된다.
  • SackItem: 필드에서 획득해 보관하는 Sack 전용 아이템. 건설/설치, 배치형 도구 등이 여기에 속한다.

두 계층은 서로 다른 슬롯 규칙과 메타데이터를 사용하므로, 레지스트리와 검증 로직을 독립적으로 유지한다.

레지스트리 모듈

  • ItemInfos : ItemSlot용 프로필 정의. 생성 규칙, 조회 API, 서버-클라이언트 복제 절차를 명시한다. 텍스트 표현은 DisplayNameKey, DescriptionKey 등 Localization 키 기반으로 관리한다.
  • SackItemInfos : SackSlot용 프로필 정의. 설치형 규칙, 줍기 설정, Sack 특화 제약을 포함하며 동일하게 Localization 키를 사용한다.

각 모듈은 초기화 시점에만 create({ ... }) 호출을 허용하며, 이후에는 읽기 전용으로 운용한다. 불변 객체를 반환해 런타임 수정을 방지한다.

Localization 흐름

  1. 레지스트리는 문자열 대신 Localization 키(DisplayNameKey, DescriptionKey)만 보관한다.
  2. 서버는 키 정보를 포함한 메타데이터를 클라이언트로 복제한다.
  3. 클라이언트는 LocalizationService 또는 UI 로컬라이제이션 레이어를 통해 실제 문자열을 해석한다.
  4. 다국어 지원 시 Localization 테이블만 갱신하면 인벤토리 UI에 즉시 반영된다.

InventoryInfo 연동 흐름

  1. 서버 초기화: 두 레지스트리가 모든 프로필을 등록한다.
  2. 캐릭터 스폰: InventoryInfo가 슬롯 구조를 생성하면서 필요한 프로필 Id를 참조한다.
  3. 요청 검증: 아이템 이동, 사용, 버리기, 설치 요청은 항상 해당 레지스트리의 메타데이터를 조회해 승인 여부를 결정한다.
  4. 클라이언트 동기화: 서버가 승인한 변경 사항과 필요한 메타 키만 클라이언트로 브로드캐스트하여 UI를 업데이트한다.

데이터 저장 전략

  • 영속 데이터에는 아이템 프로필 Id와 수량, 추가 속성만 저장한다.
  • 세션 로드 시 레지스트리에서 메타데이터를 다시 주입해 UI 표시, 제한 규칙, 속성 계산을 복원한다.
  • Localization 키는 데이터 저장소에 별도로 기록하지 않고, 레지스트리 정의를 신뢰한다.
  • 미등록 Id가 발견되면 기본 빈 슬롯으로 대체하고, 오류를 기록한다.

보안 및 신뢰성

  • 서버가 단일 진실 소스로 작동하며, 클라이언트는 UI 가속화를 위한 임시 상태만 유지한다.
  • 클라이언트 임시 상태는 서버 응답으로 확정/롤백되며, 레지스트리 메타데이터에 근거해 검증한다.
  • 잘못된 요청(존재하지 않는 Id, 허용되지 않은 SlotKind 등)은 즉시 거절하고 Telemetry에 기록한다.

테스트/확인 항목

  • 레지스트리 생성 및 중복 방지.
  • Item/Sack 슬롯 간 교차 사용 금지 검증.
  • Localization 키 누락 시 UI 폴백 확인.
  • 클라이언트 UI 동기화 지연 상황에서의 롤백 처리.
  • 영속 데이터 로드 시 누락/변조 된 Id 복구 절차.
  • 설치형 아이템 배치 및 자동 줍기 로직 시나리오.