[task] | code [pass] | ⏳ 미판정 [title] | DataStorage 활용하기 [question] | CreatorDataStorage를 활용하여 크리에이터 단위의 공유 데이터인 "worldVersion" 값이 "1.0"인지 확인하고, 다르다면 "1.0"으로 저장하는 로직을 구현하는 스크립트를 작성해줘. [answer] | CreatorDataStorage는 크리에이터 단위로 데이터를 공유하며, `string` 타입의 값만 저장할 수 있습니다. 요청하신 로직은 크리에이터의 `CreatorDataStorage`에서 `worldVersion` 키를 조회한 후, 값이 `1.0`이 아니면 `1.0`으로 덮어쓰는 과정으로 구성됩니다. 아래는 해당 기능을 구현한 mLua 스크립트입니다. ```lua Property: [None] string TargetVersion = "1.0" Method: [server only] void OnBeginPlay() { [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 이 가이드는 [Data DB 저장 및 불러오기](/docs/?postId=68)와 병행 학습을 권장합니다. "Data DB 저장 및 불러오기"에서는 간편하게 데이터를 생성, 저장, 불러오는 기능 위주로 살펴보았습니다. 이번 가이드에서는 DataStorageService의 다양한 함수를 통해 데이터를 증가시키거나, 페이지를 가지고 오는 등 크리에이터의 목적에 맞게 데이터를 활용하는 방법을 알아봅시다. ##### 참고 가이드 * [DataStorage 사용량 제한 알아보기](/docs?postId=1044) * [
[task] | two_turn [pass] | ⏳ 미판정 [title] | DataStorage 활용하기 [question] | DataStorage의 4가지 종류(Global, User, Creator, Sortable) 중 각각의 범위와 데이터 타입(string/int)의 차이점이 무엇인가요? [answer] | DataStorage는 범위와 용도에 따라 4가지 종류로 나뉘며, 각 종류마다 허용하는 데이터 타입이 다릅니다. **1. GlobalDataStorage** * **범위:** 하나의 월드 내에서만 사용됩니다. 다른 월드와 데이터가 공유되지 않습니다. * **데이터 타입:** `string` 타입의 값만 사용할 수 있습니다. * **특징:** 데이터 스토리지를 가져올 때 이름을 지정할 수 있으며, 하나의 월드에서 여러 개의 데이터 스토리지를 만들어 가질 수 있습니다. **2. UserDataStorage** * ** [followup] | SortableDataStorage가 int 타입만 지원하는데, string 타입의 값을 정렬해야 하는 상황에서는 어떻게 처리해야 하나요? [followup_answer] | SortableDataStorage는 `int` 타입의 값만 사용할 수 있으므로, `string` 타입의 값을 정렬해야 하는 상황에서는 해당 문자열을 정렬 가능한 정수값으로 변환하여 저장해야 합니다. 참고 문서에는 `string` 값이 아닌 다른 타입의 값을 사용하고 싶을 때 `_UtilLogic:TableToString()`를 사용해 문자열로 변경하는 방법이 언급되어 있지만, 이는 `string`이 아닌 타입을 `string`으로 변환하는 용도이며, 반대로 `string`을 `int`로 변환하는 구체적인 API나 방법은 문서에 [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 이 가이드는 [Data DB 저장 및 불러오기](/docs/?postId=68)와 병행 학습을 권장합니다. "Data DB 저장 및 불러오기"에서는 간편하게 데이터를 생성, 저장, 불러오는 기능 위주로 살펴보았습니다. 이번 가이드에서는 DataStorageService의 다양한 함수를 통해 데이터를 증가시키거나, 페이지를 가지고 오는 등 크리에이터의 목적에 맞게 데이터를 활용하는 방법을 알아봅시다. ##### 참고 가이드 * [DataStorage 사용량 제한 알아보기](/docs?postId=1044) * [
[task] | instruction_following [pass] | ⏳ 미판정 [title] | DataStorage 활용하기 [question] | SortDirection.Ascending 인자를 사용하여 0부터 100 사이의 값을 페이지네이션으로 처리하는 mLua 코드 블록만 출력하세요. [answer] | ```lua local sortableDataStorage = _DataStorageService:GetSortableDataStorage("sortableDS") local errorCode, pages = sortableDataStorage:GetSortedAndWait(SortDirection.Ascending, 0, 100) while true do local items = pages:GetCurrentPageDatas() for _, item in pairs(items) do log(item [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | SortableDataStorage는 GetSortedAndWait 및 GetSortedAsync 함수로 데이터를 정렬할 수 있습니다. 데이터를 정렬하여 가져올 때 오름차순으로 정렬할지 내림차순으로 정렬할지 지정할 수 있으며 최솟값과 최댓값을 지정하여 원하는 범위의 값 목록을 정렬하여 가져올 수 있습니다. SortableDataStorage에 저장된 데이터를 정렬해 가져오는 예제입니다. ```lua local sortableDataStorage = _DataStorageService:GetSortableDataStorage("s
[task] | single_turn [pass] | ⏳ 미판정 [title] | DataStorage 활용하기 [question] | GlobalDataStorage의 데이터를 페이지 단위로 조회할 때 IsLastPages 프로퍼티와 MoveToNextPageAndWait() 함수를 어떻게 조합해서 사용해야 하나요? [answer] | GlobalDataStorage의 데이터를 페이지 단위로 조회하려면 `GetGlobalDataStoragePages()` 메서드를 사용해 `GlobalDataStoragePages` 객체를 가져온 후, `IsLastPages` 프로퍼티와 `MoveToNextPageAndWait()` 함수를 조합하여 반복적으로 데이터를 가져와야 합니다. 구체적인 사용 순서는 다음과 같습니다. 1. **페이지 객체 생성**: `_DataStorageService:GetGlobalDataStoragePages("데이터스토리지명")`을 호출하여 `G [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | [GlobalDataStoragePages](/apiReference?postId=709), [SortableDataStoragePages](/apiReference?postId=713), [UserDataStoragePages](/apiReference?postId=717), [DataStorageItemPages](/apiReference?postId=703), [SortableDataStorageItemPages](/apiReference?postId=712), [DataStorageVersionPages](/apiRefere
[task] | two_turn [pass] | ⏳ 미판정 [title] | DataStorage 활용하기 [question] | Tag를 지정하지 않은 값에 대한 목록을 가져오지 못하는 제한사항과, 동일 키에 다른 Tag를 저장했을 때 태그가 덮어써지는 현상에 대해 어떤 주의사항이 필요한가요? [answer] | DataStorage에서 Tag를 사용할 때 주의해야 할 사항은 다음과 같습니다. **1. Tag 미지정 값의 목록 조회 불가** Tag 값을 지정하지 않고 저장한 데이터는 목록으로 가져올 때 조회 대상에서 제외됩니다. 즉, Tag를 지정하지 않은 값에 대한 목록을 받을 수 없으므로, 목록 조회 기능을 활용하려면 반드시 Tag를 지정해야 합니다. **2. 동일 키에 다른 Tag 저장 시 덮어쓰기** Tag는 데이터를 그룹으로 분리하는 기능이 아니라 단순한 식별자 역할을 합니다. 따라서 동일한 Key에 다른 Tag 값을 저장하면 [followup] | AKey에 TagA를 저장한 후 같은 AKey에 TagB를 저장했을 때, TagA로 필터링하여 값을 가져오면 어떤 결과가 나오며 이를 방지하기 위해 어떤 코드 작성 방식이 권장되나요? [followup_answer] | AKey에 TagA를 저장한 후 같은 AKey에 TagB를 저장하면, 해당 키에 연결된 태그는 **TagB로 덮어써집니다**. 따라서 TagA로 필터링하여 값을 가져오면 **해당 값이 조회되지 않습니다.** 태그는 데이터를 그룹으로 분리하는 기능이 아니라 단일 키에 연결된 식별자이기 때문에, 같은 키에 새 태그를 저장하면 이전 태그 정보는 사라집니다. 이 문제를 방지하기 위해 권장되는 코드 작성 방식은 다음과 같습니다. 1. **고유한 키(Key) 사용**: 동일한 데이터 그룹을 분리하여 관리해야 할 경우, 태그를 변경하는 [scores] | [judge_reason] | [source_doc] | DataStorage의 함수를 사용해 데이터를 저장, 삭제, 불러오기, 증가시키기, 순회 하기 등 다양한 데이터 관련 작업을 했을 때 해당 작업이 성공했는지 실패했는지를 에러 코드로 확인할 수 있습니다. 함수 요청이 성공했을 때의 에러 코드는 0입니다. 예를 들어, `local errorCode, successKeys = globalDataStorage:BatchSetAndWait(keyValues)` 와 같이 errorCode를 함께 작성해야 합니다. | ErrorCode | Error Name | 설명 | | --- | ---
[task] | single_turn [pass] | ⏳ 미판정 [title] | DataStorage 활용하기 [question] | _GetGlobalDataStoragePagesAndWait와 같은 함수를 호출하여 받은 pages 객체를 순회할 때, 실제 데이터를 추출하기 위해 어떤 단계를 거쳐야 하나요? [answer] | 제공된 참고 문서에는 `GetGlobalDataStoragePagesAndWait`와 같은 함수를 호출하여 `pages` 객체를 받는 단계까지만 설명되어 있습니다. 문서에는 **pages 객체를 순회하여 실제 데이터를 추출하는 구체적인 방법(예: 페이지 객체의 프로퍼티, 반복자 메서드, 페이지 번호 접근법 등)이 포함되어 있지 않습니다.** 따라서 제공된 문서 내용만으로는 pages 객체를 순회하는 단계와 데이터 추출 방법을 설명할 수 없습니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | SortableDataStorage는 IncreaseAndWait, IncreaseAsync 함수를 활용해 값을 증가시킬 수 있습니다. 각 함수의 delta 입력 값만큼 해당 매개 변수의 값이 증가하거나 감소합니다. 매개 변수로 들어온 값이 양수일 때는 증가, 음수일 때는 감소합니다. 만약, 증가시키고자 하는 값이 DataStorage에 존재하지 않는다면 기본값 0으로 저장하고 delta만큼 증가하게 됩니다. IncreaseAndWait 및 IncreaseAsync 함수는 에러 코드와 증가된 후의 값을 제공합니다. DataStor
[task] | single_turn [pass] | ⏳ 미판정 [title] | DataStorage 활용하기 [question] | GlobalDataStorage에서 DeleteAndWait로 키를 삭제한 후 바로 GetAndWait로 조회하면 어떤 결과가 나오며, 삭제되지 않은 키와 어떻게 구별할 수 있나요? [answer] | 삭제된 키를 `GetAndWait`로 조회하면 유효한 값을 얻을 수 없습니다. 문서의 예제에서는 `"Grade"` 키를 `DeleteAndWait`로 제거한 후 `GetAndWait`를 호출했을 때 "유효한 값을 얻을 수 없습니다"라고 명시되어 있습니다. 삭제되지 않은 키와 삭제된 키를 구별하는 구체적인 방법(예: 특정 에러 코드 반환 여부)에 대해서는 참고 문서에 언급되어 있지 않습니다. 문서에는 단순히 "유효한 값을 얻을 수 없습니다"라는 설명만 존재하므로, 구별 방법에 대한 추가적인 API나 로직은 확인할 수 없습니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | SortableDataStorage는 IncreaseAndWait, IncreaseAsync 함수를 활용해 값을 증가시킬 수 있습니다. 각 함수의 delta 입력 값만큼 해당 매개 변수의 값이 증가하거나 감소합니다. 매개 변수로 들어온 값이 양수일 때는 증가, 음수일 때는 감소합니다. 만약, 증가시키고자 하는 값이 DataStorage에 존재하지 않는다면 기본값 0으로 저장하고 delta만큼 증가하게 됩니다. IncreaseAndWait 및 IncreaseAsync 함수는 에러 코드와 증가된 후의 값을 제공합니다. DataStor
[task] | single_turn [pass] | ⏳ 미판정 [title] | DataStorage 활용하기 [question] | Transact 함수에서 최대 20개를 초과하는 키를 전달하면 어떻게 처리되나요? [answer] | 참고 문서에 따르면, Transact 함수를 사용할 때 한 번에 조작할 수 있는 Key의 최대 수는 20개입니다. 문서에는 20개를 초과하는 키를 전달했을 때의 구체적인 처리 방식(예: 오류 발생, 자동 분할 처리 등)에 대한 설명이 제공되지 않습니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | Transact 접두사인 함수를 활용해 데이터 저장하기, 불러오기, 제거하기를 원자적으로 일괄 요청할 수 있습니다. 만약 함수 호출에 포함된 모든 작업 중 하나라도 실패한다면, 함수 호출은 실패합니다. 한 번에 Key를 최대 20개까지 조작할 수 있습니다. 한 번에 전달된 요청들이 모두 성공하지 않으면 모두 실패 처리하고, 요청 이전의 데이터를 유지합니다. 그러므로 오류 처리 관련 코드를 간소화할 수 있습니다. 그러나 트랜잭션 보장을 위해 내부적으로 복잡한 처리 과정이 진행됩니다. credit 또한 Batch 함수에 비해 2배로 소
[task] | two_turn [pass] | ⏳ 미판정 [title] | DataStorage 활용하기 [question] | Version 기능을 활용해 특정 시점의 값으로 롤백하는 과정에서, 이전에 저장된 버전이 존재할 때 최신 버전으로 동작하는 우선순위 규칙이 어떻게 적용되나요? [answer] | DataStorage의 Version 기능에서 우선순위 규칙은 **버전이 처음 생성된 시점의 시간**에 따라 결정됩니다. 크리에이터가 명시적으로 버전을 지정하더라도, 이미 동일한 이름의 버전이 이전에 한 번이라도 저장된 이력이 남아 있다면 그 이력이 우선하여 해당 버전은 "최신 버전"으로 업데이트되지 않습니다. 구체적으로 적용되는 규칙은 다음과 같습니다: 1. **최초 생성 시점 기준:** A 버전과 B 버전을 순서대로 추가했다고 가정할 때, 나중에 A 버전을 다시 저장하더라도 A 버전은 이미 이전에 생성된 이력이 있으므로 최 [followup] | A 버전을 추가한 뒤 B 버전을 추가하고, 다시 A 버전을 추가했을 때 최종적으로 최신 버전으로 인식되는 것이 B 버전인 이유와 그 시나리오를 설명해 주세요. [followup_answer] | A 버전을 추가한 뒤 B 버전을 추가하고, 다시 A 버전을 추가했을 때 최신 버전으로 인식되는 것이 B 버전인 이유는 **버전의 우선순위가 "최초 생성 시점의 시간"에 따라 결정**되기 때문입니다. 구체적인 시나리오와 이유는 다음과 같습니다: 1. **A 버전 추가:** A 버전이 처음 생성됩니다. 이때 A 버전의 생성 시점이 기록됩니다. 2. **B 버전 추가:** B 버전이 A 버전보다 늦은 시점에 처음 생성됩니다. 3. **A 버전 다시 추가:** A 버전을 다시 저장하더라도, A 버전은 이미 이전에 생성된 이력이 남 [scores] | [judge_reason] | [source_doc] | DataStorage의 함수를 사용해 데이터를 저장, 삭제, 불러오기, 증가시키기, 순회 하기 등 다양한 데이터 관련 작업을 했을 때 해당 작업이 성공했는지 실패했는지를 에러 코드로 확인할 수 있습니다. 함수 요청이 성공했을 때의 에러 코드는 0입니다. 예를 들어, `local errorCode, successKeys = globalDataStorage:BatchSetAndWait(keyValues)` 와 같이 errorCode를 함께 작성해야 합니다. | ErrorCode | Error Name | 설명 | | --- | ---
[task] | single_turn [pass] | ⏳ 미판정 [title] | DataStorage 활용하기 [question] | GlobalDataStorage에 테이블 형태의 데이터를 저장할 때 어떤 함수 조합을 사용해야 하는지 궁금해요. [answer] | GlobalDataStorage에 테이블 형태의 데이터를 저장하려면, 먼저 테이블을 문자열로 변환한 뒤 저장하고, 가져올 때는 다시 테이블로 변환하는 과정을 거치셔야 합니다. GlobalDataStorage는 문자열 타입의 값만 저장 및 가져올 수 있기 때문에, 테이블을 그대로 저장할 수 없습니다. 이를 해결하기 위해 `_UtilLogic` 서비스의 두 가지 함수를 조합하여 사용해야 합니다. 1. **저장할 때**: `_UtilLogic:TableToString()` 함수를 사용하여 테이블을 문자열로 변환한 후, DataStor [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 데이터를 가져올 때는 GetAndWait, GetAsync 함수를 사용합니다. GlobalDataStorage, UserDataStorage, CreatorDataStorage는 문자열 타입의 값만 가져올 수 있습니다. 만약 데이터를 저장할 때 `_UtilLogic:TableToString()` 함수를 사용해 데이터를 문자열로 변환했다면, 데이터를 가져올 때는 `_UtilLogic:StringToTable()` 함수를 사용해 기존 타입으로 변환하여 사용할 수 있습니다. SortableDataStorage는 정수 타입의 값만 가져올
[task] | code [pass] | ⏳ 미판정 [title] | DataStorage 활용하기 [question] | `_DataStorageService:GetCreatorDataStorage()` 로 크리에이터 데이터 스토리지를 가져와 key를 지정하지 않고 데이터를 처리하는 서버 전용 스크립트를 작성해줘. [answer] | `_DataStorageService:GetCreatorDataStorage()`는 크리에이터당 하나씩 존재하는 데이터 스토리지를 반환하며, 이 스토리지에서는 key를 지정하지 않고 데이터를 처리할 수 있습니다. 제공된 문서에는 `GetCreatorDataStorage()`를 호출하여 스토리지 객체를 가져오는 방법만 명시되어 있으며, 해당 객체를 통해 데이터를 저장하거나 가져오는 구체적인 메서드(예: `SetAndWait`, `GetAndWait` 등)에 대한 설명은 포함되어 있지 않습니다. 따라서 문서에 근거하여 작성할 수 있는 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | DataStorage에 키 값과 더불어 Tag, Version을 지정해서 저장할 수 있습니다. 새로운 두 값을 저장하기 위해선 DataStorageKeyInfo를 활용해야 합니다. `DataStorageKeyInfo("key", "Tag", "Version1")`처럼 매개 변수로 key, Tag, Version을 사용할 수 있습니다. 만약 DataStorageKeyInfo를 Tag, Version 없이 사용한다면, SetAndWait, SetAsync류 함수를 사용해 데이터를 저장한 것과 동일합니다. 또한 SetByInfoAndW
[task] | single_turn [pass] | ⏳ 미판정 [title] | DataStorage 활용하기 [question] | DataStorage에 존재하지 않는 키에 대해 IncreaseAndWait를 호출하면 기본값 0으로 생성된 후 증가하는데, 이 과정에서 음수 delta를 입력하면 어떻게 처리되나요? [answer] | DataStorage에 존재하지 않는 키에 대해 `IncreaseAndWait`를 호출할 때, 해당 값은 먼저 기본값 0으로 생성됩니다. 이후 입력된 `delta` 값만큼 증가하거나 감소합니다. 따라서 `delta`가 음수인 경우, 기본값 0에서 해당 음수 값을 더하게 되므로 결과 값은 음수가 됩니다. 예를 들어, 존재하지 않는 키에 대해 `delta`로 -5를 입력하면, 0 - 5 = -5가 저장되고 반환됩니다. ```lua local sortableDataStorage = _DataStorageService:GetSortab [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | SortableDataStorage는 IncreaseAndWait, IncreaseAsync 함수를 활용해 값을 증가시킬 수 있습니다. 각 함수의 delta 입력 값만큼 해당 매개 변수의 값이 증가하거나 감소합니다. 매개 변수로 들어온 값이 양수일 때는 증가, 음수일 때는 감소합니다. 만약, 증가시키고자 하는 값이 DataStorage에 존재하지 않는다면 기본값 0으로 저장하고 delta만큼 증가하게 됩니다. IncreaseAndWait 및 IncreaseAsync 함수는 에러 코드와 증가된 후의 값을 제공합니다. DataStor
[task] | code [pass] | ⏳ 미판정 [title] | DataStorage 활용하기 [question] | _DataStorageService의 GetGlobalDataStorage 메서드를 호출하여 "globalDS" 객체를 가져온 후, GetCurrentPageDatas 함수를 통해 현재 페이지의 데이터 목록을 출력하는 스크립트를 작성해줘 [answer] | `_DataStorageService:GetGlobalDataStorage("globalDS")`로 `GlobalDataStorage` 객체를 가져온 후, `GetCurrentPageDatas()`를 호출하면 현재 페이지에 포함된 데이터 항목들을 배열로 반환합니다. 각 항목은 키와 값을 담고 있는 `GlobalDataStorageItem` 객체이며, 해당 객체의 `Key`와 `Value` 프로퍼티를 접근하여 값을 출력할 수 있습니다. 참고로 `GetCurrentPageDatas()`는 페이지 이동 없이 **현재 위치**의 데이터만 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | [GlobalDataStoragePages](/apiReference?postId=709), [SortableDataStoragePages](/apiReference?postId=713), [UserDataStoragePages](/apiReference?postId=717), [DataStorageItemPages](/apiReference?postId=703), [SortableDataStorageItemPages](/apiReference?postId=712), [DataStorageVersionPages](/apiRefere
[task] | instruction_following [pass] | ⏳ 미판정 [title] | DataStorage 활용하기 [question] | TransactDeleteAndWait 호출 시 결과값으로 반환되는 변수의 이름과 데이터 타입을 표로 정리해서 제시하세요. [answer] | `TransactDeleteAndWait` 함수는 동기 방식으로 데이터를 일괄 제거할 때 사용되며, 호출 시 두 가지 값을 반환합니다. 참고 문서의 예제 코드(`local code1, resultKeys1 = transactDs:TransactDeleteAndWait(keys1)`)를 기준으로 반환값의 이름과 데이터 타입은 다음과 같습니다. | 반환 변수 이름 (예제 기준) | 데이터 타입 | 설명 | | :--- | :--- | :--- | | `code1` | `number` | 작업 결과 코드. `0`이 아닌 경우 오류가 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | Transact 접두사인 함수를 활용해 데이터 저장하기, 불러오기, 제거하기를 원자적으로 일괄 요청할 수 있습니다. 만약 함수 호출에 포함된 모든 작업 중 하나라도 실패한다면, 함수 호출은 실패합니다. 한 번에 Key를 최대 20개까지 조작할 수 있습니다. 한 번에 전달된 요청들이 모두 성공하지 않으면 모두 실패 처리하고, 요청 이전의 데이터를 유지합니다. 그러므로 오류 처리 관련 코드를 간소화할 수 있습니다. 그러나 트랜잭션 보장을 위해 내부적으로 복잡한 처리 과정이 진행됩니다. credit 또한 Batch 함수에 비해 2배로 소
[task] | code [pass] | ⏳ 미판정 [title] | DataStorage 활용하기 [question] | SortableDataStorage를 사용하여 "score"라는 이름의 데이터 스토리지에서 가장 큰 값(int)을 가져와 log로 출력하고, 만약 데이터가 없다면 0을 출력하는 스크립트를 작성해줘. [answer] | SortableDataStorage API Reference(`SortableDataStorage` API Reference)에는 "가장 큰 값을 가져오는" 함수(예: `GetMax`, `GetLargest` 등)가 명시되어 있지 않습니다. 제공된 문서에는 SortableDataStorage가 **int 타입의 값만** 사용하고 **정렬, 증가 함수**를 활용할 수 있다는 설명만 있을 뿐, 구체적인 API 함수 목록이 없습니다. 따라서 제공된 참고 문서의 정보만으로는 "가장 큰 값을 가져오는" 특정 API를 사용해 코드를 작성할 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 이 가이드는 [Data DB 저장 및 불러오기](/docs/?postId=68)와 병행 학습을 권장합니다. "Data DB 저장 및 불러오기"에서는 간편하게 데이터를 생성, 저장, 불러오는 기능 위주로 살펴보았습니다. 이번 가이드에서는 DataStorageService의 다양한 함수를 통해 데이터를 증가시키거나, 페이지를 가지고 오는 등 크리에이터의 목적에 맞게 데이터를 활용하는 방법을 알아봅시다. ##### 참고 가이드 * [DataStorage 사용량 제한 알아보기](/docs?postId=1044) * [
[task] | single_turn [pass] | ⏳ 미판정 [title] | DataStorage 활용하기 [question] | 트랜잭션 실패 시 데이터가 어떻게 복구되는지, 그리고 그 과정에서 credit 소모량이 Batch 함수와 어떻게 다른지 설명해 주세요. [answer] | 트랜잭션(`Transact`) 함수를 호출할 때 포함된 작업 중 하나라도 실패하면, 해당 요청에 포함된 모든 작업이 실패 처리됩니다. 이 경우 데이터는 변경되지 않고 요청을 보내기 이전의 상태로 유지(복구)됩니다. 즉, 일부만 저장되거나 일부만 삭제되는 중간 상태가 발생하지 않으며, 원자성(Atomicity)이 보장됩니다. 이 원자적 보장을 위해 내부적으로 복잡한 처리 과정이 진행됩니다. 이로 인해 트랜잭션 함수는 `Batch` 함수에 비해 credit 소모량이 2배로 증가합니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | Transact 접두사인 함수를 활용해 데이터 저장하기, 불러오기, 제거하기를 원자적으로 일괄 요청할 수 있습니다. 만약 함수 호출에 포함된 모든 작업 중 하나라도 실패한다면, 함수 호출은 실패합니다. 한 번에 Key를 최대 20개까지 조작할 수 있습니다. 한 번에 전달된 요청들이 모두 성공하지 않으면 모두 실패 처리하고, 요청 이전의 데이터를 유지합니다. 그러므로 오류 처리 관련 코드를 간소화할 수 있습니다. 그러나 트랜잭션 보장을 위해 내부적으로 복잡한 처리 과정이 진행됩니다. credit 또한 Batch 함수에 비해 2배로 소
[task] | single_turn [pass] | ⏳ 미판정 [title] | DataStorage 활용하기 [question] | DataStorageKeyInfo를 사용해 특정 버전의 데이터를 가져오려는데, Tag 값을 지정해도 동작에 영향을 주지 않는다는 내용을 어떻게 이해해야 하나요? [answer] | DataStorage에서 데이터를 가져올 때 `DataStorageKeyInfo` 객체를 사용하여 `Key`와 `Version`을 지정할 수 있습니다. 이때 `Tag` 값을 지정하더라도, 데이터를 가져오는 동작에 아무런 영향을 주지 않습니다. 이는 `Tag`가 데이터 저장 시에는 메타데이터나 분류를 위해 사용될 수 있지만, 데이터 조회(가져오기) 단계에서는 조회 조건이나 결과에 관여하지 않기 때문입니다. 따라서 특정 버전의 데이터를 가져오려면 `Key`와 `Version`만 올바르게 지정하면 되며, `Tag`는 지정하지 않아도 되 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 데이터를 가져올 때는 GetAndWait, GetAsync 함수를 사용합니다. GlobalDataStorage, UserDataStorage, CreatorDataStorage는 문자열 타입의 값만 가져올 수 있습니다. 만약 데이터를 저장할 때 `_UtilLogic:TableToString()` 함수를 사용해 데이터를 문자열로 변환했다면, 데이터를 가져올 때는 `_UtilLogic:StringToTable()` 함수를 사용해 기존 타입으로 변환하여 사용할 수 있습니다. SortableDataStorage는 정수 타입의 값만 가져올
[task] | code [pass] | ⏳ 미판정 [title] | DataStorage 활용하기 [question] | GlobalDataStoragePages의 IsLastPages 프로퍼티와 MoveToNextPageAndWait 함수를 사용하여 페이지를 순회하며 데이터를 조회하는 로직을 포함하는 스크립트를 작성해줘 [answer] | GlobalDataStoragePages를 사용하여 데이터를 페이지 단위로 순회하는 로직은 `GetCurrentPageDatas()`와 `MoveToNextPageAndWait()` 함수를 조합하여 작성합니다. 모든 Pages 객체는 `IsLastPages` 프로퍼티와 `GetCurrentPageDatas()`, `MoveToNextPageAndWait()` 함수를 제공하므로, `IsLastPages`가 `false`일 때까지 다음 페이지로 이동하며 각 페이지의 데이터를 처리하는 구조를 취합니다. 아래는 GlobalDataStor [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | [GlobalDataStoragePages](/apiReference?postId=709), [SortableDataStoragePages](/apiReference?postId=713), [UserDataStoragePages](/apiReference?postId=717), [DataStorageItemPages](/apiReference?postId=703), [SortableDataStorageItemPages](/apiReference?postId=712), [DataStorageVersionPages](/apiRefere
[task] | two_turn [pass] | ⏳ 미판정 [title] | DataStorage 활용하기 [question] | DataStorage 작업 시 반환되는 에러 코드 0 외에 어떤 에러들이 존재하며 각각 어떤 상황을 의미하나요? [answer] | DataStorage 함수 호출 시 반환되는 에러 코드는 요청이 성공했을 때 0(Ok)을 제외하고 다음과 같은 값과 의미를 가집니다. | ErrorCode | Error Name | 설명 | | :--- | :--- | :--- | | 1000000 | Canceled | 요청이 취소되었습니다. | | 1000001 | InternalError | 내부 에러가 발생했습니다. | | 1000002 | NotFound | 요소를 찾을 수 없어 에러가 발생했습니다. | | 1000003 | BadRequest | 올바르지 않은 요청으로 [followup] | 에러 코드 1000006(PartialFailure)가 반환되었을 때, 성공한 키와 실패한 키를 어떻게 구분하여 처리해야 하나요? [followup_answer] | 제공된 참고 문서에는 에러 코드 `1000006`(`PartialFailure`)의 정의(일부 요청 실패)만 명시되어 있을 뿐, 성공한 키와 실패한 키를 구분하여 반환하는 구체적인 메서드나 반환 값 구조에 대한 정보는 포함되어 있지 않습니다. 따라서 주어진 문서 근거만으로는 `PartialFailure` 발생 시 성공/실패 키를 어떻게 분리해서 처리해야 하는지 답변할 수 없습니다. [scores] | [judge_reason] | [source_doc] | DataStorage의 함수를 사용해 데이터를 저장, 삭제, 불러오기, 증가시키기, 순회 하기 등 다양한 데이터 관련 작업을 했을 때 해당 작업이 성공했는지 실패했는지를 에러 코드로 확인할 수 있습니다. 함수 요청이 성공했을 때의 에러 코드는 0입니다. 예를 들어, `local errorCode, successKeys = globalDataStorage:BatchSetAndWait(keyValues)` 와 같이 errorCode를 함께 작성해야 합니다. | ErrorCode | Error Name | 설명 | | --- | ---
[task] | single_turn [pass] | ⏳ 미판정 [title] | DataStorage 활용하기 [question] | TransactDeleteAsync의 콜백에서 code가 0이 아닐 때 error() 함수를 호출하는 것이 권장되는 방식인가요? [answer] | 제공된 참고 문서에는 `TransactDeleteAsync`의 콜백에서 `code`가 0이 아닐 때 `error()` 함수를 호출하는 것이 권장되는 방식인지에 대한 명시적인 지침이나 권장 사항이 포함되어 있지 않습니다. 문서에는 단순히 예제 코드에서 `code ~= 0`일 경우 `error()`를 호출하여 오류를 처리하는 **사용 예시**만 제시되어 있을 뿐, 이것이 공식적으로 권장되는 패턴인지, 아니면 다른 오류 처리 방식(예: 로그 기록 후 무시, 재시도 등)이 더 나은지에 대한 설명은 찾을 수 없습니다. 따라서, 문서 근거 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | Transact 접두사인 함수를 활용해 데이터 저장하기, 불러오기, 제거하기를 원자적으로 일괄 요청할 수 있습니다. 만약 함수 호출에 포함된 모든 작업 중 하나라도 실패한다면, 함수 호출은 실패합니다. 한 번에 Key를 최대 20개까지 조작할 수 있습니다. 한 번에 전달된 요청들이 모두 성공하지 않으면 모두 실패 처리하고, 요청 이전의 데이터를 유지합니다. 그러므로 오류 처리 관련 코드를 간소화할 수 있습니다. 그러나 트랜잭션 보장을 위해 내부적으로 복잡한 처리 과정이 진행됩니다. credit 또한 Batch 함수에 비해 2배로 소
[task] | single_turn [pass] | ⏳ 미판정 [title] | DataStorage 활용하기 [question] | GlobalDataStorage를 가져오는 GetGlobalDataStorage의 인자로 사용하는 self.TransactionTestDsName은 어디서 정의하는 속성인가요? [answer] | `self.TransactionTestDsName`은 제공된 참고 문서에 구체적인 정의 위치나 생성 방법이 명시되어 있지 않습니다. 문서에서는 해당 변수가 `_DataStorageService:GetGlobalDataStorage()` 함수의 인자로 사용되고, 예제 코드 내에 `self.TransactionTestDsName`이라는 식별자가 등장하는 것만 확인할 수 있습니다. 하지만 이것이 스크립트 컴포넌트의 `Property:` 블록에서 선언되었는지, 아니면 다른 방식으로 정의되는지에 대한 정보는 문서에 포함되어 있지 않습니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | Transact 접두사인 함수를 활용해 데이터 저장하기, 불러오기, 제거하기를 원자적으로 일괄 요청할 수 있습니다. 만약 함수 호출에 포함된 모든 작업 중 하나라도 실패한다면, 함수 호출은 실패합니다. 한 번에 Key를 최대 20개까지 조작할 수 있습니다. 한 번에 전달된 요청들이 모두 성공하지 않으면 모두 실패 처리하고, 요청 이전의 데이터를 유지합니다. 그러므로 오류 처리 관련 코드를 간소화할 수 있습니다. 그러나 트랜잭션 보장을 위해 내부적으로 복잡한 처리 과정이 진행됩니다. credit 또한 Batch 함수에 비해 2배로 소
[task] | two_turn [pass] | ⏳ 미판정 [title] | DataStorage 활용하기 [question] | DataStorage에 저장된 데이터를 삭제하는 DeleteAndWait 함수 사용 후, 해당 키로 값을 조회하면 어떤 결과가 반환되나요? [answer] | `DeleteAndWait` 함수로 DataStorage에 저장된 데이터를 삭제한 후, 해당 키로 값을 조회하면 유효한 값을 얻을 수 없습니다. 예를 들어 "globalDS"라는 이름의 GlobalDataStorage에서 "Grade" 키의 값을 삭제한 후 `GetAndWait("Grade")`를 호출하면, "Grade"가 제거되었기 때문에 유효한 값을 반환받지 못합니다. ```lua local globalDataStorage = _DataStorageService:GetGlobalDataStorage("globalDS") gl [followup] | 삭제된 키를 다시 IncreaseAndWait로 생성할 때, 기존 삭제 전의 값이 복원되는지 아니면 0부터 시작하는지 확인하고 싶은데 코드 예시가 있을까요? [followup_answer] | 참고 문서에는 `DeleteAndWait`로 삭제된 키를 `IncreaseAndWait`로 다시 생성할 때 기존 값이 복원되는지, 아니면 0부터 시작하는지에 대한 명시적인 설명이 없습니다. 문서에서 확인 가능한 내용은 다음과 같습니다: 1. `IncreaseAndWait`는 "증가시키고자 하는 값이 DataStorage에 **존재하지 않는다면** 기본값 0으로 저장하고 delta만큼 증가"합니다. 2. `DeleteAndWait`를 호출하면 해당 키는 "제거"되며, 이후 `GetAndWait`로 조회하면 "유효한 값을 얻을 수 [scores] | [judge_reason] | [source_doc] | SortableDataStorage는 IncreaseAndWait, IncreaseAsync 함수를 활용해 값을 증가시킬 수 있습니다. 각 함수의 delta 입력 값만큼 해당 매개 변수의 값이 증가하거나 감소합니다. 매개 변수로 들어온 값이 양수일 때는 증가, 음수일 때는 감소합니다. 만약, 증가시키고자 하는 값이 DataStorage에 존재하지 않는다면 기본값 0으로 저장하고 delta만큼 증가하게 됩니다. IncreaseAndWait 및 IncreaseAsync 함수는 에러 코드와 증가된 후의 값을 제공합니다. DataStor
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 스프라이트 색상을 픽셀 단위로 설정하기 [question] | PixelRendererComponent의 프로퍼티 중 Width, Height, OrderInLayer의 타입과 주요 기능을 표로 정리해서 [answer] | PixelRendererComponent의 요청하신 프로퍼티 정보입니다. | 이름 | 타입 | 주요 기능 | | --- | --- | --- | | Width | int | 스프라이트의 가로 길이입니다. | | Height | int | 스프라이트의 세로 길이입니다. | | OrderInLayer | int | 같은 Layer 내의 우선순위를 결정합니다. 수가 클수록 앞에 보입니다. | [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 **PixelRendererComponent**를 활용하면 크리에이터가 비어있는 스프라이트에 픽셀 단위로 원하는 색을 지정할 수 있습니다. 특정 위치의 픽셀 색상만 바꾸거나 전체 스프라이트 색상을 지정할 수도 있고, 랜덤한 색상으로 변경할 수도 있습니다. 먼저 **PixelRendererComponent**의 프로퍼티를 살펴보고 예제를 통해 활용법을 알아봅시다. ##### 참고 API Reference [PixelRendererComponent](https://mod-developers.nexon.com/api
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 스프라이트 색상을 픽셀 단위로 설정하기 [question] | PixelRendererComponent의 SortingLayer와 IgnoreMapLayerCheck가 상호작용하는 방식을 3문장 이내로 [answer] | `SortingLayer`에 Map Layer 이름을 지정하면 기본적으로 해당 레이어 값이 자동 치환되어 렌더링 우선순위가 결정됩니다. `IgnoreMapLayerCheck`가 `true`로 설정되면 이 자동 치환 과정이 수행되지 않습니다. 따라서 `IgnoreMapLayerCheck`가 `true`일 때 `SortingLayer`에 Map Layer 이름을 입력하면 치환 없이 원래 값 그대로 우선순위가 적용됩니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 **PixelRendererComponent**를 활용하면 크리에이터가 비어있는 스프라이트에 픽셀 단위로 원하는 색을 지정할 수 있습니다. 특정 위치의 픽셀 색상만 바꾸거나 전체 스프라이트 색상을 지정할 수도 있고, 랜덤한 색상으로 변경할 수도 있습니다. 먼저 **PixelRendererComponent**의 프로퍼티를 살펴보고 예제를 통해 활용법을 알아봅시다. ##### 참고 API Reference [PixelRendererComponent](https://mod-developers.nexon.com/api
[task] | single_turn [pass] | ⏳ 미판정 [title] | DataStorage 활용하기 [question] | IncreaseAsync 함수를 호출했을 때 반환되는 에러 코드와 값은 각각 무엇을 의미하며, 즉시 결과를 확인해야 할 때는 어떤 함수를 사용해야 하나요? [answer] | `IncreaseAsync` 함수를 호출했을 때 반환되는 값은 각각 다음과 같은 의미를 가집니다. 1. **에러 코드 (errorCode):** `IncreaseAsync` 호출 결과의 성공 여부를 나타내는 코드입니다. 2. **값 (value):** 증가 또는 감소가 완료된 후의 **최종 값**을 제공합니다. 즉시 결과를 확인해야 하는 상황에서는 비동기(Async) 함수가 아닌 **`IncreaseAndWait`** 함수를 사용해야 합니다. `IncreaseAndWait`는 작업이 완료될 때까지 대기하며, 완료된 시점에 에 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | SortableDataStorage는 IncreaseAndWait, IncreaseAsync 함수를 활용해 값을 증가시킬 수 있습니다. 각 함수의 delta 입력 값만큼 해당 매개 변수의 값이 증가하거나 감소합니다. 매개 변수로 들어온 값이 양수일 때는 증가, 음수일 때는 감소합니다. 만약, 증가시키고자 하는 값이 DataStorage에 존재하지 않는다면 기본값 0으로 저장하고 delta만큼 증가하게 됩니다. IncreaseAndWait 및 IncreaseAsync 함수는 에러 코드와 증가된 후의 값을 제공합니다. DataStor
[task] | two_turn [pass] | ⏳ 미판정 [title] | DataStorage 활용하기 [question] | 특정 버전의 DataStorage 값을 가져오고 싶을 때 `DataStorageKeyInfo`는 어떻게 사용해야 하나요? [answer] | 특정 버전의 DataStorage 값을 가져오려면 `DataStorageKeyInfo` 객체를 생성하여 해당 객체의 `Key`와 `Version` 필드를 설정한 뒤, `GetByInfoAndWait` 또는 `GetByInfoAsync` 함수에 이 객체를 인수로 전달해야 합니다. `DataStorageKeyInfo`는 `Key`, `Tag`, `Version` 값을 지정할 수 있습니다. 데이터 가져오기 시 `Tag` 값은 지정되어 있더라도 동작에 영향을 주지 않습니다. `Version`을 지정하지 않으면 최신 버전의 값이 반환되며, [followup] | `GetByInfoAndWait`를 사용하여 `Version`을 지정해 과거 버전의 값을 가져오는 코드 예제와, `Tag`가 가져오기 동작에 영향을 주지 않는다는 점에 대한 설명이 필요합니다. [followup_answer] | `GetByInfoAndWait`를 사용해 특정 과거 버전의 값을 가져오려면 `DataStorageKeyInfo` 객체를 생성하고 `Key`와 `Version` 필드를 설정한 뒤, 이 객체를 `GetByInfoAndWait`의 인수로 전달합니다. `DataStorageKeyInfo`에는 `Key`, `Tag`, `Version` 세 가지 값을 지정할 수 있습니다. 하지만 데이터를 가져올 때 `Tag` 값은 지정되어 있더라도 실제 동작에 영향을 주지 않습니다. 즉, `Tag`를 설정하든 설정하지 않든 가져오는 값은 `Key`와 `V [scores] | [judge_reason] | [source_doc] | 데이터를 가져올 때는 GetAndWait, GetAsync 함수를 사용합니다. GlobalDataStorage, UserDataStorage, CreatorDataStorage는 문자열 타입의 값만 가져올 수 있습니다. 만약 데이터를 저장할 때 `_UtilLogic:TableToString()` 함수를 사용해 데이터를 문자열로 변환했다면, 데이터를 가져올 때는 `_UtilLogic:StringToTable()` 함수를 사용해 기존 타입으로 변환하여 사용할 수 있습니다. SortableDataStorage는 정수 타입의 값만 가져올
[task] | single_turn [pass] | ⏳ 미판정 [title] | DataStorage 활용하기 [question] | GetAndWait와 GetAsync 함수의 차이점과 각각 언제 사용하는 것이 적절한지 설명해 줄 수 있나요? [answer] | `GetAndWait`와 `GetAsync` 함수의 차이점과 사용 시기는 다음과 같습니다. **1. 차이점** * **GetAndWait (동기 방식):** 데이터 가져오기 작업이 완료될 때까지 스크립트 실행을 중단(대기)합니다. 작업이 끝난 후 즉시 값을 반환받습니다. * **GetAsync (비동기 방식):** 데이터 가져오기 작업을 즉시 시작하고, 스크립트 실행은 중단하지 않고 계속 진행합니다. 작업이 완료되면 `callbackFunction` 매개변수로 전달된 함수가 호출되어 그 시점에 결과를 처리합니다. **2. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 데이터를 가져올 때는 GetAndWait, GetAsync 함수를 사용합니다. GlobalDataStorage, UserDataStorage, CreatorDataStorage는 문자열 타입의 값만 가져올 수 있습니다. 만약 데이터를 저장할 때 `_UtilLogic:TableToString()` 함수를 사용해 데이터를 문자열로 변환했다면, 데이터를 가져올 때는 `_UtilLogic:StringToTable()` 함수를 사용해 기존 타입으로 변환하여 사용할 수 있습니다. SortableDataStorage는 정수 타입의 값만 가져올
[task] | single_turn [pass] | ⏳ 미판정 [title] | DataStorage 활용하기 [question] | 일괄 요청(Batch) 함수를 사용할 때 전체 작업이 실패하는 경우와 일부만 실패하는 경우의 에러 코드 반환 방식이 어떻게 다른가요? [answer] | 제공된 참고 문서에는 일괄 요청(Batch) 함수에서 **전체 작업이 실패하는 경우**와 **일부만 실패하는 경우**의 에러 코드 반환 방식이 어떻게 다른지에 대한 구체적인 정보가 없습니다. 문서에는 다음과 같은 사실만 명시되어 있습니다: 1. `BatchSetAndWait()` 및 `BatchSetAsync()` 함수는 **에러 코드**와 **요청이 성공한 값의 키 테이블**을 제공합니다. 2. 요청된 작업들 중 **일부만 성공하는 상황**이 발생할 수 있습니다. 3. 따라서 결괏값을 확인해 성공하지 않은 작업이 있다면 적절한 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | DataStorage 목록 또는 데이터 목록을 받을 때 페이지 단위로 목록을 조회할 수 있는 객체인 Pages 형태로 값을 받습니다. ```lua local errorCode, globalDataStoragePages = _DataStorageService:GetGlobalDataStoragePagesAndWait() while true do local globalDataStorages = globalDataStoragePages:GetCurrentPageDatas() --GetCurrentPageDatas()로 현
[task] | code [pass] | ⏳ 미판정 [title] | DataStorage 활용하기 [question] | "sortableDS" SortableDataStorage에서 "InventoryCount" 키의 값을 1 감소시키며, 음수 값이 될 경우 0으로 고정되지 않고 그대로 감소한 값을 반환받아 로그로 출력하는 스크립트를 작성해줘 [answer] | `IncreaseAndWait` 함수는 `delta` 값이 음수일 경우 해당 키의 값을 감소시킵니다. 문서에 따르면 이 함수는 감소 후의 값을 반환하며, 값이 음수가 될 경우 0으로 고정되는 로직에 대한 설명은 없습니다. 따라서 `delta`로 `-1`을 전달하면 기존 값에서 1이 뺀 값(음수 포함)이 반환됩니다. 요청하신 조건에 맞는 스크립트입니다. ```lua Method: [server only] void DecreaseInventoryCount() { local sortableDataStorage = _DataSt [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | SortableDataStorage는 IncreaseAndWait, IncreaseAsync 함수를 활용해 값을 증가시킬 수 있습니다. 각 함수의 delta 입력 값만큼 해당 매개 변수의 값이 증가하거나 감소합니다. 매개 변수로 들어온 값이 양수일 때는 증가, 음수일 때는 감소합니다. 만약, 증가시키고자 하는 값이 DataStorage에 존재하지 않는다면 기본값 0으로 저장하고 delta만큼 증가하게 됩니다. IncreaseAndWait 및 IncreaseAsync 함수는 에러 코드와 증가된 후의 값을 제공합니다. DataStor
[task] | two_turn [pass] | ⏳ 미판정 [title] | DataStorage 활용하기 [question] | SortableDataStorage에서 IncreaseAndWait와 IncreaseAsync를 사용할 때, 증가시킬 값이 아직 DB에 존재하지 않으면 어떻게 처리되나요? [answer] | SortableDataStorage에서 `IncreaseAndWait` 또는 `IncreaseAsync` 함수를 호출할 때, 해당 키의 값이 아직 저장되어 있지 않으면 기본값 0으로 생성된 후 입력된 `delta` 값만큼 증가하거나 감소됩니다. 구체적인 처리 방식은 다음과 같습니다. * **기본값 초기화:** 존재하지 않는 키는 자동으로 0으로 생성됩니다. * **증가/감소:** `delta` 값이 양수일 경우 0에서 `delta`만큼 증가하고, 음수일 경우 0에서 `delta`만큼 감소합니다. * **반환값:** 함수 [followup] | 존재하지 않는 Key에 음수 delta를 전달하면 어떤 결과가 나오며, 에러 코드는 반환되나요? [followup_answer] | 존재하지 않는 Key에 음수 `delta`를 전달하면, 해당 Key가 **기본값 0으로 생성**된 후 전달된 음수 `delta`만큼 **감소**합니다. 즉, `delta`가 -5라면 초기 값 0에서 5를 빼므로 최종 결과는 **-5**가 됩니다. 이 과정에서 에러 코드가 반환되며, 정상적으로 처리되면 에러 코드는 0(성공)이 되고, 반환되는 두 번째 값은 감소 처리가 완료된 후의 값(-5)입니다. ```lua local sortableDataStorage = _DataStorageService:GetSortableDataSto [scores] | [judge_reason] | [source_doc] | SortableDataStorage는 IncreaseAndWait, IncreaseAsync 함수를 활용해 값을 증가시킬 수 있습니다. 각 함수의 delta 입력 값만큼 해당 매개 변수의 값이 증가하거나 감소합니다. 매개 변수로 들어온 값이 양수일 때는 증가, 음수일 때는 감소합니다. 만약, 증가시키고자 하는 값이 DataStorage에 존재하지 않는다면 기본값 0으로 저장하고 delta만큼 증가하게 됩니다. IncreaseAndWait 및 IncreaseAsync 함수는 에러 코드와 증가된 후의 값을 제공합니다. DataStor