[task] | single_turn [pass] | ⏳ 미판정 [title] | GlobalDataStorage [question] | GlobalDataStorage의 DataStorageKeyInfo 구조에서 각 필드가 어떤 역할을 하는지 구체적으로 설명해 줄 수 있나요? [answer] | GlobalDataStorage에서 데이터를 저장하거나 불러올 때 사용하는 `DataStorageKeyInfo`는 데이터의 식별과 관리에 필요한 정보를 담는 구조입니다. 제공된 문서를 기준으로 각 필드의 역할은 다음과 같습니다. * **Key (키)**: 데이터 저장소에서 특정 데이터를 식별하기 위한 고유한 이름(키)입니다. 데이터를 저장할 때(`SetByInfoAndWait`)와 불러올 때(`GetAsync`) 이 값을 통해 어떤 데이터를 가리키는지 지정합니다. * **Tag (태그)**: 데이터에 대한 분류 또는 부가 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | * table * DataStorageKeyInfo * DateTime * DataStorageService * [Data DB 저장 및 불러오기](/docs?postId=68) * [DataStorage 사용량 제한 알아보기](/docs?postId=1044) * [DataStorage 사용량 제한 활용하기](/docs?postId=1045) * [DataStorage 활용하기](/docs?postId=692)
[task] | single_turn [pass] | ⏳ 미판정 [title] | GlobalDataStorage [question] | ds:BatchGetByInfoAndWait(keyInfos) 호출 직후 반환되는 errorCode 변수의 타입은 무엇이며, 오류가 발생했을 때 이를 통해 어떤 구체적인 실패 원인을 파악할 수 있는지 알고 싶습니다. [answer] | 제공된 참고 문서에는 `ds:BatchGetByInfoAndWait(keyInfos)` 호출 시 반환되는 첫 번째 값의 이름이 `errorCode` 또는 `getResultCode`로 사용되고, 이 값이 `0`이 아닐 경우(`~= 0`) 오류가 발생했다고 판단하는 예제만 존재합니다. 그러나 제공된 문서에는 해당 변수의 **구체적인 타입**(예: number, string 등)에 대한 명시적 정의가 없으며, 오류 코드 값이 의미하는 **구체적인 실패 원인**(예: "네트워크 오류", "키 없음" 등)에 대한 매핑 표나 설명도 포함되 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 데이터를 DataStorageKeyInfo를 통해 일괄로 가져오는 예제입니다. ```lua local ds = _DataStorageService:GetGlobalDataStorage("StorageName") local keyInfos = {} local keyInfo1 = DataStorageKeyInfo("Key1", "Version1", "Tag1") local keyInfo2 = DataStorageKeyInfo("Key2", "Version2", "Tag2") table.insert(keyInfos, keyInfo1
[task] | code [pass] | ⏳ 미판정 [title] | GlobalDataStorage [question] | GlobalDataStorage의 UpdateAndWait를 사용하여 유저의 레벨 값을 10에서 11로 변경하려 했으나 기존 값이 10이 아닐 경우 UpdateApiFailed(2000000) 에러 코드를 확인하고 현재 실제 값을 로그로 출력하는 서버 전용 스크립트를 작성해줘 [answer] | GlobalDataStorage의 `UpdateAndWait` 메서드는 기존 값이 `expectedValue`와 일치할 때만 값을 갱신합니다. 만약 기존 값이 `expectedValue`(이 경우 "10")와 다르다면, 함수는 갱신되지 않은 채로 에러 코드 `2000000` (`UpdateApiFailed`)과 **기존의 실제 값**을 반환합니다. 따라서 반환된 에러 코드가 `2000000`인지 확인하고, 다르다면 두 번째 반환 값인 `value`를 로그로 출력하면 됩니다. ```lua [server only] void TryU [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | ageKeyInfo, string> keyValues) [ServerOnly] [Yield]** 입력한 DataStorageKeyInfo들로 데이터를 저장합니다. 모든 데이터 저장에 성공하면 에러 코드와 성공한 DataStorageKeyInfo를 반환합니다. 수행하는 동안 스크립트 실행을 중단합니다. 모든 작업 중 하나라도 실패한다면, 함수 호출이 실패합니다. 한 번에 최대 20개 Key까지 조작 할 수 있습니다. - **void TransactSetByInfoAsync(Dictionary<DataStorageKeyInfo, s
[task] | code [pass] | ⏳ 미판정 [title] | GlobalDataStorage [question] | GlobalDataStorage 서비스의 SetAndWait와 GetByVersionRangeAsync를 사용하여 플레이어의 최고 점수를 저장하고, 특정 날짜 범위 내 버전 히스토리를 조회하는 서버 스크립트를 작성해줘. [answer] | 사용자 질문에서 요구한 `GetByVersionRangeAsync` API는 제공된 참고 문서에 존재하지 않습니다. 따라서 해당 메서드를 사용한 코드 작성은 불가능하며, 지어내지 않겠습니다. 참고 문서에 포함된 `SetAndWait`와 버전 관련 조회 메서드(`GetByInfoAndWait`)를 사용하여 최고 점수를 저장하고, 특정 버전의 점수를 조회하는 서버 스크립트를 작성할 수 있습니다. `minDate`, `maxDate`를 이용한 날짜 범위 조회는 비동기 처리되며 `callbackFunction`을 통해 결과를 전달받지만, [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | . sortDirection으로 오름/내림차순 정렬을 설정할 수 있습니다. minDate, maxDate로 설정한 시간대 내에서 생성된 버전을 조회할 수 있습니다. 이 작업은 비동기로 수행되며, 작업이 완료되면 에러 코드, 키, 조회용 객체와 함께 callbackFunction으로 전달된 함수가 호출됩니다. - **int32 SetAndWait(string key, string value) [ServerOnly] [Yield]** 입력한 키로 데이터를 저장합니다. 작업이 완료되면 에러 코드를 반환합니다. 수행하는 동안 스크립트
[task] | single_turn [pass] | ⏳ 미판정 [title] | GlobalDataStoragePages [question] | GlobalDataStoragePages에서 LoadNextPageAndWait가 반환하는 에러 코드가 0이 아닐 때 스크립트가 멈추는 것이 정상적인 동작인가요? [answer] | 네, 정상적인 동작입니다. `LoadNextPageAndWait()`는 다음 페이지를 불러오는 과정에서 문제가 발생하면 0이 아닌 에러 코드를 반환합니다. 예제 코드를 보면 이 메서드가 반환한 값이 0이 아닐 때(`loadResultCode ~= 0`) `return`을 수행하여 루프를 즉시 종료하고 있습니다. 이는 다음 페이지가 더 이상 유효하지 않거나, 데이터를 로드할 수 없는 상태를 나타내며, 이 경우 더 이상 페이지를 순회할 필요가 없으므로 스크립트 실행을 중단하는 것이 올바른 처리 방식입니다. 따라서 에러 코드가 0이 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 월드의 GlobalDataStorage들을 조회할 수 있는 기능을 제공합니다. # Properties - **boolean IsLastPage [ReadOnly]** 현재 페이지가 마지막 페이지인지 확인합니다. # Methods - **table<GlobalDataStorage> GetCurrentPageDatas() [ServerOnly]** 현재 페이지의 GlobalDataStorage 목록을 가져옵니다. - **int32 LoadNextPageAndWait() [ServerOnly] [Yield]** 다음 페
[task] | code [pass] | ⏳ 미판정 [title] | GlobalDataStorage [question] | _DataStorageService:GetGlobalDataStorage("StorageName") 을 사용하여 "Key1"과 "Key2"의 데이터를 일괄 조회하고, itemPages:GetCurrentPageDatas() 로 페이지를 순회하며 각 item.KeyInfo.Key 와 item.Value 를 로그로 출력하는 스크립트를 작성해줘 [answer] | ```lua Method: void BatchGetExample() { local ds = _DataStorageService:GetGlobalDataStorage("StorageName") local keys = {} table.insert(keys, "Key1") table.insert(keys, "Key2") local errorCode, itemPages = ds:BatchGetAndWait(keys) while true do local it [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 데이터를 일괄로 가져오는 예제입니다. ```lua local ds = _DataStorageService:GetGlobalDataStorage("StorageName") local keys = {} table.insert(keys, "Key1") table.insert(keys, "Key2") local errorCode, itemPages = ds:BatchGetAndWait(keys) while true do -- GetCurrentPageDatas()로 현재 페이지의 목록을 가져올 수 있습니다. lo
[task] | single_turn [pass] | ⏳ 미판정 [title] | GlobalDataStorage [question] | DataStorageKeyInfo 객체 생성 시 Version과 Tag 인자가 각각 어떤 역할을 하며, BatchGetByInfoAndWait와 GetPagesAndWait 호출 시 이 값들이 어떻게 필터링에 반영되는지 궁금합니다. [answer] | 제공된 참고 문서에는 `DataStorageKeyInfo` 객체 생성 시 `Version`과 `Tag` 인자가 각각 어떤 구체적인 역할을 하는지, 또는 `BatchGetByInfoAndWait`와 `GetPagesAndWait` 호출 시 이 값들이 데이터베이스 조회 조건으로 어떻게 필터링되는지에 대한 설명이 포함되어 있지 않습니다. 문서에 있는 코드 예제만으로는 다음 사실만 확인할 수 있습니다. 1. **생성 방식**: `DataStorageKeyInfo("Key", "Version", "Tag")` 형식으로 객체를 생성합니다 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 데이터를 DataStorageKeyInfo를 통해 일괄로 가져오는 예제입니다. ```lua local ds = _DataStorageService:GetGlobalDataStorage("StorageName") local keyInfos = {} local keyInfo1 = DataStorageKeyInfo("Key1", "Version1", "Tag1") local keyInfo2 = DataStorageKeyInfo("Key2", "Version2", "Tag2") table.insert(keyInfos, keyInfo1
[task] | instruction_following [pass] | ⏳ 미판정 [title] | SortableDataStorage [question] | 버전 조회 시 Date 범위 필터링과 정렬 방향 설정이 가능한 메서드명을 5단어 이내로 [answer] | GetVersionsAndWait, GetVersionsAsync [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | rection으로 오름/내림차순 정렬을 설정할 수 있습니다. min, max로 설정한 범위 내의 데이터들을 조회할 수 있습니다. 이 작업은 비동기로 수행되며, 작업이 완료되면 에러 코드, 조회용 객체와 함께 callbackFunction으로 전달된 함수가 호출됩니다. - **int32, DataStorageVersionPages GetVersionsAndWait(string key, SortDirection sortDirection, DateTime minDate, DateTime maxDate) [ServerOnly] [Yield
[task] | code [pass] | ⏳ 미판정 [title] | GlobalDataStorage [question] | _DataStorageService:GetGlobalDataStorage("StorageName") 을 사용하여 "Key1"과 "Key2"에 해당하는 데이터를 일괄 삭제하기 위해 keys 테이블을 구성하고 ds:BatchDeleteAndWait(keys) 를 호출하는 스크립트를 작성해줘 [answer] | `_DataStorageService:GetGlobalDataStorage`로 전역 데이터 스토리지 객체를 가져온 후, 삭제할 키(`"Key1"`, `"Key2"`)를 테이블에 담아 `BatchDeleteAndWait` 메서드를 호출하는 방식으로 작성할 수 있습니다. ```lua local ds = _DataStorageService:GetGlobalDataStorage("StorageName") local keys = {} table.insert(keys, "Key1") table.insert(keys, "Key2") loc [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 데이터를 일괄로 가져오는 예제입니다. ```lua local ds = _DataStorageService:GetGlobalDataStorage("StorageName") local keys = {} table.insert(keys, "Key1") table.insert(keys, "Key2") local errorCode, itemPages = ds:BatchGetAndWait(keys) while true do -- GetCurrentPageDatas()로 현재 페이지의 목록을 가져올 수 있습니다. lo
[task] | single_turn [pass] | ⏳ 미판정 [title] | GlobalDataStorage [question] | GlobalDataStorage에서 특정 날짜 범위의 버전 정보를 조회할 때 GetVersionsAndWait 함수의 매개변수 순서와 SortDirection 사용법이 궁금합니다. [answer] | `GlobalDataStorage`에서 특정 날짜 범위의 버전 정보를 조회할 때는 `GetVersionsAndWait` 함수를 사용합니다. 이 함수의 매개변수 순서와 `SortDirection` 사용법은 다음과 같습니다. ### 1. 매개변수 순서 `GetVersionsAndWait` 함수는 다음 5가지 매개변수를 순서대로 받습니다. 1. **Key (string)**: 조회할 데이터의 키입니다. 2. **SortDirection (enum)**: 버전 목록의 정렬 방향입니다. 3. **minDate (DateTime)** [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 일정 기간 내의 버전 정보를 조회하는 예제입니다. ```lua local ds = _DataStorageService:GetGlobalDataStorage("StorageName") local minDate = DateTime(2023, 03, 09, 20, 20, 0, 0) local maxDate = DateTime(2023, 03, 09, 22, 20, 0, 0) -- 값을 저장할 때 버전 값을 함께 지정한 경우에만 조회할 수 있습니다. local errorCode, versionPages = ds:GetVersion
[task] | single_turn [pass] | ⏳ 미판정 [title] | GlobalDataStorage [question] | GetAndWait와 GetByInfoAndWait 함수의 차이점과, 각각 어떤 상황에서 사용해야 하는지 설명해 주세요. [answer] | `GetAndWait`와 `GetByInfoAndWait`는 모두 GlobalDataStorage에서 데이터를 조회하는 함수이지만, **버전(Version) 관리**를 사용하는 방식에서 차이가 있습니다. ### 1. GetAndWait * **기능**: 특정 `Key`에 저장된 **최신 버전**의 데이터를 가져옵니다. * **사용 상황**: * 데이터를 저장할 때 버전 정보를 별도로 관리하지 않았거나, 항상 가장 마지막에 저장된 값(최신 상태)만 필요할 때 사용합니다. * 일반적인 상태 저장(예: 유저 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 일정 기간 내의 버전 정보를 조회하는 예제입니다. ```lua local ds = _DataStorageService:GetGlobalDataStorage("StorageName") local minDate = DateTime(2023, 03, 09, 20, 20, 0, 0) local maxDate = DateTime(2023, 03, 09, 22, 20, 0, 0) -- 값을 저장할 때 버전 값을 함께 지정한 경우에만 조회할 수 있습니다. local errorCode, versionPages = ds:GetVersion
[task] | code [pass] | ⏳ 미판정 [title] | GlobalDataStorage [question] | _DataStorageService:GetGlobalDataStorage("StorageName") 을 사용하여 DataStorageKeyInfo 로 생성한 "Key1", "Key2" 정보와 각각의 Value 를 keyInfoValues 테이블에 담아 ds:BatchSetByInfoAndWait(keyInfoValues) 를 통해 일괄 저장하는 스크립트를 작성해줘 [answer] | ```lua Method: void BatchStoreData() { local ds = _DataStorageService:GetGlobalDataStorage("StorageName") local keyInfoValues = {} local keyInfo1 = DataStorageKeyInfo("Key1", "Version1", "Tag1") local keyInfo2 = DataStorageKeyInfo("Key2", "Version2", "Tag2") keyInfoValu [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 데이터를 일괄로 가져오는 예제입니다. ```lua local ds = _DataStorageService:GetGlobalDataStorage("StorageName") local keys = {} table.insert(keys, "Key1") table.insert(keys, "Key2") local errorCode, itemPages = ds:BatchGetAndWait(keys) while true do -- GetCurrentPageDatas()로 현재 페이지의 목록을 가져올 수 있습니다. lo
[task] | single_turn [pass] | ⏳ 미판정 [title] | SortableDataStorage [question] | SorterDataStorage는 메이커 모드에서 저장한 데이터가 출시 환경에서도 그대로 유지되는 건가요? [answer] | 아니요, 메이커 모드와 출시 환경은 저장소를 공유하지 않습니다. 따라서 메이커 모드에서 저장한 데이터는 출시 환경에서 그대로 유지되지 않으며, 각 환경은 독립적인 데이터 저장소를 사용합니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 정수형 데이터를 관리하고, 정렬한 데이터를 가져오는 기능이 있는 저장소입니다. 메이커와 출시 환경은 저장소를 공유하지 않습니다. # Properties - **string Name [ReadOnly]** DataStorage의 이름입니다. # Methods - **int32, List<string> BatchDeleteAndWait(List<string> keys) [ServerOnly] [Yield]** 입력한 키들로 데이터들을 삭제합니다. 에러 코드와 삭제에 성공한 키들을 반환합니다. 수행하는 동안 스크립트 실행을
[task] | single_turn [pass] | ⏳ 미판정 [title] | GlobalDataStoragePages [question] | GetCurrentPageDatas는 서버에서만 실행되는 메서드인데, 클라이언트에서 데이터를 표시하려면 어떻게 해야 하나요? [answer] | `GetCurrentPageDatas()`는 `[ServerOnly]` 메서드이므로 클라이언트 스크립트에서 직접 호출할 수 없습니다. 따라서 서버에서 데이터를 조회한 후, 클라이언트로 데이터를 전달하는 방법을 사용해야 합니다. 참고 문서에는 `GlobalDataStoragePages` 객체 자체에 클라이언트로 데이터를 동기화하거나 전송하는 API(예: `SendToClient`, `Sync` 등)가 정의되어 있지 않습니다. 또한 `GlobalDataStorage`의 프로퍼티가 `[Sync]` 속성을 가져서 자동으로 클라이언트에 동 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 월드의 GlobalDataStorage들을 조회할 수 있는 기능을 제공합니다. # Properties - **boolean IsLastPage [ReadOnly]** 현재 페이지가 마지막 페이지인지 확인합니다. # Methods - **table<GlobalDataStorage> GetCurrentPageDatas() [ServerOnly]** 현재 페이지의 GlobalDataStorage 목록을 가져옵니다. - **int32 LoadNextPageAndWait() [ServerOnly] [Yield]** 다음 페
[task] | code [pass] | ⏳ 미판정 [title] | GlobalDataStorage [question] | GlobalDataStorage의 UpdateByInfoAsync를 사용하여 특정 유저의 세이브 데이터를 비동기로 갱신하고, 콜백에서 에러 코드가 0이면 성공, 2000000이면 값 불일치로 구분하여 각각 다른 메시지를 출력하는 서버 전용 스크립트를 작성해줘 [answer] | GlobalDataStorage의 `UpdateByInfoAsync` 메서드를 사용하여 요청하신 기능을 구현한 서버 전용 스크립트는 다음과 같습니다. 에러 코드 0은 성공, 2000000은 기존 값과 예상 값이 일치하지 않는 경우(UpdateApiFailed)로 판단하여 각각 다른 로그 메시지를 출력하도록 작성했습니다. ```lua [server only] void UpdateSaveDataAsync() { local globalDataStorage = _DataStorageService:GetGlobalDataStora [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | ageKeyInfo, string> keyValues) [ServerOnly] [Yield]** 입력한 DataStorageKeyInfo들로 데이터를 저장합니다. 모든 데이터 저장에 성공하면 에러 코드와 성공한 DataStorageKeyInfo를 반환합니다. 수행하는 동안 스크립트 실행을 중단합니다. 모든 작업 중 하나라도 실패한다면, 함수 호출이 실패합니다. 한 번에 최대 20개 Key까지 조작 할 수 있습니다. - **void TransactSetByInfoAsync(Dictionary<DataStorageKeyInfo, s
[task] | two_turn [pass] | ⏳ 미판정 [title] | GlobalDataStorage [question] | DataStorageKeyInfo를 사용하는 SetByInfoAndWait와 일반 string key를 사용하는 SetAndWait의 기능적 차이와 DataStorageKeyInfo에 설정 가능한 세부 정보의 종류를 설명해 주세요. [answer] | `SetAndWait`와 `SetByInfoAndWait`의 기능적 차이와 `DataStorageKeyInfo`에 설정 가능한 세부 정보의 종류는 다음과 같습니다. ### 1. 기능적 차이 * **`SetAndWait(string key, string value)`**: * 단순한 문자열 형태의 키(`key`)와 값(`value`)을 인자로 받습니다. * 입력한 키로 데이터를 저장하는 기본적인 기능을 수행합니다. * 작업 완료 시 에러 코드(`int32`)를 반환하며, 수행 중 스크립트 실행이 [followup] | DataStorageKeyInfo를 이용해 특정 시간대(minDate, maxDate)나 정렬(sortDirection) 조건을 만족하는 버전을 조회하기 위한 전체적인 코드 흐름을 작성해 주세요. [followup_answer] | 제공된 참고 문서에는 `minDate`, `maxDate`, `sortDirection`을 사용하여 버전을 **조회하는 비동기 메서드의 정확한 함수 시그니처(이름, 인자 타입)**가 명시되어 있지 않습니다. 문서 본문에는 "sortDirection으로 오름/내림차순 정렬을 설정할 수 있습니다. minDate, maxDate로 설정한 시간대 내에서 생성된 버전을 조회할 수 있습니다. 이 작업은 비동기로 수행되며... callbackFunction으로 전달된 함수가 호출됩니다"라고 설명만 되어 있을 뿐, 해당 기능을 수행하는 실제 A [scores] | [judge_reason] | [source_doc] | . sortDirection으로 오름/내림차순 정렬을 설정할 수 있습니다. minDate, maxDate로 설정한 시간대 내에서 생성된 버전을 조회할 수 있습니다. 이 작업은 비동기로 수행되며, 작업이 완료되면 에러 코드, 키, 조회용 객체와 함께 callbackFunction으로 전달된 함수가 호출됩니다. - **int32 SetAndWait(string key, string value) [ServerOnly] [Yield]** 입력한 키로 데이터를 저장합니다. 작업이 완료되면 에러 코드를 반환합니다. 수행하는 동안 스크립트
[task] | single_turn [pass] | ⏳ 미판정 [title] | SortableDataStorage [question] | BatchGetAndWait 함수 호출 시 반환되는 두 번째 값인 SortableDataStorageItemPages는 어떤 형태로 데이터를 포함하고 있나요? [answer] | 제공된 참고 문서에는 `SortableDataStorageItemPages` 객체의 내부 구조나 데이터를 포함하는 구체적인 형태에 대한 설명이 포함되어 있지 않습니다. 문서에는 해당 메서드가 "조회용 객체"를 반환한다고만 기술되어 있을 뿐, `SortableDataStorageItemPages` 타입 자체의 프로퍼티나 메서드 정의는 찾아볼 수 없습니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 정수형 데이터를 관리하고, 정렬한 데이터를 가져오는 기능이 있는 저장소입니다. 메이커와 출시 환경은 저장소를 공유하지 않습니다. # Properties - **string Name [ReadOnly]** DataStorage의 이름입니다. # Methods - **int32, List<string> BatchDeleteAndWait(List<string> keys) [ServerOnly] [Yield]** 입력한 키들로 데이터들을 삭제합니다. 에러 코드와 삭제에 성공한 키들을 반환합니다. 수행하는 동안 스크립트 실행을
[task] | instruction_following [pass] | ⏳ 미판정 [title] | SortableDataStorage [question] | WaitAndAsync 계열 메서드의 차이를 실행 공간 태그와 함께 2행 표로 정리해서 [answer] | WaitAndAsync 계열 메서드는 동기 처리(Wait)와 비동기 처리(Async)로 나뉘며, 모두 서버에서 실행됩니다. | 구분 | Wait 계열 | Async 계열 | | :--- | :--- | :--- | | **실행 공간** | `[ServerOnly]` | `[ServerOnly]` | | **차이점** | `[Yield]` 태그가 있어 작업 완료까지 스크립트 실행을 중단하고 결과(에러 코드, 데이터)를 즉시 반환합니다. | `[Yield]` 태그가 없으며, 작업은 백그라운드에서 수행됩니다. 완료 시점에 `callba [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | rection으로 오름/내림차순 정렬을 설정할 수 있습니다. min, max로 설정한 범위 내의 데이터들을 조회할 수 있습니다. 이 작업은 비동기로 수행되며, 작업이 완료되면 에러 코드, 조회용 객체와 함께 callbackFunction으로 전달된 함수가 호출됩니다. - **int32, DataStorageVersionPages GetVersionsAndWait(string key, SortDirection sortDirection, DateTime minDate, DateTime maxDate) [ServerOnly] [Yield
[task] | code [pass] | ⏳ 미판정 [title] | GlobalDataStorage [question] | _DataStorageService:GetGlobalDataStorage("StorageName") 을 초기화한 후, while 루프와 itemPages.IsLastPage 프로퍼티를 확인하여 마지막 페이지까지 이동하며 itemPages:MoveToNextPageAndWait() 를 호출하는 데이터 페이지 순회 로직을 구현하는 스크립트를 작성해줘 [answer] | ```lua Property: [None] string StorageName = "StorageName" Method: [server only] void FetchAllData() { local ds = _DataStorageService:GetGlobalDataStorage(self.StorageName) local keys = {} table.insert(keys, "Key1") table.insert(keys, "Key2") local errorCode, itemPages [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 데이터를 일괄로 가져오는 예제입니다. ```lua local ds = _DataStorageService:GetGlobalDataStorage("StorageName") local keys = {} table.insert(keys, "Key1") table.insert(keys, "Key2") local errorCode, itemPages = ds:BatchGetAndWait(keys) while true do -- GetCurrentPageDatas()로 현재 페이지의 목록을 가져올 수 있습니다. lo
[task] | two_turn [pass] | ⏳ 미판정 [title] | GlobalDataStorage [question] | GlobalDataStorage에서 데이터 저장 및 갱신 시 동기(Wait) 방식과 비동기(Async) 방식의 차이점을 설명해 주세요. [answer] | GlobalDataStorage에서 데이터를 저장(Set)하거나 갱신(Update)할 때 제공하는 동기(Wait) 방식과 비동기(Async) 방식의 핵심 차이점은 **스크립트 실행의 중단 여부**와 **결과 처리 방식**입니다. ### 1. 동기 (Wait) 방식 * **특징:** 함수 이름에 `Wait`가 포함됩니다 (예: `SetByInfoAndWait`, `UpdateAndWait`). * **실행 흐름:** 함수가 데이터를 서버에 저장하거나 갱신하는 작업이 완료될 때까지 **현재 스크립트의 실행을 중단**(Yield [followup] | 비동기 방식에서 UpdateApiFailed(2000000) 에러 코드가 반환되었을 때, callbackFunction을 통해 기존 값과 갱신된 값 중 어떤 정보가 전달되는지 확인하고 싶은데, UpdateAsync와 UpdateByInfoAsync의 매개변수 차이를 구체적으로 알려주세요. [followup_answer] | `UpdateApiFailed(2000000)` 에러 코드가 반환되었을 때, `UpdateAsync`와 `UpdateByInfoAsync`는 모두 **갱신되지 않은 기존 값**을 전달합니다. 갱신 작업이 실패했기 때문에 '갱신된 값'은 존재하지 않으며, 서버에 현재 저장되어 있는 '기존 값'이 반환되는 것입니다. 두 함수의 `callbackFunction` 매개변수 차이와 에러 발생 시 전달되는 구체적인 정보는 다음과 같습니다. ### 1. UpdateAsync - **함수 시그니처:** `void UpdateAsync(stri [scores] | [judge_reason] | [source_doc] | ageKeyInfo, string> keyValues) [ServerOnly] [Yield]** 입력한 DataStorageKeyInfo들로 데이터를 저장합니다. 모든 데이터 저장에 성공하면 에러 코드와 성공한 DataStorageKeyInfo를 반환합니다. 수행하는 동안 스크립트 실행을 중단합니다. 모든 작업 중 하나라도 실패한다면, 함수 호출이 실패합니다. 한 번에 최대 20개 Key까지 조작 할 수 있습니다. - **void TransactSetByInfoAsync(Dictionary<DataStorageKeyInfo, s
[task] | two_turn [pass] | ⏳ 미판정 [title] | SortableDataStorage [question] | 메이플스토리 월드의 SortableDataStorage 컴포넌트는 어떤 역할을 하며, 메이커와 출시 환경 간의 데이터 공유 특성은 무엇인가요? [answer] | 메이플스토리 월드의 `SortableDataStorage`는 정수형 데이터를 관리하고, 이를 정렬하여 가져오는 기능을 제공하는 저장소입니다. 메이커(개발) 환경과 출시(운영) 환경은 이 저장소를 공유하지 않습니다. 즉, 메이커 환경에서 저장한 데이터는 출시 환경에서 사용할 수 없으며, 반대로 출시 환경의 데이터도 메이커 환경에서 접근할 수 없는 독립적인 저장소를 가집니다. [followup] | SortableDataStorage에서 정수형 데이터를 저장하고 정렬된 데이터를 가져오는 구체적인 과정은 어떻게 되나요? [followup_answer] | `SortableDataStorage`에서 정수형 데이터를 저장하고 가져오는 과정은 다음과 같습니다. ### 1. 데이터 저장 (Set) 데이터를 저장할 때는 `BatchSetAndWait` 또는 `BatchSetAsync` 메서드를 사용합니다. 이 메서드들은 `Dictionary<string, integer>` 형태의 키-값 쌍을 받아 데이터를 저장합니다. * **동기 처리 (WaitAnd):** `BatchSetAndWait`는 저장 작업이 완료될 때까지 스크립트 실행을 중단(Yield)하고, 완료되면 에러 코드와 저장에 [scores] | [judge_reason] | [source_doc] | 정수형 데이터를 관리하고, 정렬한 데이터를 가져오는 기능이 있는 저장소입니다. 메이커와 출시 환경은 저장소를 공유하지 않습니다. # Properties - **string Name [ReadOnly]** DataStorage의 이름입니다. # Methods - **int32, List<string> BatchDeleteAndWait(List<string> keys) [ServerOnly] [Yield]** 입력한 키들로 데이터들을 삭제합니다. 에러 코드와 삭제에 성공한 키들을 반환합니다. 수행하는 동안 스크립트 실행을
[task] | code [pass] | ⏳ 미판정 [title] | GlobalDataStorage [question] | GlobalDataStorage의 SetByInfoAsync를 활용하여 유저의 3가지 스탯 데이터를 Dictionary로 묶어 비동기 저장하고, 콜백에서 성공 여부에 따라 로그를 출력하는 서버 전용 스크립트를 작성해줘 [answer] | GlobalDataStorage의 `TransactSetByInfoAsync`를 활용하여 여러 키-값 쌍을 비동기로 저장하고, 콜백에서 결과를 처리하는 서버 전용 스크립트입니다. 참고: 요청하신 `SetByInfoAsync` (단일 키)가 아닌, **Dictionary로 묶어** 여러 데이터를 한 번에 저장하는 **`TransactSetByInfoAsync`** 메서드를 사용해야 합니다. 문서에 따르면 `TransactSetByInfoAsync`는 `Dictionary<DataStorageKeyInfo, string>`을 인자로 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | ageKeyInfo, string> keyValues) [ServerOnly] [Yield]** 입력한 DataStorageKeyInfo들로 데이터를 저장합니다. 모든 데이터 저장에 성공하면 에러 코드와 성공한 DataStorageKeyInfo를 반환합니다. 수행하는 동안 스크립트 실행을 중단합니다. 모든 작업 중 하나라도 실패한다면, 함수 호출이 실패합니다. 한 번에 최대 20개 Key까지 조작 할 수 있습니다. - **void TransactSetByInfoAsync(Dictionary<DataStorageKeyInfo, s
[task] | single_turn [pass] | ⏳ 미판정 [title] | GlobalDataStoragePages [question] | while 루프 내에서 IsLastPage를 확인하기 전에 LoadNextPageAndWait를 호출하면 마지막 페이지 데이터를 놓칠 수 있나요? [answer] | 아니요, 마지막 페이지 데이터를 놓치지 않습니다. `LoadNextPageAndWait()`는 다음 페이지의 데이터를 **미리 불러오기**만 할 뿐, 현재 페이지의 데이터를 삭제하거나 변경하지 않습니다. 또한 `IsLastPage` 프로퍼티는 **현재** 페이지가 마지막인지 여부를 나타내므로, 현재 페이지가 마지막인 경우 `IsLastPage`가 `true`가 됩니다. 따라서 `IsLastPage`를 확인하기 전에 `LoadNextPageAndWait()`를 호출하더라도, 현재 페이지 데이터는 안전하게 남아있어 `GetCurre [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 월드의 GlobalDataStorage들을 조회할 수 있는 기능을 제공합니다. # Properties - **boolean IsLastPage [ReadOnly]** 현재 페이지가 마지막 페이지인지 확인합니다. # Methods - **table<GlobalDataStorage> GetCurrentPageDatas() [ServerOnly]** 현재 페이지의 GlobalDataStorage 목록을 가져옵니다. - **int32 LoadNextPageAndWait() [ServerOnly] [Yield]** 다음 페
[task] | single_turn [pass] | ⏳ 미판정 [title] | GlobalDataStorage [question] | BatchGetByInfoAndWait 메서드는 여러 키 정보를 일괄 조회할 때 사용하는데, 이 메서드와 태그 기반 조회인 GetPagesAndWait 사이의 성능 차이나 사용 목적상 차이가 있는지 알고 싶습니다. [answer] | 참고 문서에 제시된 내용에는 `BatchGetByInfoAndWait`와 `GetPagesAndWait`의 **성능 차이**에 대한 정보가 없습니다. 따라서 두 메서드 간의 성능 비교는 답변할 수 없습니다. 다만, **사용 목적(조회 방식)** 에 따른 차이는 다음과 같습니다. 1. **`BatchGetByInfoAndWait`** * **목적**: 특정 키(Key), 버전(Version), 태그(Tag) 정보가 담긴 `DataStorageKeyInfo` 객체들을 리스트로 만들어 **정확히 지정한 항목들만** 일괄 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 데이터를 DataStorageKeyInfo를 통해 일괄로 가져오는 예제입니다. ```lua local ds = _DataStorageService:GetGlobalDataStorage("StorageName") local keyInfos = {} local keyInfo1 = DataStorageKeyInfo("Key1", "Version1", "Tag1") local keyInfo2 = DataStorageKeyInfo("Key2", "Version2", "Tag2") table.insert(keyInfos, keyInfo1
[task] | instruction_following [pass] | ⏳ 미판정 [title] | SortableDataStorage [question] | `GetByInfoAsync`의 callbackFunction에 전달되는 매개변수 3가지(에러 코드, DataStorageKeyInfo, 데이터)의 순서와 타입만 코드 블록에 주석으로 명시하여 출력하세요. [answer] | ```lua -- GetByInfoAsync callbackFunction 매개변수 순서 및 타입: -- 1. int32 (에러 코드) -- 2. DataStorageKeyInfo (조회에 사용된 키 정보) -- 3. integer (데이터) ``` [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | lbackFunction) [ServerOnly]** 입력한 DataStorageKeyInfo들로 데이터들을 저장합니다. 이 작업은 비동기로 수행되며, 작업이 완료되면 에러 코드, 저장에 성공한 DataStorageKeyInfo들과 함께 callbackFunction으로 전달된 함수가 호출됩니다. - **int32 DeleteAndWait(string key) [ServerOnly] [Yield]** 입력한 키로 데이터를 삭제하고 에러 코드를 반환합니다. 수행하는 동안 스크립트 실행을 중단합니다. - **void Delete
[task] | instruction_following [pass] | ⏳ 미판정 [title] | SortableDataStorage [question] | `DeleteAndWait`와 `DeleteAsync` 메서드의 차이점을 '비동기 처리 여부'와 '스크립트 실행 중단 여부' 기준으로 2개의 열로 구성된 표로 정리해서 답변하세요. [answer] | `DeleteAndWait`와 `DeleteAsync` 메서드의 차이점을 요청하신 기준으로 정리하면 다음과 같습니다. | 메서드 | 비동기 처리 여부 | 스크립트 실행 중단 여부 | | :--- | :--- | :--- | | `DeleteAndWait` | 동기 처리 (Yield) | 수행하는 동안 스크립트 실행을 중단합니다. | | `DeleteAsync` | 비동기 처리 | 수행하는 동안 스크립트 실행을 중단하지 않습니다. | [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | lbackFunction) [ServerOnly]** 입력한 DataStorageKeyInfo들로 데이터들을 저장합니다. 이 작업은 비동기로 수행되며, 작업이 완료되면 에러 코드, 저장에 성공한 DataStorageKeyInfo들과 함께 callbackFunction으로 전달된 함수가 호출됩니다. - **int32 DeleteAndWait(string key) [ServerOnly] [Yield]** 입력한 키로 데이터를 삭제하고 에러 코드를 반환합니다. 수행하는 동안 스크립트 실행을 중단합니다. - **void Delete
[task] | instruction_following [pass] | ⏳ 미판정 [title] | SortableDataStorage [question] | IncreaseAndWait와 IncreaseAsync 메서드의 차이점을 3문장 이내로 설명하세요. [answer] | `IncreaseAndWait`는 동기 방식으로 호출되어 값 증가가 완료될 때까지 실행이 중단된 후 결과 값을 반환합니다. 반면 `IncreaseAsync`는 비동기 방식으로 호출되어 작업이 완료되면 전달된 콜백 함수를 통해 결과를 처리합니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # Examples #### IncreaseAndWait 값을 증가시키는 예제입니다. ```lua local ds = _DataStorageService:GetSortableDataStorage("Storage") -- "Key"에 해당하는 값이 없을 경우 기본 값으로 생성 후 1을 증가시킵니다. local errorCode, value = ds:IncreaseAndWait("Key", 1) ``` #### IncreaseAsync 값을 비동기로 증가시키는 예제입니다. ```lua local ds = _DataStor
[task] | single_turn [pass] | ⏳ 미판정 [title] | SortableDataStorage [question] | BatchSetAndWait와 BatchSetAsync 중 어떤 함수를 사용해야 스크립트 실행이 중단되지 않고 다른 로직이 계속 진행되나요? [answer] | 스크립트 실행이 중단되지 않고 다른 로직이 계속 진행되려면 `BatchSetAsync`를 사용해야 합니다. `BatchSetAndWait`는 실행하는 동안 스크립트 실행을 중단(Yield)하지만, `BatchSetAsync`는 비동기로 작업을 수행하여 완료 시점에 콜백 함수를 호출합니다. ```lua [server only] void SaveDataAsync() { local ds = _DataStorageService:GetGlobalDataStorage("globalDS") local keyValues = {} [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 정수형 데이터를 관리하고, 정렬한 데이터를 가져오는 기능이 있는 저장소입니다. 메이커와 출시 환경은 저장소를 공유하지 않습니다. # Properties - **string Name [ReadOnly]** DataStorage의 이름입니다. # Methods - **int32, List<string> BatchDeleteAndWait(List<string> keys) [ServerOnly] [Yield]** 입력한 키들로 데이터들을 삭제합니다. 에러 코드와 삭제에 성공한 키들을 반환합니다. 수행하는 동안 스크립트 실행을
[task] | two_turn [pass] | ⏳ 미판정 [title] | GlobalDataStorage [question] | GlobalDataStorage에서 데이터를 저장할 때 동기(Wait) 방식과 비동기(Async) 방식의 차이와 각각의 사용 장단점을 설명해 주세요. [answer] | GlobalDataStorage에서 데이터를 저장할 때 **동기(Wait)** 방식과 **비동기(Async)** 방식은 데이터 저장 요청의 처리 방식과 스크립트 실행 흐름에 미치는 영향에서 차이가 있습니다. ### 1. 동기(Wait) 방식 `AndWait`로 끝나는 메서드(예: `SetAndWait`, `SetByInfoAndWait`, `TransactSetAndWait`)를 사용합니다. * **동작 원리**: 데이터 저장 작업이 완료될 때까지 현재 스크립트의 실행을 **중단(Yield)**합니다. 작업이 끝난 후 반환된 [followup] | SetAndWait와 SetAsync를 사용하며 에러 코드 처리를 어떻게 해야 하며, TransactSetAndWait에서 최대 20개 제한을 초과할 경우 어떤 결과가 발생하는지 코드 예시를 들어주세요. [followup_answer] | GlobalDataStorage의 `SetAndWait`, `SetAsync` 에러 처리 및 `TransactSetAndWait`의 20개 제한 초과 시 행동에 대해 설명합니다. ### 1. SetAndWait와 SetAsync의 에러 코드 처리 두 메서드 모두 저장 작업의 성공 여부를 나타내는 **에러 코드(int32)** 를 반환하거나 콜백을 통해 전달합니다. 일반적으로 에러 코드가 `0`인 경우 성공, `0`이 아닌 경우 실패로 판단해야 합니다. * **SetAndWait (동기)**: * 함수 호출 후 반 [scores] | [judge_reason] | [source_doc] | . sortDirection으로 오름/내림차순 정렬을 설정할 수 있습니다. minDate, maxDate로 설정한 시간대 내에서 생성된 버전을 조회할 수 있습니다. 이 작업은 비동기로 수행되며, 작업이 완료되면 에러 코드, 키, 조회용 객체와 함께 callbackFunction으로 전달된 함수가 호출됩니다. - **int32 SetAndWait(string key, string value) [ServerOnly] [Yield]** 입력한 키로 데이터를 저장합니다. 작업이 완료되면 에러 코드를 반환합니다. 수행하는 동안 스크립트
[task] | instruction_following [pass] | ⏳ 미판정 [title] | SortableDataStorage [question] | `GetSortedAndWait` 메서드를 호출할 때 `sortDirection`, `min`, `max` 인자의 타입과 역할을 단계별 번호 목록으로 설명하세요. [answer] | `GetSortedAndWait` 메서드의 인자 타입과 역할은 다음과 같습니다. 1. **sortDirection**: `SortDirection` 타입의 인자입니다. 데이터의 정렬 방향(오름차순 또는 내림차순)을 설정하는 역할을 합니다. 2. **min**: `integer` 타입의 인자입니다. 조회할 데이터의 값 범위의 최소값을 설정하는 역할을 합니다. 3. **max**: `integer` 타입의 인자입니다. 조회할 데이터의 값 범위의 최대값을 설정하는 역할을 합니다. 이 메서드는 `min`과 `max`로 설정된 범위 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | lbackFunction) [ServerOnly]** 입력한 DataStorageKeyInfo들로 데이터들을 저장합니다. 이 작업은 비동기로 수행되며, 작업이 완료되면 에러 코드, 저장에 성공한 DataStorageKeyInfo들과 함께 callbackFunction으로 전달된 함수가 호출됩니다. - **int32 DeleteAndWait(string key) [ServerOnly] [Yield]** 입력한 키로 데이터를 삭제하고 에러 코드를 반환합니다. 수행하는 동안 스크립트 실행을 중단합니다. - **void Delete