CreatorDataStorage

이 저장소는 크리에이터가 소유한 모든 월드에서 사용 가능하고, 저장된 데이터를 공유합니다. 메이커와 출시 환경은 저장소를 공유하지 않습니다.

# Properties

[{"index":"string Name (ReadOnly)","0":"이 CreatorDataStorage의 이름입니다."}]

# Methods

[{"index":"int32, List BatchDeleteAndWait(List keys) (ServerOnly) (Yield)","0":"입력한 키들로 데이터들을 삭제합니다. 에러 코드와 삭제에 성공한 키들을 반환합니다. 수행하는 동안 스크립트 실행을 중단합니다."}]

[{"index":"void BatchDeleteAsync(List keys, func> callbackFunction) (ServerOnly)","0":"입력한 키들로 데이터들을 삭제합니다. 이 작업은 비동기로 수행되며, 작업이 완료되면 에러 코드, 삭제에 성공한 키들과 함께 callbackFunction으로 전달한 함수가 호출됩니다."}]

[{"index":"int32, DataStorageItemPages BatchGetAndWait(List keys) (ServerOnly) (Yield)","0":"입력한 키들에 해당하는 데이터들을 조회합니다. 작업이 완료되면 에러 코드와 조회용 객체를 반환합니다. 수행하는 동안 스크립트 실행을 중단합니다."}]

[{"index":"void BatchGetAsync(List keys, func, DataStorageItemPages> callbackFunction) (ServerOnly)","0":"입력한 키들에 해당하는 데이터들을 조회합니다. 이 작업은 비동기로 수행되며, 작업이 완료되면 에러 코드, 키, 조회용 객체와 함께 callbackFunction으로 전달된 함수가 호출됩니다."}]

[{"index":"int32, DataStorageItemPages BatchGetByInfoAndWait(List keyInfos) (ServerOnly) (Yield)","0":"입력한 DataStorageKeyInfo들로 데이터들을 조회합니다. 작업이 완료되면 에러 코드와 조회용 객체를 반환합니다. 수행하는 동안 스크립트 실행을 중단합니다."}]

[{"index":"void BatchGetByInfoAsync(List keyInfos, func, DataStorageItemPages> callbackFunction) (ServerOnly)","0":"입력한 DataStorageKeyInfo들로 데이터들을 조회합니다. 이 작업은 비동기로 수행되며, 작업이 완료되면 에러 코드, 키, 조회용 객체와 함께 callbackFunction으로 전달된 함수가 호출됩니다."}]

[{"index":"int32, List BatchSetAndWait(Dictionary keyValues) (ServerOnly) (Yield)","0":"입력한 키들로 데이터들을 저장합니다. 에러 코드와 저장에 성공한 키들을 반환합니다. 수행하는 동안 스크립트 실행을 중단합니다."}]

[{"index":"void BatchSetAsync(Dictionary keyValues, func> callbackFunction) (ServerOnly)","0":"입력한 키들로 데이터들을 저장합니다. 이 작업은 비동기로 수행되며, 작업이 완료되면 에러 코드, 저장에 성공한 키들과 함께 callbackFunction으로 전달된 함수가 호출됩니다."}]

[{"index":"int32, List BatchSetByInfoAndWait(Dictionary keyValues) (ServerOnly) (Yield)","0":"입력한 DataStorageKeyInfo들로 데이터들을 저장합니다. 에러 코드와 저장에 성공한 DataStorageKeyInfo들을 반환합니다. 수행하는 동안 스크립트 실행을 중단합니다."}]

[{"index":"void BatchSetByInfoAsync(Dictionary keyValues, func> callbackFunction) (ServerOnly)","0":"입력한 DataStorageKeyInfo들로 데이터들을 저장합니다. 이 작업은 비동기로 수행되며, 작업이 완료되면 에러 코드, 저장에 성공한 DataStorageKeyInfo들과 함께 callbackFunction으로 전달된 함수가 호출됩니다."}]

[{"index":"int32 DeleteAndWait(string key) (ServerOnly) (Yield)","0":"입력한 키로 데이터를 삭제하고 에러 코드를 반환합니다. 수행하는 동안 스크립트 실행을 중단합니다."}]

[{"index":"void DeleteAsync(string key, func callbackFunction) (ServerOnly)","0":"입력한 키로 데이터를 삭제합니다. 이 작업은 비동기로 수행되며, 작업이 완료되면 에러 코드, 키와 함께 callbackFunction으로 전달된 함수가 호출됩니다."}]

[{"index":"int32, string GetAndWait(string key) (ServerOnly) (Yield)","0":"입력한 키로 데이터를 조회합니다. 작업이 완료되면 에러 코드와 데이터를 반환합니다. 수행하는 동안 스크립트 실행을 중단합니다."}]

[{"index":"void GetAsync(string key, func callbackFunction) (ServerOnly)","0":"입력한 키로 데이터를 조회합니다. 이 작업은 비동기로 수행되며, 작업이 완료되면 에러 코드, 키, 데이터와 함께 callbackFunction으로 전달된 함수가 호출됩니다."}]

[{"index":"int32, string GetByInfoAndWait(DataStorageKeyInfo keyInfo) (ServerOnly) (Yield)","0":"입력한 DataStorageKeyInfo로 데이터를 조회합니다. DataStorageKeyInfo로 가져올 데이터의 자세한 조건을 설정할 수 있습니다. 작업이 완료되면 에러 코드와 데이터를 반환합니다. 수행하는 동안 스크립트 실행을 중단합니다."}]

[{"index":"void GetByInfoAsync(DataStorageKeyInfo keyInfo, func callbackFunction) (ServerOnly)","0":"입력한 DataStorageKeyInfo로 데이터를 조회합니다. DataStorageKeyInfo로 가져올 데이터의 자세한 조건을 설정할 수 있습니다. 이 작업은 비동기로 수행되며, 작업이 완료되면 에러 코드, DataStorageKeyInfo, 데이터와 함께 callbackFunction으로 전달된 함수가 호출됩니다."}]

[{"index":"int32, DataStorageItemPages GetPagesAndWait(string tag) (ServerOnly) (Yield)","0":"입력한 태그를 가진 데이터들을 조회합니다. 작업이 완료되면 에러 코드와 조회용 객체를 반환합니다. 수행하는 동안 스크립트 실행을 중단합니다."}]

[{"index":"void GetPagesAsync(string tag, func callbackFunction) (ServerOnly)","0":"입력한 태그를 가진 데이터들을 조회합니다. 이 작업은 비동기로 수행되며, 작업이 완료되면 에러 코드, 태그, 조회용 객체와 함께 callbackFunction으로 전달된 함수가 호출됩니다."}]

[{"index":"int32, DataStorageVersionPages GetVersionsAndWait(string key, SortDirection sortDirection, DateTime minDate, DateTime maxDate) (ServerOnly) (Yield)","0":"입력한 키에 해당하는 데이터의 버전들을 조회합니다. 작업이 완료되면 에러 코드와 조회용 객체를 반환합니다. sortDirection으로 오름\/내림차순 정렬을 설정할 수 있습니다. minDate, maxDate로 설정한 시간대 내에서 생성된 버전을 조회할 수 있습니다. 수행하는 동안 스크립트 실행을 중단합니다."}]

[{"index":"void GetVersionsAsync(string key, SortDirection sortDirection, DateTime minDate, DateTime maxDate, func callbackFunction) (ServerOnly)","0":"입력한 키에 해당하는 데이터의 버전들을 조회합니다. sortDirection으로 오름\/내림차순 정렬을 설정할 수 있습니다. minDate, maxDate로 설정한 시간대 내에서 생성된 버전을 조회할 수 있습니다. 이 작업은 비동기로 수행되며, 작업이 완료되면 에러 코드, 키, 조회용 객체와 함께 callbackFunction으로 전달된 함수가 호출됩니다."}]

[{"index":"int32 SetAndWait(string key, string value) (ServerOnly) (Yield)","0":"입력한 키로 데이터를 저장합니다. 작업이 완료되면 에러 코드를 반환합니다. 수행하는 동안 스크립트 실행을 중단합니다."}]

[{"index":"void SetAsync(string key, string value, func callbackFunction) (ServerOnly)","0":"입력한 키로 데이터를 저장합니다. 이 작업은 비동기로 수행되며, 작업이 완료되면 에러 코드, 키와 함께 callbackFunction으로 전달된 함수가 호출됩니다."}]

[{"index":"int32 SetByInfoAndWait(DataStorageKeyInfo keyInfo, string value) (ServerOnly) (Yield)","0":"입력한 DataStorageKeyInfo로 데이터를 저장합니다. DataStorageKeyInfo로 자세한 정보를 설정할 수 있습니다. 작업이 완료되면 에러 코드를 반환합니다. 수행하는 동안 스크립트 실행을 중단합니다."}]

[{"index":"void SetByInfoAsync(DataStorageKeyInfo keyInfo, string value, func callbackFunction) (ServerOnly)","0":"입력한 DataStorageKeyInfo로 데이터를 저장합니다. DataStorageKeyInfo로 자세한 정보를 설정할 수 있습니다. 이 작업은 비동기로 수행되며, 작업이 완료되면 에러 코드, DataStorageKeyInfo와 함께 callbackFunction으로 전달된 함수가 호출됩니다."}]

[{"index":"int32, List TransactDeleteAndWait(List keys) (ServerOnly) (Yield)","0":"입력한 키들로 데이터를 삭제합니다. 호출에 포함된 모든 작업이 성공하면 에러 코드, 삭제에 성공한 키들을 반환합니다. 수행하는 동안 스크립트 실행을 중단합니다. 모든 작업 중 하나라도 실패한다면, 함수 호출이 실패합니다. 한 번에 최대 20개 Key까지 조작할 수 있습니다."}]

[{"index":"void TransactDeleteAsync(List keys, func> callbackFunction) (ServerOnly)","0":"입력한 키들로 데이터를 삭제합니다. 이 함수 호출은 비동기로 수행됩니다. 호출에 포함된 모든 작업이 성공하면 에러 코드, 삭제에 성공한 키들과 함께 callbackFunction으로 전달한 함수가 호출됩니다. 모든 작업 중 하나라도 실패한다면, 함수 호출이 실패합니다. 한 번에 최대 20개 key까지 조작할 수 있습니다."}]

[{"index":"int32, List TransactSetAndWait(Dictionary keyValues) (ServerOnly) (Yield)","0":"입력한 키들로 데이터를 저장합니다. 호출에 포함된 모든 작업이 성공하면 에러 코드, 저장에 성공한 키들을 반환합니다. 수행하는 동안 스크립트 실행을 중단합니다. 모든 작업 중 하나라도 실패한다면, 함수 호출이 실패합니다. 한 번에 최대 20개 Key까지 조작 할 수 있습니다."}]

[{"index":"void TransactSetAsync(Dictionary keyValues, func> callbackFunction) (ServerOnly)","0":"입력한 키들로 데이터를 저장합니다. 이 함수 호출은 비동기로 수행됩니다. 호출에 포함된 모든 작업이 성공하면 에러 코드, 저장에 성공한 키들과 함께 callbackFunction으로 전달한 함수가 호출됩니다. 모든 작업 중 하나라도 실패한다면, 함수 호출이 실패합니다. 한 번에 최대 20개 Key까지 조작 할 수 있습니다."}]

[{"index":"int32, List TransactSetByInfoAndWait(Dictionary keyValues) (ServerOnly) (Yield)","0":"입력한 DataStorageKeyInfo들로 데이터를 저장합니다. 모든 데이터 저장에 성공하면 에러 코드와 성공한 DataStorageKeyInfo를 반환합니다. 수행하는 동안 스크립트 실행을 중단합니다. 모든 작업 중 하나라도 실패한다면, 함수 호출이 실패합니다. 한 번에 최대 20개 Key까지 조작 할 수 있습니다."}]

[{"index":"void TransactSetByInfoAsync(Dictionary keyValues, func> callbackFunction) (ServerOnly)","0":"입력한 DataStorageKeyInfo들로 데이터를 저장합니다. 이 함수 호출은 비동기로 수행됩니다. 호출에 포함된 모든 작업이 성공하면 에러 코드, 저장에 성공한 DataStorageKeyInfo들과 함께 callbackFunction으로 전달된 함수가 호출됩니다. 모든 작업 중 하나라도 실패한다면, 함수 호출이 실패합니다. 한 번에 최대 20개 Key까지 조작 할 수 있습니다."}]

[{"index":"int32, string UpdateAndWait(string key, string expectedValue, string newValue) (ServerOnly) (Yield)","0":"key에 해당하는 값을 newValue로 갱신합니다. 작업이 성공하면 에러 코드와 갱신된 값을 반환합니다. 기존 값이 expectedValue와 다르면 에러 코드 UpdateApiFailed(2000000)와 기존 값을 반환합니다. 수행하는 동안 스크립트 실행을 중단합니다."}]

[{"index":"void UpdateAsync(string key, string expectedValue, string newValue, func callbackFunction) (ServerOnly)","0":"key에 해당하는 값을 newValue로 갱신합니다. 이 작업은 비동기로 수행되며, 작업이 완료되면 callbackFunction으로 전달된 함수가 호출됩니다. 작업이 성공하면 callbackFunction의 매개 변수로 에러 코드, 키, 갱신된 값이 전달됩니다. 기존 값이 expectedValue와 다르면 에러 코드 UpdateApiFailed(2000000), 키, 기존 값이 전달됩니다."}]

[{"index":"int32, string UpdateByInfoAndWait(DataStorageKeyInfo keyInfo, string expectedValue, string newValue) (ServerOnly) (Yield)","0":"DataStorageKeyInfo에 해당하는 값을 newValue로 갱신합니다. 작업이 성공하면 에러 코드와 갱신된 값을 반환합니다. 기존 값이 expectedValue와 다르면 에러 코드 UpdateApiFailed(2000000)와 기존 값을 반환합니다. 수행하는 동안 스크립트 실행을 중단합니다."}]

[{"index":"void UpdateByInfoAsync(DataStorageKeyInfo keyInfo, string expectedValue, string newValue, func callbackFunction) (ServerOnly)","0":"DataStorageKeyInfo에 해당하는 값을 newValue로 갱신합니다. 이 작업은 비동기로 수행되며, 작업이 완료되면 callbackFunction으로 전달된 함수가 호출됩니다. 작업이 성공하면 callbackFunction의 매개 변수로 에러 코드, DataStorageKeyInfo, 갱신된 값이 전달됩니다. 기존 값이 expectedValue와 다르면 에러 코드 UpdateApiFailed(2000000), DataStorageKeyInfo, 기존 값이 전달됩니다."}]

# Examples

#### SetAndWait

데이터를 저장하는 예제입니다.
    
    
    @Component
    script DataStorageInitializer extends Component
        @ExecSpace("ServerOnly")
        method void OnBeginPlay()
            local ds = _DataStorageService:GetCreatorDataStorage()
            
            local errorCode = ds:SetAndWait("key", "value")
            
            if errorCode ~= 0 then
                error("Failed to SetAndWait. Error : " .. tostring(errorCode))
                return
            end
        end
    end
    

#### GetAndWait

데이터를 불러오는 예제입니다.
    
    
    @Component
    script StartupDataRetriever extends Component
        @ExecSpace("ServerOnly")
        method void OnBeginPlay()
            local ds = _DataStorageService:GetCreatorDataStorage()
            
            local errorCode, value = ds:GetAndWait("key")
            
            if errorCode ~= 0 then
                error("Failed to GetAndWait. Error : " .. tostring(errorCode))
                return
            end
        end
    end
    

#### DeleteAndWait

데이터를 제거하는 예제입니다.
    
    
    @Component
    script GameStartDataDeleter extends Component
        @ExecSpace("ServerOnly")
        method void OnBeginPlay()
            local ds = _DataStorageService:GetCreatorDataStorage()
            
            local errorCode = ds:DeleteAndWait("key")
            
            if errorCode ~= 0 then
                error("Failed to DeleteAndWait. Error : " .. tostring(errorCode))
                return
            end
        end
    end
    

#### SetAsync

데이터를 비동기로 저장하는 예제입니다.
    
    
    @Component
    script DataInitializer extends Component
        @ExecSpace("ServerOnly")
        method void OnBeginPlay()
            local ds = _DataStorageService:GetCreatorDataStorage()
            
            ds:SetAsync("key", "value", function(errorCode, key)
                -- 작업이 완료되면 호출됩니다.
                 if errorCode ~= 0 then
                    error("Failed to SetAsync. Error : " .. tostring(errorCode))
                    return
                end
            end)
        end
    end
    

#### GetAsync

데이터를 비동기로 불러오는 예제입니다.
    
    
    @Component
    script CreatorDataAsyncFetcher extends Component
        @ExecSpace("ServerOnly")
        method void OnBeginPlay()
            local ds = _DataStorageService:GetCreatorDataStorage()
            
            ds:GetAsync("key", function(errorCode, key, value)
                -- 작업이 완료되면 호출됩니다.
                if errorCode ~= 0 then
                    error("Failed to GetAsync. Error : " .. tostring(errorCode))
                    return
                end
            end)
        end
    end
    

#### DeleteAsync

데이터를 비동기로 제거하는 예제입니다.
    
    
    @Component
    script KeyDataDeleter extends Component
        @ExecSpace("ServerOnly")
        method void OnBeginPlay()
            local ds = _DataStorageService:GetCreatorDataStorage()
            
            ds:DeleteAsync("key", function(errorCode, key)
                -- 작업이 완료되면 호출됩니다. 
                if errorCode ~= 0 then
                    error("Failed to DeleteAsync. Error : " .. tostring(errorCode))
                    return
                end
            end)
        end
    end
    

#### SetByInfoAndWait

데이터를 DataStorageKeyInfo를 통해 저장하는 예제입니다.
    
    
    @Component
    script DataEntryInitializer extends Component
        @ExecSpace("ServerOnly")
        method void OnBeginPlay()
            local ds = _DataStorageService:GetCreatorDataStorage()
            
            local keyInfo = DataStorageKeyInfo("Key", "Version", "Tag")
            local errorCode = ds:SetByInfoAndWait(keyInfo, "Value")
            
            if errorCode ~= 0 then
                error("Failed to SetByInfoAndWait. Error : " .. tostring(errorCode))
                return
            end
        end
    end
    

#### GetByInfoAndWait

데이터를 DataStorageKeyInfo를 통해 가져오는 예제입니다.
    
    
    @Component
    script InitialDataRetriever extends Component
        @ExecSpace("ServerOnly")
        method void OnBeginPlay()
            local ds = _DataStorageService:GetCreatorDataStorage()
            
            local keyInfo = DataStorageKeyInfo("Key", "Version", "Tag")
            local errorCode, value = ds:GetByInfoAndWait(keyInfo)
            
            if errorCode ~= 0 then
                error("Failed to GetByInfoAndWait. Error : " .. tostring(errorCode))
                return
            end
        end
    end
    

#### BatchSetAndWait

데이터를 일괄로 저장하는 예제입니다.
    
    
    @Component
    script ServerDataSetup extends Component
        @ExecSpace("ServerOnly")
        method void OnBeginPlay()
            local ds = _DataStorageService:GetCreatorDataStorage()
            
            local keyValues = {}
            keyValues["Key1"] = "Value1"
            keyValues["Key2"] = "Value2"
            
            local errorCode, keys = ds:BatchSetAndWait(keyValues)
            
            if errorCode ~= 0 then
                error("Failed to BatchSetAndWait. Error : " .. tostring(errorCode))
                return
            end
        end
    end
    

#### BatchGetAndWait

데이터를 일괄로 가져오는 예제입니다.
    
    
    @Component
    script DataStorageBatchReader extends Component
        @ExecSpace("ServerOnly")
        method void OnBeginPlay()
            local ds = _DataStorageService:GetCreatorDataStorage()
            
            local keys = {}
            table.insert(keys, "Key1")
            table.insert(keys, "Key2")
            
            local getResultCode, pages = ds:BatchGetAndWait(keys)
            if getResultCode ~= 0 then
                error("Failed to BatchGetAndWait. Error : " .. tostring(getResultCode))
                return
            end
            
            while true do
                -- 현재 페이지의 목록을 가져옵니다.
                local datas = pages:GetCurrentPageDatas()
            
                for _, data in pairs(datas) do
                    -- DataStorageItem을 통해 키, 버전, 태그, 값을 조회할 수 있습니다.
                    log(data.KeyInfo.Key)
                    log(data.KeyInfo.Version)
                    log(data.KeyInfo.Tag)
                    log(data.Value)
                end
            
                -- 현재 페이지가 마지막 페이지인지 확인합니다.
                if pages.IsLastPage == true then
                    break
                end
            
                -- 다음 페이지의 데이터를 미리 불러옵니다. 다음 페이지가 유효하지 않은 경우 조회를 마칩니다.
                local loadResultCode = pages:LoadNextPageAndWait()
                if loadResultCode ~= 0 then
                    error("Failed to LoadNextPageAndWait. Error : " .. tostring(loadResultCode))
                    break
                end
            
                -- 다음 페이지로 이동합니다.
                pages:MoveToNextPageAndWait()
            end
        end
    end
    

#### BatchDeleteAndWait

데이터를 일괄로 제거하는 예제입니다.
    
    
    @Component
    script CreatorStorageBatchDeleter extends Component
        @ExecSpace("ServerOnly")
        method void OnBeginPlay()
            local ds = _DataStorageService:GetCreatorDataStorage()
            
            local keys = {}
            table.insert(keys, "Key1")
            table.insert(keys, "Key2")
            
            local errorCode, deletedKeys = ds:BatchDeleteAndWait(keys)
            
            if errorCode ~= 0 then
                error("Failed to BatchDeleteAndWait. Error : " .. tostring(errorCode))
                return
            end
        end
    end
    

#### BatchSetByInfoAndWait

DataStorageKeyInfo를 통해 데이터를 일괄로 저장하는 예제입니다.
    
    
    @Component
    script BatchDataSetter extends Component
        @ExecSpace("ServerOnly")
        method void OnBeginPlay()
            local ds = _DataStorageService:GetCreatorDataStorage()
            
            local keyInfoValues = {}
            local keyInfo1 = DataStorageKeyInfo("Key1", "Version1", "Tag1")
            local keyInfo2 = DataStorageKeyInfo("Key2", "Version2", "Tag2")
            
            keyInfoValues[keyInfo1] = "Value1"
            keyInfoValues[keyInfo2] = "Value2"
            
            local errorCode, keyInfos = ds:BatchSetByInfoAndWait(keyInfoValues)
            
            if errorCode ~= 0 then
                error("Failed to BatchSetByInfoAndWait. Error : " .. tostring(errorCode))
                return
            end
        end
    end
    

#### BatchGetByInfoAndWait

DataStorageKeyInfo를 통해 데이터를 일괄로 가져오는 예제입니다.
    
    
    @Component
    script PaginatedDataReader extends Component
        @ExecSpace("ServerOnly")
        method void OnBeginPlay()
            local ds = _DataStorageService:GetCreatorDataStorage()
            
            local keyInfos = {}
            local keyInfo1 = DataStorageKeyInfo("Key1", "Version1", "Tag1")
            local keyInfo2 = DataStorageKeyInfo("Key2", "Version2", "Tag2")
            table.insert(keyInfos, keyInfo1)
            table.insert(keyInfos, keyInfo2)
            
            local getResultCode, pages = ds:BatchGetByInfoAndWait(keyInfos)
            if getResultCode ~= 0 then
                error("Failed to BatchGetByInfoAndWait. Error : " .. tostring(getResultCode))
                return
            end
            
            while true do
                -- 현재 페이지의 목록을 가져옵니다.
                local datas = pages:GetCurrentPageDatas()
                for _, data in pairs(datas) do
                    -- DataStorageItem을 통해 키, 버전, 태그, 값을 조회할 수 있습니다.
                    log(data.KeyInfo.Key)
                    log(data.KeyInfo.Version)
                    log(data.KeyInfo.Tag)
                    log(data.Value)
                end
            
                -- 현재 페이지가 마지막 페이지인지 확인합니다.
                if pages.IsLastPage == true then
                    break
                end
            
                -- 다음 페이지의 데이터를 미리 불러옵니다. 다음 페이지가 유효하지 않은 경우 조회를 마칩니다.
                local loadResultCode = pages:LoadNextPageAndWait()
                if loadResultCode ~= 0 then
                    error("Failed to LoadNextPageAndWait. Error : " .. tostring(loadResultCode))
                    break
                end
            
                -- 다음 페이지로 이동합니다.
                pages:MoveToNextPageAndWait()
            end
        end
    end
    

#### GetPagesAndWait

태그 값을 통해 데이터를 조회하는 예제입니다.
    
    
    @Component
    script PagedDataEnumerator extends Component
        @ExecSpace("ServerOnly")
        method void OnBeginPlay()
            local ds = _DataStorageService:GetCreatorDataStorage()
            
            local getResultCode, pages = ds:GetPagesAndWait("Tag")
            if getResultCode ~= 0 then
                error("Failed to GetPagesAndWait. Error : " .. tostring(getResultCode))
                return
            end
            
            while true do
                -- 현재 페이지의 목록을 가져옵니다.
                local datas = pages:GetCurrentPageDatas()
                for _, data in pairs(datas) do
                    -- DataStorageItem을 통해 키, 버전, 태그, 값을 조회할 수 있습니다.
                    log(data.KeyInfo.Key)
                    log(data.KeyInfo.Tag)
                    log(data.KeyInfo.Version)
                    log(data.Value)
                end
            
                -- 현재 페이지가 마지막 페이지인지 확인합니다.
                if pages.IsLastPage == true then
                    break
                end
            
                -- 다음 페이지의 데이터를 미리 불러옵니다. 다음 페이지가 유효하지 않은 경우 조회를 마칩니다.
                local loadResultCode = pages:LoadNextPageAndWait()
                if loadResultCode ~= 0 then
                    error("Failed to LoadNextPageAndWait. Error : " .. tostring(loadResultCode))
                    break
                end
            
                -- 다음 페이지로 이동합니다.
                pages:MoveToNextPageAndWait()
            end
        end
    end
    

#### SetByInfoAndWait

버전을 활용하는 예제 코드입니다.
    
    
    @Component
    script DataVersionUpdater extends Component
        @ExecSpace("ServerOnly")
        method void OnBeginPlay()
            local ds = _DataStorageService:GetCreatorDataStorage()
            
            local oldKeyInfo = DataStorageKeyInfo("Key", "OldVersion", "Tag")
            local errorCode = ds:SetByInfoAndWait(oldKeyInfo, "OldValue")
            if errorCode ~= 0 then
                error("Failed to SetByInfoAndWait. Error : " .. tostring(errorCode))
                return
            end
            
            -- 기존 버전의 "OldValue"값을 덮어 쓰는 대신 새로운 버전을 만들어 저장합니다.
            local newKeyInfo = DataStorageKeyInfo("Key", "NewVersion", "Tag")
            errorCode = ds:SetByInfoAndWait(newKeyInfo, "NewValue")
            if errorCode ~= 0 then
                error("Failed to SetByInfoAndWait. Error : " .. tostring(errorCode))
                return
            end
            
            -- "OldValue" 값은 덮어 씌워진 게 아니기 때문에 아직 유효합니다. "OldVersion"을 지정하여 "OldValue"값을 가져올 수 있습니다.
            local getResultCode, oldValue = ds:GetByInfoAndWait(oldKeyInfo)
            if getResultCode ~= 0 then
                error("Failed to GetByInfoAndWait. Error : " .. tostring(getResultCode))
                return
            end
            
            -- 과거 버전의 값을 가져와 최신 버전에 덮어씁니다. 이후 값을 불러오는 함수를 호출하면 "NewValue"값이 아닌 "OldValue"값이 반환됩니다.
            ds:SetByInfoAndWait(newKeyInfo, oldValue)
        end
    end
    

#### GetVersionsAndWait

일정 기간 내의 버전 정보를 조회하는 예제입니다.
    
    
    @Component
    script DataVersionFetcher extends Component
        @ExecSpace("ServerOnly")
        method void OnBeginPlay()
            local ds = _DataStorageService:GetCreatorDataStorage()
            
            local minDate = DateTime(2023, 03, 09, 20, 20, 0, 0)
            local maxDate = DateTime(2023, 03, 09, 22, 20, 0, 0)
            
            -- 값을 저장할 때 버전 값을 함께 지정한 경우에만 조회할 수 있습니다.
            local getResultCode, pages = ds:GetVersionsAndWait("Key", SortDirection.Ascending, minDate, maxDate)
            if getResultCode ~= 0 then
                error("Failed to GetVersionsAndWait. Error : " .. tostring(getResultCode))
                return
            end
            
            while true do
                local datas = pages:GetCurrentPageDatas()
                for _, data in pairs(datas) do
                    -- DataStorageVersionInfo를 통해 생성 시간과 Version 값을 조회할 수 있습니다.
                    log(data.CreateTime)
                    log(data.Version)
                end
            
                -- IsLastPage 프로퍼티를 통해 현재 페이지가 마지막 페이지인지 확인할 수 있습니다.
                if pages.IsLastPage == true then
                    return
                end
            
                -- 다음 페이지의 데이터를 미리 불러옵니다. 다음 페이지가 유효하지 않은 경우 조회를 마칩니다.
                local loadResultCode = pages:LoadNextPageAndWait()
                if loadResultCode ~= 0 then
                    error("Failed to LoadNextPageAndWait. Error" .. tostring(loadResultCode))
                    return
                end
            
                -- 다음 페이지로 이동합니다.
                pages:MoveToNextPageAndWait()
            end
        end
    end
    

#### UpdateAndWait

데이터를 업데이트 하는 예제입니다.
    
    
    @Component
    script ConditionalDataUpdater extends Component
        @ExecSpace("ServerOnly")
        method void OnBeginPlay()
            local ds = _DataStorageService:GetCreatorDataStorage()
            
            local getResultCode, oldValue = ds:GetAndWait("Key")
            if getResultCode ~= 0 then
                error("Failed to GetAndWait. Error : " .. tostring(getResultCode))
                return
            end
            
            -- DataStorage 안에 예상하는 값이 저장되어 있을 경우 "NewValue"를 저장합니다. 다른 값이 저장되어 있을 경우 실패합니다.
            local updateResultCode, newValue = ds:UpdateAndWait("Key", oldValue, "NewValue")
            
            if updateResultCode ~= 0 then
                error("Failed to UpdateAndWait. Error : " .. tostring(updateResultCode))
                return
            end
        end
    end
    

# SeeAlso

  * table
  * DataStorageKeyInfo
  * DateTime
  * DataStorageService