[task] | single_turn [pass] | ⏳ 미판정 [title] | DataStorage 활용하기 [question] | SortableDataStorage에서 SetAndWait 메서드를 사용할 때 저장하는 값이 정수여야 하는 이유는 무엇이며, 이를 지키지 않으면 어떻게 되나요? [answer] | SortableDataStorage에서 `SetAndWait` 메서드로 저장하는 값은 반드시 정수여야 합니다. 이는 데이터 스토리지의 타입별 저장 규칙에 의합니다. Global, User, Creator 데이터 스토리지는 값을 문자열로만 저장할 수 있는 반면, Sortable 데이터 스토리지는 값을 정수로만 저장하도록 설계되어 있습니다. 문서에는 정수 외의 값을 저장했을 때의 구체적인 오류 메시지나 실패 동작에 대한 명시적인 설명이 없습니다. 다만, "데이터를 활용하는 함수는 데이터 스토리지 종류에 맞는 것으로 사용해야 합니다"라 [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] | single_turn [pass] | ⏳ 미판정 [title] | DataStorage 활용하기 [question] | GlobalDataStorage와 SortableDataStorage에서 데이터를 저장할 때 허용되는 값의 타입이 각각 무엇이며, 왜 이렇게 다른가요? [answer] | GlobalDataStorage와 SortableDataStorage에서 데이터를 저장할 때 허용되는 값의 타입은 다음과 같습니다. 1. **GlobalDataStorage**: 값을 **문자열(string)** 로만 저장할 수 있습니다. 2. **SortableDataStorage**: 값을 **정수(integer/number)** 로만 저장할 수 있습니다. 이 두 데이터 스토리지의 저장 값 타입이 서로 다른 이유는 **데이터 스토리지의 종류(타입)마다 데이터를 저장하는 값의 타입이 명확하게 구분되어 있기 때문**입니다. [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] | single_turn [pass] | ⏳ 미판정 [title] | DataStorage 활용하기 [question] | DataStorageKeyInfo 객체를 통해 Key, Tag, Version을 지정할 수 있는데, 이 중 Tag를 중복 저장하면 기존 태그 값이 유지되는지 아니면 덮어쓰여지는지 그 동작 방식을 알려주세요. [answer] | DataStorage에서 Tag는 그룹을 분리하는 기능이 아니라 추가 식별자로만 동작하며, 같은 Key에 대해 새로운 Tag를 저장하면 기존에 저장되어 있던 Tag 값은 유지되지 않고 새 Tag 값으로 **덮어써집니다**. 예를 들어, `AKey`에 `TagA`를 저장한 후 다시 `AKey`에 `TagB`를 저장하게 되면, 해당 키의 태그는 `TagB`가 됩니다. 참고로, Tag 값을 지정하지 않고 데이터를 저장하는 경우에도 같은 원리가 적용되며, 태그를 지정하지 않은 상태의 값 목록을 별도로 가져올 수는 없습니다. 이 동작 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | DataStorage의 함수를 사용해 데이터를 저장, 삭제, 불러오기, 증가시키기, 순회 하기 등 다양한 데이터 관련 작업을 했을 때 해당 작업이 성공했는지 실패했는지를 에러 코드로 확인할 수 있습니다. 함수 요청이 성공했을 때의 에러 코드는 0입니다. 예를 들어, `local errorCode, successKeys = globalDataStorage:BatchSetAndWait(keyValues)` 와 같이 errorCode를 함께 작성해야 합니다. | ErrorCode | Error Name | 설명 | | --- | ---
[task] | code [pass] | ⏳ 미판정 [title] | DataStorage 활용하기 [question] | globalDataStorage:BatchSetAndWait 를 사용하여 키-값 쌍을 저장하고, 반환된 errorCode 가 0 이 아니면 log 로 실패를 출력하는 스크립트를 작성해줘 [answer] | `globalDataStorage:BatchSetAndWait` 함수는 키-값 쌍을 저장할 때 성공 여부에 따라 에러 코드를 반환합니다. 성공 시 에러 코드는 `0`입니다. 요청하신 조건에 따라, 저장 후 `errorCode`가 `0`이 아니면 `log`로 실패를 출력하는 스크립트는 다음과 같습니다. ```lua Method: [server only] void OnBeginPlay() { local globalDataStorage = _DataStorageService:GetGlobalDataStorage("Storage [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | DataStorage의 함수를 사용해 데이터를 저장, 삭제, 불러오기, 증가시키기, 순회 하기 등 다양한 데이터 관련 작업을 했을 때 해당 작업이 성공했는지 실패했는지를 에러 코드로 확인할 수 있습니다. 함수 요청이 성공했을 때의 에러 코드는 0입니다. 예를 들어, `local errorCode, successKeys = globalDataStorage:BatchSetAndWait(keyValues)` 와 같이 errorCode를 함께 작성해야 합니다. | ErrorCode | Error Name | 설명 | | --- | ---
[task] | code [pass] | ⏳ 미판정 [title] | 날짜와 시간 활용하기 [question] | DateTime 객체의 ToFormattedString 메서드를 활용하여 24시간제 시간 "HH"과 표준 시간대 정보 "%K"을 조합해 "19Z" 또는 "19+09:00" 형태의 UTC 기반 시각을 출력하는 스크립트를 작성해줘 [answer] | `DateTime` 객체의 `ToFormattedString` 메서드에 사용자 지정 서식 문자열을 전달하면 원하는 형태로 날짜와 시간을 포맷팅할 수 있습니다. 24시간제 시간(`HH`)과 표준 시간대 정보(`%K`)를 조합하여 `"19Z"` 또는 `"19+09:00"` 형태의 시각을 출력하는 방법은 다음과 같습니다. 1. **서식 문자열 조합**: `HH`과 `%K`를 하나의 문자열로 연결하여 `HH%K`로 사용합니다. 2. **시간대 정보**: * `DateTime`의 종류가 **UTC**인 경우, `%K`는 ` [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | "g" 또는 "gg" 사용자 지정 서식 지정자는 연대를 나타냅니다. 기본적으로 A.D(Anno Domini, 기원후)로 나타납니다. "g" 사용자 지정 서식 지정자만 단독으로 사용하는 경우 표준 서식 문자열로 잘못 해석되지 않도록 앞에 "%" 사용자 지정 서식 지정자를 사용해야 합니다. ```lua local date = DateTime(2022, 8, 29, 19, 27, 15, 023) log(date:ToFormattedString("%g")) -- A.D. ``` #### "h" "h" 사용자 지정 서식 지정자는 시간
[task] | instruction_following [pass] | ⏳ 미판정 [title] | DataStorage 활용하기 [question] | SortableDataStorage의 IncreaseAndWait 함수가 존재하지 않는 키에 대해 5를 증가시킬 때 반환되는 값과 그 이유를 3문장 이내로 설명하세요. [answer] | 존재하지 않는 키는 기본값 0으로 생성된 뒤 증가 대상이 됩니다. 따라서 delta 값인 5가 더해져 최종 값 5가 반환됩니다. 이 과정은 에러 코드와 함께 증가된 후의 값을 반환하는 방식으로 처리됩니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | SortableDataStorage는 IncreaseAndWait, IncreaseAsync 함수를 활용해 값을 증가시킬 수 있습니다. 각 함수의 delta 입력 값만큼 해당 매개 변수의 값이 증가하거나 감소합니다. 매개 변수로 들어온 값이 양수일 때는 증가, 음수일 때는 감소합니다. 만약, 증가시키고자 하는 값이 DataStorage에 존재하지 않는다면 기본값 0으로 저장하고 delta만큼 증가하게 됩니다. IncreaseAndWait 및 IncreaseAsync 함수는 에러 코드와 증가된 후의 값을 제공합니다. DataStor
[task] | two_turn [pass] | ⏳ 미판정 [title] | 날짜와 시간 활용하기 [question] | DateTime 클래스의 ToFormattedString 메서드에서 "mm", "M", "MM" 등 다양한 사용자 지정 서식 지정자의 차이점과 사용법을 설명해 주세요. [answer] | `DateTime` 객체의 `ToFormattedString` 메서드는 날짜와 시간 정보를 원하는 형식의 문자열로 변환하는 데 사용됩니다. 각 서식 지정자는 특정 부분(월, 분, 초 등)을 나타내며, 글자 수에 따라 0으로 채우는지(패딩) 여부가 달라집니다. 또한, 표준 서식 문자열과 충돌할 수 있는 특정 지정자는 앞에 `%`를 붙여야 합니다. 주요 서식 지정자의 차이점과 사용법은 다음과 같습니다. ### 1. 분(Minute) 관련 지정자 * **`mm`**: 분을 `00`부터 `59`까지의 숫자로 나타냅니다. * [followup] | "M" 지정자를 단독으로 사용할 때 표준 서식 문자열로 오인되지 않도록 "%M"처럼 "%" 접두사가 필요한 구체적인 이유는 무엇이며, "MMM" 지정자에 문화권 파라미터(예: "it-IT")를 전달할 때의 출력 결과는 어떻게 달라지나요? [followup_answer] | ### 1. "M" 지정자에 "%" 접두사가 필요한 이유 `"M"` 사용자 지정 서식 지정자를 단독으로 사용할 때 앞에 `%`를 붙여 `%M`으로 사용해야 하는 구체적인 이유는 **표준 서식 문자열(Standard Format String)로 잘못 해석되는 것을 방지하기** 위함입니다. 메이플스토리 월드의 `DateTime` 클래스에서 `ToFormattedString` 메서드는 사용자가 전달한 문자열을 사용자 지정 서식(Custom Format)으로만 해석하지 않고, 특정 패턴이 표준 서식 문자열과 일치할 경우 표준 서식으로 [scores] | [judge_reason] | [source_doc] | "mm" 사용자 지정 서식 지정자는 분을 00부터 59까지의 숫자로 나타냅니다. 분은 마지막 시간 이후 경과한 총 분 수를 나타냅니다. 분이 한 자릿수인 경우 십의 자리는 0으로 표시됩니다. ```lua local date = DateTime(2022, 8, 29, 19, 7, 15, 023) log(date:ToFormattedString("mm")) -- 07 ``` #### "M" "M" 사용자 지정 서식 지정자는 월을 1부터 12까지의 숫자로 나타냅니다. 월이 한 자릿수인 경우 십의 자리는 표시되지 않습니다. "M" 사용
[task] | code [pass] | ⏳ 미판정 [title] | DataStorage 활용하기 [question] | globalDataStorage:ListAndWait 를 사용해 Tag 가 "GroupA" 인 항목 목록을 가져오면서 errorCode 가 0 일 때만 결과 목록을 처리하는 스크립트를 작성해줘 [answer] | 참고 문서에는 `globalDataStorage:ListAndWait` 함수에 대한 설명이나 사용 예시가 없습니다. 따라서 요청하신 `ListAndWait`를 사용한 스크립트를 작성할 수 없습니다. 대신, 문서에 명시된 `BatchGetByInfoAndWait`를 사용하여 특정 Key와 Tag를 가진 항목을 조회하고, `errorCode`가 0일 때만 결과를 처리하는 스크립트를 아래에 제공합니다. ```lua Method: [server only] void OnBeginPlay() { local ds = _DataStor [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | DataStorage의 함수를 사용해 데이터를 저장, 삭제, 불러오기, 증가시키기, 순회 하기 등 다양한 데이터 관련 작업을 했을 때 해당 작업이 성공했는지 실패했는지를 에러 코드로 확인할 수 있습니다. 함수 요청이 성공했을 때의 에러 코드는 0입니다. 예를 들어, `local errorCode, successKeys = globalDataStorage:BatchSetAndWait(keyValues)` 와 같이 errorCode를 함께 작성해야 합니다. | ErrorCode | Error Name | 설명 | | --- | ---
[task] | instruction_following [pass] | ⏳ 미판정 [title] | DataStorage 활용하기 [question] | DataStorageService를 통해 SortableDataStorage 목록을 조회하는 코드를 출력하되, 설명은 주석으로만 작성하고 코드 블록은 ```lua로 감싸세요. [answer] | ```lua -- DataStorageService를 통해 SortableDataStorage 목록을 조회합니다. local errorCode, sortableDataStoragePages = _DataStorageService:GetSortableDataStoragePagesAndWait() ``` [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | SortableDataStorage는 IncreaseAndWait, IncreaseAsync 함수를 활용해 값을 증가시킬 수 있습니다. 각 함수의 delta 입력 값만큼 해당 매개 변수의 값이 증가하거나 감소합니다. 매개 변수로 들어온 값이 양수일 때는 증가, 음수일 때는 감소합니다. 만약, 증가시키고자 하는 값이 DataStorage에 존재하지 않는다면 기본값 0으로 저장하고 delta만큼 증가하게 됩니다. IncreaseAndWait 및 IncreaseAsync 함수는 에러 코드와 증가된 후의 값을 제공합니다. DataStor
[task] | code [pass] | ⏳ 미판정 [title] | 날짜와 시간 활용하기 [question] | DateTime 객체의 ToFormattedString 메서드를 활용해 "MM/dd/yyyy hh:mm:ss tt" 형식으로 현재 시각을 로그에 출력하는 스크립트를 작성해줘 [answer] | 요청하신 형식(`MM/dd/yyyy hh:mm:ss tt`)을 출력하는 스크립트는 다음과 같습니다. 참고 문서에 제공된 서식 지정자(`MM`, `dd`, `yyyy`, `hh`, `mm`, `ss`, `tt`)를 조합하여 사용할 수 있습니다. 현재 시각을 가져오는 메서드(예: `DateTime.Now` 등)에 대한 정보가 문서에 없으므로, 예제 코드에서 사용된 `DateTime` 생성자 시그니처(`DateTime(year, month, day, hour, minute, second, millisecond)`)를 기반으로 현재 시각 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | "mm" 사용자 지정 서식 지정자는 분을 00부터 59까지의 숫자로 나타냅니다. 분은 마지막 시간 이후 경과한 총 분 수를 나타냅니다. 분이 한 자릿수인 경우 십의 자리는 0으로 표시됩니다. ```lua local date = DateTime(2022, 8, 29, 19, 7, 15, 023) log(date:ToFormattedString("mm")) -- 07 ``` #### "M" "M" 사용자 지정 서식 지정자는 월을 1부터 12까지의 숫자로 나타냅니다. 월이 한 자릿수인 경우 십의 자리는 표시되지 않습니다. "M" 사용
[task] | code [pass] | ⏳ 미판정 [title] | DataStorage 활용하기 [question] | GlobalDataStorage를 사용하여 월드 전역의 접속자 누적 횟수를 1씩 증가시키고, 증가된 값을 log로 출력하는 스크립트를 작성해줘. [answer] | GlobalDataStorage는 `string` 타입의 값만 사용할 수 있으므로, 누적 횟수를 정수로 저장하기 위해서는 문자열 형태로 변환하여 저장하고 가져와야 합니다. 전역 데이터 스토리지를 가져오기 위해 `_DataStorageService:GetGlobalDataStorage("Name")`을 사용하고, 값을 가져오는 `GetAndWait`와 저장하는 `SetAndWait` 함수를 사용합니다. ```lua Property: [None] string storageName = "GlobalCounter" [None] stri [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] | SortableDataStorage에 문자열 타입의 값을 저장하려고 하면 어떤 문제가 발생하고, 이 저장소는 어떤 타입만 지원하나요? [answer] | SortableDataStorage는 정수(integer) 타입의 값만 저장 및 가져올 수 있습니다. 문서에 따르면, SortableDataStorage는 정수 타입의 값만 가져올 수 있다고 명시되어 있습니다. 따라서 이 저장소에 문자열(string) 타입의 값을 저장하려고 하면, 데이터 타입이 저장소의 요구사항(정수)과 맞지 않아 정상적으로 저장하거나 가져올 수 없습니다. 문자열을 저장해야 하는 경우 GlobalDataStorage, UserDataStorage, CreatorDataStorage와 같이 문자열 타입의 값을 지원 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 데이터를 가져올 때는 GetAndWait, GetAsync 함수를 사용합니다. GlobalDataStorage, UserDataStorage, CreatorDataStorage는 문자열 타입의 값만 가져올 수 있습니다. 만약 데이터를 저장할 때 `_UtilLogic:TableToString()` 함수를 사용해 데이터를 문자열로 변환했다면, 데이터를 가져올 때는 `_UtilLogic:StringToTable()` 함수를 사용해 기존 타입으로 변환하여 사용할 수 있습니다. SortableDataStorage는 정수 타입의 값만 가져올
[task] | two_turn [pass] | ⏳ 미판정 [title] | DataStorage 활용하기 [question] | string 타입이 아닌 다른 타입(테이블 등)의 값을 DataStorage에 저장하려면 `_UtilLogic:TableToString()`을 사용해야 하는데, 이 함수의 구체적인 사용 예제와 복원 시 주의할 점은 무엇인가요? [answer] | 제공된 참고 문서에는 `_UtilLogic:TableToString()` 함수의 **구체적인 사용 예제(코드)나 복원 시 주의할 점에 대한 설명이 없습니다.** 문서에서 확인할 수 있는 내용만 정리하면 다음과 같습니다. 1. **사용 목적**: `GlobalDataStorage`, `UserDataStorage`, `CreatorDataStorage`는 `string` 타입의 값만 저장할 수 있습니다. 따라서 `string`이 아닌 다른 타입(예: 테이블)의 값을 저장하려면 `_UtilLogic:TableToString()`을 [followup] | `_UtilLogic:TableToString()`으로 변환한 문자열을 다시 원본 데이터 구조로 복원하는 과정의 코드 예제를 보여주세요. [followup_answer] | 제공된 참고 문서에는 `_UtilLogic:TableToString()`으로 변환한 문자열을 다시 원본 데이터 구조로 복원하는 과정에 대한 코드 예제나 API 정보가 포함되어 있지 않습니다. 문서에서는 `string` 값이 아닌 다른 타입의 값을 사용할 경우 `_UtilLogic:TableToString()`을 사용해 문자열로 변경해야 한다는 사실만 언급하고 있으며, 역변환(복원)을 위한 함수 이름, 사용법, 또는 예제 코드는 제공되지 않았습니다. 따라서 해당 복원 과정의 코드 예제를 보여드릴 수 없습니다. [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 이 가이드는 [Data DB 저장 및 불러오기](/docs/?postId=68)와 병행 학습을 권장합니다. "Data DB 저장 및 불러오기"에서는 간편하게 데이터를 생성, 저장, 불러오는 기능 위주로 살펴보았습니다. 이번 가이드에서는 DataStorageService의 다양한 함수를 통해 데이터를 증가시키거나, 페이지를 가지고 오는 등 크리에이터의 목적에 맞게 데이터를 활용하는 방법을 알아봅시다. ##### 참고 가이드 * [DataStorage 사용량 제한 알아보기](/docs?postId=1044) * [
[task] | instruction_following [pass] | ⏳ 미판정 [title] | DataStorage 활용하기 [question] | 여러 데이터를 일괄 저장할 때 부분 실패 상황을 처리하기 위한 필수적인 오류 처리 절차의 핵심을 2문장 이내로 요약하세요. [answer] | 일괄 저장 요청 후 반환된 `successKeys` 테이블을 확인하여 성공하지 못한 작업이 있는지 검사해야 합니다. 성공하지 못한 항목이 존재할 경우 적절한 오류 처리를 수행해야 합니다. [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] | instruction_following [pass] | ⏳ 미판정 [title] | DataStorage 활용하기 [question] | GlobalDataStorage에서 "Grade" 키의 값을 삭제한 후 GetAndWait로 조회할 때 발생하는 결과를 표로 정리하세요. [answer] | GlobalDataStorage에서 `DeleteAndWait`로 "Grade" 키의 값을 삭제한 후 `GetAndWait`로 조회하면, 해당 키는 더 이상 존재하지 않으므로 유효한 값을 얻을 수 없습니다. | 단계 | 수행 함수 | 결과/설명 | | :--- | :--- | :--- | | 1 | `globalDataStorage:DeleteAndWait("Grade")` | "Grade" 키에 해당하는 데이터가 제거됩니다. | | 2 | `globalDataStorage:GetAndWait("Grade")` | "Grade"가 [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] | CreatorDataStorage가 다른 월드와 데이터를 공유할 수 있는 반면, GlobalDataStorage와 UserDataStorage는 월드 단위로 격리되는 구체적인 차이와 공동 제작 시 CreatorDataStorage의 소유권 구조는 어떻게 되나요? [answer] | 제공된 문서에 따르면, DataStorage의 격리 범위와 소유권 구조는 다음과 같습니다. **1. 월드 간 데이터 공유 및 격리 차이** * **CreatorDataStorage**: 크리에이터 단위로 관리되며, **다른 월드와 데이터를 공유할 수 있습니다.** 즉, 같은 크리에이터가 제작한 여러 월드에서 동일한 CreatorDataStorage 데이터를 접근하고 수정할 수 있습니다. * **GlobalDataStorage**: 하나의 월드 내에서만 사용되는 데이터 스토리지로, **다른 월드와 데이터가 공유되지 않습니다 [followup] | 공동 제작 환경에서 CreatorDataStorage에 접근할 때 발생하는 권한 문제나 예외 상황은 어떤 방식으로 처리하나요? [followup_answer] | 제공된 참고 문서에는 공동 제작 환경에서 CreatorDataStorage에 접근할 때 발생하는 **권한 문제나 예외 상황에 대한 구체적인 처리 방식이 언급되어 있지 않습니다.** 문서에서 확인 가능한 정보의 한계는 다음과 같습니다. 1. **소유 구조만 명시됨**: "CreatorDataStorage를 공동 제작에서 사용할 경우 공동 그룹 자체가 DataStorage를 가지고 있습니다"라고 소유권 구조만 설명하고 있을 뿐, 공동 그룹 내 개별 멤버의 접근 권한이나 권한 오류 발생 시나리오는 다루지 않습니다. 2. **에러 [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 이 가이드는 [Data DB 저장 및 불러오기](/docs/?postId=68)와 병행 학습을 권장합니다. "Data DB 저장 및 불러오기"에서는 간편하게 데이터를 생성, 저장, 불러오는 기능 위주로 살펴보았습니다. 이번 가이드에서는 DataStorageService의 다양한 함수를 통해 데이터를 증가시키거나, 페이지를 가지고 오는 등 크리에이터의 목적에 맞게 데이터를 활용하는 방법을 알아봅시다. ##### 참고 가이드 * [DataStorage 사용량 제한 알아보기](/docs?postId=1044) * [
[task] | single_turn [pass] | ⏳ 미판정 [title] | DataStorage 활용하기 [question] | _GetAndWait로 가져온 문자열 데이터를 다시 원래의 테이블 형태로 변환해서 사용하기 위해 어떤 API를 호출해야 하나요? [answer] | `_UtilLogic:StringToTable()` 함수를 호출해야 합니다. 데이터를 저장할 때 `_UtilLogic:TableToString()` 함수를 사용하여 테이블을 문자열로 변환해 저장했다면, 데이터를 가져온 후 원래의 테이블 형태로 복원하려면 이 함수를 사용합니다. ```lua local globalDataStorage = _DataStorageService:GetGlobalDataStorage("globalDS") local errorCode, dataString = globalDataStorage:GetAndWai [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] | GlobalDataStorage에 "Grade"라는 키로 "A"라는 값을 저장한 후, 해당 값을 다시 불러오기 위해 어떤 객체와 메서드를 순서대로 호출해야 하나요? [answer] | GlobalDataStorage에 값을 저장하고 다시 불러오기 위해 다음 객체와 메서드를 순서대로 호출해야 합니다. 1. **`_DataStorageService`**: 전역 데이터 스토리지에 접근하기 위해 먼저 이 서비스를 사용합니다. 2. **`GetGlobalDataStorage(storageName)`**: `_DataStorageService`의 메서드로, 저장할 데이터 스토리지의 이름(예: "globalDS")을 인자로 전달하여 `GlobalDataStorage` 객체를 반환받습니다. 3. **`SetAndWait [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] | code [pass] | ⏳ 미판정 [title] | 날짜와 시간 활용하기 [question] | DateTime 객체의 ToFormattedString 메서드를 활용하여 12시간제 시간 "%h"과 분 "mm"을 조합해 "7:27" 또는 "07:27" 형태로 시간을 표시하는 스크립트를 작성해줘 [answer] | `DateTime` 객체의 `ToFormattedString` 메서드를 사용하면 사용자 지정 서식 문자열을 조합하여 원하는 형태로 시간을 출력할 수 있습니다. 질문에서 요구한 12시간제 시간과 분을 조합하는 방법과, 각 서식 지정자의 특징을 바탕으로 두 가지 경우의 스크립트를 작성할 수 있습니다. ### 핵심 서식 지정자 * **`%h`**: 12시간제 시간(1~12). 한 자릿수인 경우 앞에 0이 붙지 않습니다. (예: 19:27이면 `7`) * **`hh`**: 12시간제 시간(1~12). 한 자릿수인 경우 앞에 0이 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | "g" 또는 "gg" 사용자 지정 서식 지정자는 연대를 나타냅니다. 기본적으로 A.D(Anno Domini, 기원후)로 나타납니다. "g" 사용자 지정 서식 지정자만 단독으로 사용하는 경우 표준 서식 문자열로 잘못 해석되지 않도록 앞에 "%" 사용자 지정 서식 지정자를 사용해야 합니다. ```lua local date = DateTime(2022, 8, 29, 19, 27, 15, 023) log(date:ToFormattedString("%g")) -- A.D. ``` #### "h" "h" 사용자 지정 서식 지정자는 시간
[task] | two_turn [pass] | ⏳ 미판정 [title] | 날짜와 시간 활용하기 [question] | "m" 표준 서식 지정자와 "m" 사용자 지정 서식 지정자의 차이점과, 각각이 나타내는 값(월 이름 vs 분)을 구별하여 설명해 주세요. [answer] | mLua에서 `"m"` 문자열은 사용 방식에 따라 완전히 다른 의미를 가집니다. 이는 **표준 서식 지정자**와 **사용자 지정 서식 지정자**로 구분되어 작동하며, 각각 나타내는 값도 다릅니다. ### 1. `"m"` 표준 서식 지정자 (월 이름) 표준 서식 지정자로 `"m"`을 사용할 경우, 특정 문화권에 맞는 **월(Month) 서식 문자열**을 나타냅니다. * **나타내는 값**: 월 이름 (예: April, 4월 등) * **기본 문화권 서식**: 문화권을 지정하지 않으면 `"MMMM dd"` 형식으로 출력됩니 [followup] | `DateTime(2022, 4, 10, 14, 5, 30)` 객체를 기준으로, 표준 "m" 서식과 사용자 지정 "m" 서식(분)을 함께 출력하는 mLua 코드 예시를 작성해 주세요. [followup_answer] | ```lua local date = DateTime(2022, 4, 10, 14, 5, 30) -- 표준 "m" 서식: 문화권 미지정 시 기본 서식 "MMMM dd" 적용 log(date:ToFormattedString("m")) -- 사용자 지정 "m" 서식: 분(Minute)을 0~59 숫자로 출력 log(date:ToFormattedString("m")) ``` 참고로 위 코드에서 두 줄 모두 `ToFormattedString("m")`을 호출하지만, mLua에서는 첫 번째 인자가 표준 서식 지정자 목록에 포함된 문자열인 [scores] | [judge_reason] | [source_doc] | "M" 또는 "m" 표준 서식 지정자는 특정 문화권의 월 서식 문자열을 나타냅니다. 문화권을 지정하지 않을 경우 서식 문자열은 **"MMMM dd"**입니다. ```lua local date = DateTime(2022, 4, 10) log(date:ToFormattedString("m")) -- April 10 log(date:ToFormattedString("m", "pt-BR")) -- 10 de abril ``` #### "Y", "y" "Y" 또는 "y" 표준 서식 지정자는 특정 문화권의 년 월 서식 문자열을 나타냅
[task] | instruction_following [pass] | ⏳ 미판정 [title] | DataStorage 활용하기 [question] | `Pages` 객체를 활용한 전체 목록 조회 로직을 `while` 루프와 `IsLastPage` 조건으로 구현하는 코드를 작성하되, 설명 없이 코드 블록만 출력하세요. [answer] | ```lua local errorCode, globalDataStoragePages = _DataStorageService:GetGlobalDataStoragePagesAndWait() while true do local globalDataStorages = globalDataStoragePages:GetCurrentPageDatas() for _, globalDataStorage in pairs(globalDataStorages) do log(globalDataStorage.Name) end [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] | `_DataStorageService:GetGlobalDataStorage("globalDS")` 로 전역 데이터 스토리지를 가져와 `DataStorageKeyInfo("key", "Tag", "Version1")` 를 생성한 뒤 `SetByInfoAndWait` 함수로 "Value"를 저장하는 서버 전용 스크립트를 작성해줘. [answer] | ```lua [server only] void SaveGlobalData() { local globalDataStorage = _DataStorageService:GetGlobalDataStorage("globalDS") local keyInfo = DataStorageKeyInfo("key", "Tag", "Version1") globalDataStorage:SetByInfoAndWait(keyInfo, "Value") } ``` [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] | code [pass] | ⏳ 미판정 [title] | DataStorage 활용하기 [question] | `self.Entity.Name` 을 userId로 활용하여 `_DataStorageService:GetUserDataStorage(userId)` 로 유저 데이터 스토리지를 가져오는 DefaultPlayer용 서버 전용 스크립트를 작성해줘. [answer] | `self.Entity.Name`을 userId로 사용하여 유저 데이터 스토리지를 가져오는 DefaultPlayer용 서버 전용 스크립트입니다. ```lua Method: [server only] void GetUserDataStorage() { local userId = self.Entity.Name local userDS = _DataStorageService:GetUserDataStorage(userId) } ``` [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] | two_turn [pass] | ⏳ 미판정 [title] | 날짜와 시간 활용하기 [question] | 일(day)과 시간(time) 관련 서식 지정자에서 0补齐(leading zero) 처리나 유효 자릿수 처리 방식이 어떻게 다른가요? [answer] | 제공된 문서에 근거하여 `DateTime` 객체의 `ToFormattedString` 메서드에서 사용되는 서식 지정자의 0补齐(leading zero) 및 유효 자릿수 처리 방식을 정리하면 다음과 같습니다. ### 1. 일(Day) 관련 서식 지정자: `"dd"` * **처리 방식**: 항상 2자리 숫자로 표시됩니다. * **0补齐(Leading Zero)**: 일이 한 자릿수인 경우, 십의 자리에 `0`을 자동으로 채워 넣습니다. * **예시**: `2022년 8월 9일`을 `"dd"`로 서식화하면 `09`가 됩니다. [followup] | "dd" 지정자가 한 자릿수 일자를 어떻게 표시하는지, 그리고 "FF" 지정자가 유효 자릿수가 3개 이상인 경우 어떻게 출력되는지 각각의 코드 예시를 들어 비교해 주세요. [followup_answer] | "dd" 지정자와 "FF" 지정자는 각각 **한 자릿수 처리(0补齐)**와 **유효 자릿수 절단**이라는 서로 다른 논리를 적용합니다. 두 지정자의 동작 방식과 코드 예시를 비교하면 다음과 같습니다. ### 1. "dd" 지정자: 한 자릿수 일자의 0补齐(Leading Zero) "dd"는 일을 2자리 숫자로 고정하여 표시합니다. 일이 한 자릿수인 경우(1~9일), 십의 자리에 자동으로 `0`을 채워 넣습니다. * **동작 원리**: 값이 `9`이면 `09`로 출력됩니다. * **코드 예시**: ```lua -- 202 [scores] | [judge_reason] | [source_doc] | "dd" 사용자 지정 서식 지정자는 일을 01부터 31까지의 숫자로 나타냅니다. 일이 한 자릿수인 경우 십의 자리에는 0이 표시됩니다. ```lua local date = DateTime(2022, 8, 9, 19, 27, 15) log(date:ToFormattedString("dd")) -- 09 ``` #### "ddd" "ddd" 사용자 지정 서식 지정자는 요일의 약식 이름을 나타냅니다. 문화권을 지정하면, 문화권에 해당하는 약식 요일이 나타납니다. ```lua local date = DateTime(2022, 8,
[task] | instruction_following [pass] | ⏳ 미판정 [title] | DataStorage 활용하기 [question] | `BatchSetAndWait()` 함수 호출 시 반환되는 `errorCode`와 `successKeys`의 용도를 구분하여 표로 정리하세요. [answer] | `BatchSetAndWait()` 함수는 일괄 데이터 저장 요청을 수행하며, 호출 시 두 개의 값을 반환합니다. 각 반환값의 용도는 다음과 같습니다. | 반환값 | 타입 | 용도 | | :--- | :--- | :--- | | `errorCode` | number | 요청 전체의 처리 결과를 나타내는 에러 코드입니다. | | `successKeys` | table | 요청이 성공적으로 저장된 값들의 키(key)를 담은 테이블입니다. | **참고:** `BatchSetAndWait()`는 여러 값을 동시에 저장할 때 일부만 성공 [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] | instruction_following [pass] | ⏳ 미판정 [title] | DataStorage 활용하기 [question] | TransactSetAsync의 콜백 함수에서 에러 코드가 0이 아닐 때 수행하는 로직을 코드만 출력하고 설명은 주석으로 작성하세요. [answer] | ```lua local callback = function (code, keys) if code ~= 0 then -- 에러 코드가 0이 아니면 에러 메시지를 출력하고 함수를 종료합니다. error("! error. TransactSetAsync. code:"..tostring(code)) return end end ``` [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | Transact 접두사인 함수를 활용해 데이터 저장하기, 불러오기, 제거하기를 원자적으로 일괄 요청할 수 있습니다. 만약 함수 호출에 포함된 모든 작업 중 하나라도 실패한다면, 함수 호출은 실패합니다. 한 번에 Key를 최대 20개까지 조작할 수 있습니다. 한 번에 전달된 요청들이 모두 성공하지 않으면 모두 실패 처리하고, 요청 이전의 데이터를 유지합니다. 그러므로 오류 처리 관련 코드를 간소화할 수 있습니다. 그러나 트랜잭션 보장을 위해 내부적으로 복잡한 처리 과정이 진행됩니다. credit 또한 Batch 함수에 비해 2배로 소
[task] | instruction_following [pass] | ⏳ 미판정 [title] | DataStorage 활용하기 [question] | TransactSetAndWait와 TransactSetAsync의 차이점을 3문장 이내로 설명하세요. [answer] | `TransactSetAndWait`는 데이터 저장이 완료될 때까지 즉시 대기하여 결과 코드를 바로 반환하는 동기 방식입니다. 반면 `TransactSetAsync`는 비동기 방식으로 요청을 보내고, 완료 시점에 전달된 콜백 함수를 통해 결과를 처리합니다. 두 함수 모두 최대 20개의 키를 원자적으로 일괄 저장하는 트랜잭션 기능을 제공합니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | Transact 접두사인 함수를 활용해 데이터 저장하기, 불러오기, 제거하기를 원자적으로 일괄 요청할 수 있습니다. 만약 함수 호출에 포함된 모든 작업 중 하나라도 실패한다면, 함수 호출은 실패합니다. 한 번에 Key를 최대 20개까지 조작할 수 있습니다. 한 번에 전달된 요청들이 모두 성공하지 않으면 모두 실패 처리하고, 요청 이전의 데이터를 유지합니다. 그러므로 오류 처리 관련 코드를 간소화할 수 있습니다. 그러나 트랜잭션 보장을 위해 내부적으로 복잡한 처리 과정이 진행됩니다. credit 또한 Batch 함수에 비해 2배로 소
[task] | code [pass] | ⏳ 미판정 [title] | DataStorage 활용하기 [question] | `_DataStorageService:GetSortableDataStorage("sortableDS")` 로 정렬 가능한 데이터 스토리지를 가져오는 서버 전용 스크립트를 작성해줘. [answer] | `_DataStorageService:GetSortableDataStorage("sortableDS")` 메서드를 호출하여 정렬 가능한 데이터 스토리지를 가져오는 서버 전용 스크립트는 다음과 같습니다. ```lua Method: [server only] void GetSortableDataStorage() { local sortableDS = _DataStorageService:GetSortableDataStorage("sortableDS") } ``` [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] | instruction_following [pass] | ⏳ 미판정 [title] | DataStorage 활용하기 [question] | DataStorageKeyInfo를 활용한 버전 관리 기능의 핵심 동작 원리를 3문장 이내로 요약하세요. [answer] | DataStorageKeyInfo의 Version 필드를 지정하면 값을 덮어쓰는 대신 새로운 버전으로 저장되어 이전 버전의 데이터가 유지됩니다. 따라서 특정 버전의 Key를 지정하여 과거 데이터를 독립적으로 조회할 수 있습니다. 조회한 과거 버전의 값을 최신 버전으로 다시 저장하면 최신 버전이 해당 과거 값으로 갱신되어 롤백이 가능합니다. [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] | CreatorDataStorage는 왜 다른 DataStorage 종류와 달리 목록을 가져오는 함수가 제공되지 않는가요? [answer] | CreatorDataStorage는 다른 DataStorage 종류와 달리 목록을 가져오는 함수가 제공되지 않는 이유는 CreatorDataStorage가 서버에 하나만 존재하기 때문입니다. 여러 개가 존재하지 않으므로 목록을 조회할 필요가 없습니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | SortableDataStorage는 IncreaseAndWait, IncreaseAsync 함수를 활용해 값을 증가시킬 수 있습니다. 각 함수의 delta 입력 값만큼 해당 매개 변수의 값이 증가하거나 감소합니다. 매개 변수로 들어온 값이 양수일 때는 증가, 음수일 때는 감소합니다. 만약, 증가시키고자 하는 값이 DataStorage에 존재하지 않는다면 기본값 0으로 저장하고 delta만큼 증가하게 됩니다. IncreaseAndWait 및 IncreaseAsync 함수는 에러 코드와 증가된 후의 값을 제공합니다. DataStor