GlobalDataStorage

다목적 데이터를 관리할 수 있는 저장소입니다. 메이커와 출시 환경은 저장소를 공유하지 않습니다.

# Properties

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

# 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 GlobalDataInitializer extends Component
        @ExecSpace("ServerOnly")
        method void OnBeginPlay()
            local ds = _DataStorageService:GetGlobalDataStorage("StorageName")
            
            local errorCode = ds:SetAndWait("key", "value")
        end
    end
    

#### GetAndWait

데이터를 불러오는 예제입니다.
    
    
    @Component
    script GlobalDataRetriever extends Component
        @ExecSpace("ServerOnly")
        method void OnBeginPlay()
            local ds = _DataStorageService:GetGlobalDataStorage("StorageName")
            
            local errorCode, value = ds:GetAndWait("key")
        end
    end
    

#### DeleteAndWait

데이터를 제거하는 예제입니다.
    
    
    @Component
    script DataKeyDeleter extends Component
        @ExecSpace("ServerOnly")
        method void OnBeginPlay()
            local ds = _DataStorageService:GetGlobalDataStorage("StorageName")
            
            local errorCode = ds:DeleteAndWait("key")
        end
    end
    

#### SetAsync

데이터를 비동기로 저장하는 예제입니다.
    
    
    @Component
    script GlobalDataSetter extends Component
        @ExecSpace("ServerOnly")
        method void OnBeginPlay()
            local ds = _DataStorageService:GetGlobalDataStorage("StorageName")
            
            ds:SetAsync("key", "value", function(errorCode, key)
                -- 작업이 완료되면 호출됩니다.
            end)
        end
    end
    

#### GetAsync

데이터를 비동기로 불러오는 예제입니다.
    
    
    @Component
    script StorageDataReader extends Component
        @ExecSpace("ServerOnly")
        method void OnBeginPlay()
            local ds = _DataStorageService:GetGlobalDataStorage("StorageName")
            
            ds:GetAsync("key", function(errorCode, key, value)
                -- 작업이 완료되면 호출됩니다.
            end)
        end
    end
    

#### DeleteAsync

데이터를 비동기로 제거하는 예제입니다.
    
    
    @Component
    script DataStorageKeyRemover extends Component
        @ExecSpace("ServerOnly")
        method void OnBeginPlay()
            local ds = _DataStorageService:GetGlobalDataStorage("StorageName")
            
            ds:DeleteAsync("Key", function(errorCode, key)
                -- 작업이 완료되면 호출됩니다. 
            end)
        end
    end
    

#### SetByInfoAndWait

데이터를 DataStorageKeyInfo를 통해 저장하는 예제입니다.
    
    
    @Component
    script StorageKeySetter extends Component
        @ExecSpace("ServerOnly")
        method void OnBeginPlay()
            local ds = _DataStorageService:GetGlobalDataStorage("StorageName")
            
            local keyInfo = DataStorageKeyInfo("Key", "Version1", "TestTag")
            local errorCode = ds:SetByInfoAndWait(keyInfo, "value")
        end
    end
    

#### GetByInfoAndWait

데이터를 DataStorageKeyInfo를 통해 가져오는 예제입니다.
    
    
    @Component
    script GlobalDataFetcher extends Component
        @ExecSpace("ServerOnly")
        method void OnBeginPlay()
            local ds = _DataStorageService:GetGlobalDataStorage("StorageName")
            
            local keyInfo = DataStorageKeyInfo("Key", "Version1", "TestTag")
            local errorCode, value = ds:GetByInfoAndWait(keyInfo)
        end
    end
    

#### BatchByInfoAndWait

데이터를 일괄로 저장하는 예제입니다.
    
    
    @Component
    script BatchDataSetter extends Component
        @ExecSpace("ServerOnly")
        method void OnBeginPlay()
            local ds = _DataStorageService:GetGlobalDataStorage("StorageName")
            
            local keyValues = {}
            keyValues["Key1"] = "Value1"
            keyValues["Key2"] = "Value2"
            
            local errorCode, keys = ds:BatchSetAndWait(keyValues)lua
        end
    end
    

#### BatchGetAndWait

데이터를 일괄로 가져오는 예제입니다.
    
    
    @Component
    script DataBatchRetriever extends Component
        @ExecSpace("ServerOnly")
        method void OnBeginPlay()
            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()로 현재 페이지의 목록을 가져올 수 있습니다.
                local items = itemPages:GetCurrentPageDatas()
                for _, item in pairs(items) do
            
                    -- DataStorageItem을 통해 Key값과 Value값을 조회할 수 있습니다.
                    log(item.KeyInfo.Key)
                    log(item.KeyInfo.Tag)
                    log(item.KeyInfo.Version)
                    log(item.Value)
                end
            
                -- IsLastPage 프로퍼티를 통해 현재 페이지가 마지막 페이지인지 확인할 수 있습니다.
                if itemPages.IsLastPage == true then
                    break
                end
            
                -- MoveToNextPageAndWait()로 다음 페이지로 넘어갈 수 있습니다.
                itemPages:MoveToNextPageAndWait()
            end
        end
    end
    

#### BatchDeleteAndWait

데이터를 일괄로 제거하는 예제입니다.
    
    
    @Component
    script BatchDataDeleter extends Component
        @ExecSpace("ServerOnly")
        method void OnBeginPlay()
            local ds = _DataStorageService:GetGlobalDataStorage("StorageName")
            
            local keys = {}
            table.insert(keys, "Key1")
            table.insert(keys, "Key2")
            
            local errorCode, deletedKeys = ds:BatchDeleteAndWait(keys)
        end
    end
    

#### BatchSetByInfoAndWait

데이터를 DataStorageKeyInfo를 통해 일괄로 저장하는 예제입니다.
    
    
    @Component
    script DataStorageInitializer extends Component
        @ExecSpace("ServerOnly")
        method void OnBeginPlay()
            local ds = _DataStorageService:GetGlobalDataStorage("StorageName")
            
            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)
        end
    end
    

#### BatchGetByInfoAndWait

데이터를 DataStorageKeyInfo를 통해 일괄로 가져오는 예제입니다.
    
    
    @Component
    script BatchDataRetriever extends Component
        @ExecSpace("ServerOnly")
        method void OnBeginPlay()
            local ds = _DataStorageService:GetGlobalDataStorage("StorageName")
            
            local keyInfos = {}
            local keyInfo1 = DataStorageKeyInfo("Key1", "Version1", "Tag1")
            local keyInfo2 = DataStorageKeyInfo("Key2", "Version2", "Tag2")
            table.insert(keyInfos, keyInfo1)
            table.insert(keyInfos, keyInfo2)
            
            local errorCode, itemPages = ds:BatchGetByInfoAndWait(keyInfos)
            
            while true do
                -- GetCurrentPageDatas()로 현재 페이지의 목록을 가져올 수 있습니다.
                local items = itemPages:GetCurrentPageDatas()
                for _, item in pairs(items) do
            
                    -- DataStorageItem을 통해 Key값과 Value값을 조회할 수 있습니다.
                    log(item.KeyInfo.Key)
                    log(item.KeyInfo.Tag)
                    log(item.KeyInfo.Version)
                    log(item.Value)
                end
            
                -- IsLastPage 프로퍼티를 통해 현재 페이지가 마지막 페이지인지 확인할 수 있습니다.
                if itemPages.IsLastPage == true then
                    break
                end
            
                -- MoveToNextPageAndWait()로 다음 페이지로 넘어갈 수 있습니다.
                itemPages:MoveToNextPageAndWait()
            end
        end
    end
    

#### GetPagesAndWait

태그 값을 통해 데이터를 조회하는 예제입니다.
    
    
    @Component
    script StoragePageLogger extends Component
        @ExecSpace("ServerOnly")
        method void OnBeginPlay()
            local ds = _DataStorageService:GetGlobalDataStorage("StorageName")
            
            local errorCode, itemPages = ds:GetPagesAndWait("TestTag")
            
            while true do
                -- GetCurrentPageDatas()로 현재 페이지의 목록을 가져올 수 있습니다.
                local items = itemPages:GetCurrentPageDatas()
                for _, item in pairs(items) do
            
                    -- DataStorageItem을 통해 Key값과 Value값을 조회할 수 있습니다.
                    log(item.KeyInfo.Key)
                    log(item.KeyInfo.Tag)
                    log(item.KeyInfo.Version)
                    log(item.Value)
                end
            
                -- IsLastPage 프로퍼티를 통해 현재 페이지가 마지막 페이지인지 확인할 수 있습니다.
                if itemPages.IsLastPage == true then
                    break
                end
            
                -- MoveToNextPageAndWait()로 다음 페이지로 넘어갈 수 있습니다.
                itemPages:MoveToNextPageAndWait()
            end
        end
    end
    

#### GetVersionsAndWait

일정 기간 내의 버전 정보를 조회하는 예제입니다.
    
    
    @Component
    script VersionHistoryFetcher extends Component
        @ExecSpace("ServerOnly")
        method void OnBeginPlay()
            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:GetVersionsAndWait("Key", SortDirection.Ascending, minDate, maxDate)
            
            while true do
                -- GetCurrentPageDatas()로 현재 페이지의 목록을 가져올 수 있습니다.
                local versions = versionPages:GetCurrentPageDatas()
                for _, version in pairs(versions) do
                    -- DataStorageVersionInfo를 통해 생성 시간과 Version 값을 조회할 수 있습니다.
                    log(version.CreateTime)
                    log(version.Version)
                end
            
                -- IsLastPage 프로퍼티를 통해 현재 페이지가 마지막 페이지인지 확인할 수 있습니다.
                if versionPages.IsLastPage == true then
                    break
                end
            
                -- MoveToNextPageAndWait()로 다음 페이지로 넘어갈 수 있습니다.
                versionPages:MoveToNextPageAndWait()
            end
        end
    end
    

#### GetAndWait

데이터를 업데이트 하는 예제입니다.
    
    
    @Component
    script ExpectedValueUpdater extends Component
        @ExecSpace("ServerOnly")
        method void OnBeginPlay()
            local ds = _DataStorageService:GetGlobalDataStorage("StorageName")
            
            local errorCode, oldValue = ds:GetAndWait("Key")
            if errorCode ~= 0 then
                log("failed")
                return
            end
            
            -- DataStorage 안에 예상하는 값이 저장되어 있을 경우 "NewValue"를 저장하고 다른 값이 저장되어 있을 경우 실패합니다.
            local errorCode2, newValue = ds:UpdateAndWait("Key", oldValue, "NewValue")
        end
    end
    

#### 버전 활용

버전을 활용하는 예제입니다.
    
    
    @Component
    script DataVersionControl extends Component
        @ExecSpace("ServerOnly")
        method void OnBeginPlay()
            local ds = _DataStorageService:GetGlobalDataStorage("StorageName")
            
            local keyInfo = DataStorageKeyInfo()
            keyInfo.Key = "Key"
            keyInfo.Version = "Version1"
            
            ds:SetByInfoAndWait(keyInfo, "Value")
            
            -- 기존 버전의 "Value" 값을 덮어 쓰는 대신 새로운 버전을 만들어 저장합니다.
            keyInfo.Key = "Key"
            keyInfo.Version = "Version2"
            ds:SetByInfoAndWait(keyInfo, "Value2")
            
            -- "Value" 값은 덮어 씌워진게 아니기 때문에 아직 유효하며 Version1을 지정하여 "Value1" 값을 가져올 수 있습니다.
            keyInfo.Key = "Key"
            keyInfo.Version = "Version1"
            local errorCode, oldValue = ds:GetByInfoAndWait(keyInfo)
            
            -- 과거 버전의 값을 가져와 최신 버전에 덮어씁니다. 이후 GetAndWait 함수를 호출하면 "Value2" 값이 아닌 "Value" 값이 반환됩니다.
            keyInfo.Key = "Key"
            keyInfo.Version = "Version2"
            ds:SetByInfoAndWait(keyInfo, oldValue)
        end
    end
    

# SeeAlso

  * table
  * DataStorageKeyInfo
  * DateTime
  * DataStorageService
  * [Data DB 저장 및 불러오기](/docs?postId=68)
  * [DataStorage 사용량 제한 알아보기](/docs?postId=1044)
  * [DataStorage 사용량 제한 활용하기](/docs?postId=1045)
  * [DataStorage 활용하기](/docs?postId=692)