Hive 데이터 스토어는 NoSQL 클라우드 데이터베이스를 사용하여 게임 구성 요소나 설정 정보 등 클라이언트에 사용되는 데이터를 저장하고 동기화할 수 있습니다. 배포 및 유지관리할 서버가 필요없는 클라이언트 기반의 게임이나 클라이언트 간 실시간 업데이트가 필요한 경우 좋은 솔루션이 될 수 있습니다.
Hive 데이터 스토어의 특징은 다음과 같습니다:
- 데이터가 각 게임의 개별 저장소에 저장됩니다.
- 모든 데이터는 암호화되어 안전하게 전송됩니다.
- SQL 데이터베이스와 달리 테이블이나 행이 없으며 컬렉션으로 구성된 문서에 데이터를 저장합니다.
- 데이터는 키-값 쌍으로 문서화해 저장할 수 있습니다.
- 다수의 작은 문서가 모인 컬렉션을 저장하는 데에 최적화되어 있습니다.
- 키-값 설계 시 주의사항은 개발자 사이트의 운영 > 게임 데이터 스토어를 참고하세요.
데이터 추가
데이터는 하나의 키-값 쌍으로 추가하거나 한꺼번에 여러 쌍을 Map 형태로 추가할 수 있습니다. 요청 후 성공 또는 실패 결과를 받을 수 있습니다.
다음은 키 값 한 쌍의 데이터를 추가하는 예제 코드입니다.
API Reference: DataStore.set
1 2 3 4 5 6 7 8 9 10 11 12 |
using hive; string key = "your data key"; string value = "your data value"; DataStore.set(key, value, (ResultAPI result) => { if (result.isSuccess()) { // 호출 성공 } else { // 호출 실패. 하단 에러코드 참고 } }); |
API Reference: DataStore::set
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
#include <HIVE_SDK_Plugin/HIVE_CPP.h> using namespace std; using namespace hive; string key = "your data key"; string value = "your data value"; DataStore::set(key, value, [=](ResultAPI const & result) { if (result.isSuccess()) { // 호출 성공 } else { // 호출 실패. 하단 에러코드 참고 } }); |
API Reference: DataStore.set
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
import com.hive.DataStore import com.hive.ResultAPI val key = "your data key" val value = "your data value" DataStore.set(key, value, object : DataStore.DataStoreSetListener { override fun onDataStoreSet(result: ResultAPI) { if (result.isSuccess) { // 호출 성공 } else { // 호출 실패. 하단 에러코드 참고 } } }) |
API Reference: DataStore.INSTANCE.set
1 2 3 4 5 6 7 8 9 10 11 12 13 |
import com.hive.DataStore; import com.hive.ResultAPI; String key = "your data key"; String value = "your data value"; DataStore.INSTANCE.set(key, value, result -> { if (result.isSuccess()) { // 호출 성공 } else { // 호출 실패. 하단 에러코드 참고 } }); |
API Reference: DataStoreInterface.set
1 2 3 4 5 6 7 8 9 10 11 12 13 |
import HIVEService let key = "your data key" let value = "your data value" DataStoreInterface.set(key, value: value) { result in if result.isSuccess() { // 호출 성공 } else { // 호출 실패. 하단 에러코드 참고 } } |
API Reference: HIVEDataStore set
1 2 3 4 5 6 7 8 9 10 11 12 |
#import <HIVEService/HIVEService-Swift.h> NSString *key = @"your data key"; NSString *value = @"your data value"; [HIVEDataStore set: key value: value handler: ^(HIVEResultAPI *result) { if ([result isSuccess]) { // 호출 성공 } else { // 호출 실패. 하단 에러코드 참고 } }]; |
Map 형태의 데이터를 추가하는 예제 코드입니다.
API Reference: DataStore.set
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
using hive; Dictionary<string, string> map = new Dictionary<string, string> { {"key1", "value1"}, {"key2", "value2"}, {"key3", "value3"} }; DataStore.set(map, (ResultAPI result) => { if (result.isSuccess()) { // 호출 성공 } else { // 호출 실패. 하단 에러코드 참고 } }); |
API Reference: DataStore::set
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
#include <HIVE_SDK_Plugin/HIVE_CPP.h> using namespace std; using namespace hive; map<string, string> map = { {"key1", "value1"}, {"key2", "value2"}, {"key3", "value3"} }; DataStore::set(map, [=](ResultAPI const & result) { if (result.isSuccess()) { // 호출 성공 } else { // 호출 실패. 하단 에러코드 참고 } }); |
API Reference: DataStore.set
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
import com.hive.DataStore import com.hive.ResultAPI val map = mapOf( "key1" to "value1", "key2" to "value2", "key3" to "value3", ) DataStore.set(map, object : DataStore.DataStoreSetListener { override fun onDataStoreSet(result: ResultAPI) { if (result.isSuccess) { // 호출 성공 } else { // 호출 실패. 하단 에러코드 참고 } } }) |
API Reference: DataStore.INSTANCE.set
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
import com.hive.DataStore; import com.hive.ResultAPI; Map<String, String> map = new HashMap<>(); map.put("key1", "value1"); map.put("key2", "value2"); map.put("key3", "value3"); DataStore.INSTANCE.set(map, result -> { if (result.isSuccess()) { // 호출 성공 } else { // 호출 실패. 하단 에러코드 참고 } }); |
API Reference: DataStoreInterface.set
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
import HIVEService let map: [String: String] = [ "key1" : "value1", "key2" : "value2", "key3" : "value3" ] DataStoreInterface.set(map) { result in if result.isSuccess() { // 호출 성공 } else { // 호출 실패. 하단 에러코드 참고 } } |
API Reference: HIVEDataStore set
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
#import <HIVEService/HIVEService-Swift.h> NSDictionary<NSString *, NSString *> *map = @{ @"key1" : @"value1", @"key2" : @"value2", @"key3" : @"value3" }; [HIVEDataStore set: map handler: ^(HIVEResultAPI *result) { if ([result isSuccess]) { // 호출 성공 } else { // 호출 실패. 하단 에러코드 참고 } }]; |
데이터 가져오기
데이터를 가져오는 3가지 방법은 다음과 같습니다:
-
- 내 데이터 하나 가져오기
- 내 데이터 모두 가져오기
- 키로 전체 데이터 가져오기
내 정보를 하나 또는 모두 가져올 수 있는 방법이 있고, 요청 키에 해당하는 전체 데이터를 가져오는 방법이 있습니다. 아래에 각 방법에 따라 제시된 예제 코드를 확인해보세요.
다음은 내 데이터 하나를 가져오는 예제 코드입니다.
API Reference: DataStore.get
1 2 3 4 5 6 7 8 9 10 11 |
using hive; string key = "your data key"; DataStore.get(key, (ResultAPI result, string data) => { if (result.isSuccess()) { // 호출 성공 } else { // 호출 실패. 하단 에러코드 참고 } }); |
API Reference: DataStore::get
1 2 3 4 5 6 7 8 9 10 11 12 13 |
#include <HIVE_SDK_Plugin/HIVE_CPP.h> using namespace std; using namespace hive; string key = "your data key"; DataStore::get(key, [=](ResultAPI const & result, string data) { if (result.isSuccess()) { // 호출 성공 } else { // 호출 실패. 하단 에러코드 참고 } }); |
API Reference: DataStore.get
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
import com.hive.DataStore import com.hive.ResultAPI val key = "your data key" DataStore.get(key, object : DataStore.DataStoreGetListener { override fun onDataStoreGet(result: ResultAPI, data: String?) { if (result.isSuccess) { // 호출 성공 } else { // 호출 실패. 하단 에러코드 참고 } } }) |
API Reference: DataStore.INSTANCE.get
1 2 3 4 5 6 7 8 9 10 11 12 |
import com.hive.DataStore; import com.hive.ResultAPI; String key = "your data key"; DataStore.INSTANCE.get(key, (result, data) -> { if (result.isSuccess()) { // 호출 성공 } else { // 호출 실패. 하단 에러코드 참고 } }); |
API Reference: DataStoreInterface.get
1 2 3 4 5 6 7 8 9 10 11 |
import HIVEService let key = "your data key" DataStoreInterface.get(key) { result, data in if result.isSuccess() { // 호출 성공 } else { // 호출 실패. 하단 에러코드 참고 } } |
API Reference: HIVEDataStore get
1 2 3 4 5 6 7 8 9 10 11 |
#import <HIVEService/HIVEService-Swift.h> NSString* key = @"your data key"; [HIVEDataStore get: key handler: ^(HIVEResultAPI *result, NSString *data) { if ([result isSuccess]) { // 호출 성공 } else { // 호출 실패. 하단 에러코드 참고 } }]; |
내 모든 데이터를 가져오는 예제 코드입니다.
API Reference: DataStore.getMyData
1 2 3 4 5 6 7 8 9 10 |
using hive; DataStore.getMyData((ResultAPI result, Dictionary<string, string> myData) => { if (result.isSuccess()) { // 호출 성공 // myData : 추가했던 키-값 형태의 Map } else { // 호출 실패. 하단 에러코드 참고 } }); |
API Reference: DataStore.getMyData
1 2 3 4 5 6 7 8 9 10 11 12 |
#include <HIVE_SDK_Plugin/HIVE_CPP.h> using namespace std; using namespace hive; DataStore.getMyData([=](ResultAPI const & result, map<string, string> const & myData) { if (result.isSuccess()) { // 호출 성공 // myData : 추가했던 키-값 형태의 Map } else { // 호출 실패. 하단 에러코드 참고 } }); |
API Reference: DataStore.getMyData
1 2 3 4 5 6 7 8 9 10 11 12 13 |
import com.hive.DataStore import com.hive.ResultAPI DataStore.getMyData(object : DataStore.DataStoreMyDataListener { override fun onDataStoreMyData(result: ResultAPI, myData: Map<String, String>) { if (result.isSuccess) { // 호출 성공 // myData : 추가했던 키-값 형태의 Map } else { // 호출 실패. 하단 에러코드 참고 } } }) |
API Reference: DataStore.INSTANCE.getMyData
1 2 3 4 5 6 7 8 9 10 11 |
import com.hive.DataStore import com.hive.ResultAPI DataStore.INSTANCE.getMyData((result, myData) -> { if (result.isSuccess()) { // 호출 성공 // myData : 추가했던 키-값 형태의 Map } else { // 호출 실패. 하단 에러코드 참고 } }); |
API Reference: DataStoreInterface.getMyData
1 2 3 4 5 6 7 8 9 10 |
import HIVEService DataStoreInterface.getMyData() { result, myData in if result.isSuccess() { // 호출 성공 // myData : 추가했던 키-값 형태의 Map } else { // 호출 실패. 하단 에러코드 참고 } } |
API Reference: HIVEDataStore getMyData
1 2 3 4 5 6 7 8 9 10 |
#import <HIVEService/HIVEService-Swift.h> [HIVEDataStore getMyData: ^(HIVEResultAPI *result, NSDictionary<NSString *, NSString *> *myData) { if ([result isSuccess]) { // 호출 성공 // myData : 추가했던 키-값 형태의 Map } else { // 호출 실패. 하단 에러코드 참고 } }]; |
키로 전체 데이터를 가져오는 예제 코드입니다.
API Reference: DataStore.getUsersData
1 2 3 4 5 6 7 8 9 10 11 12 13 |
using hive; string key = "your data key"; DataStore.getUsersData(key, (ResultAPI result, string key, Dictionary<long, string> usersData) => { if (result.isSuccess()) { // 호출 성공 // key : 입력한 키 // usersData : PlayerId-값 형태의 Map. 키가 long 타입에 주의. } else { // 호출 실패. 하단 에러코드 참고 } }); |
API Reference: DataStore::getUsersData
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
#include <HIVE_SDK_Plugin/HIVE_CPP.h> using namespace std; using namespace hive; string key = "your data key"; DataStore::getUsersData(key, [=](ResultAPI const & result, string key, map const & usersData) { if (result.isSuccess()) { // 호출 성공 // key : 입력한 키 // usersData : PlayerId-값 형태의 Map. 키가 long long 타입에 주의. } else { // 호출 실패. 하단 에러코드 참고 } }); |
API Reference: DataStore.getUsersData
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
import com.hive.DataStore import com.hive.ResultAPI val key = "your data key" DataStore.getUsersData(key, object : DataStore.DataStoreUsersDataListener { override fun onDataStoreUsersData(result: ResultAPI, key: String?, usersData: Map<Long, String>) { if (result.isSuccess) { // 호출 성공 // key : 입력한 키 // usersData : PlayerId-값 형태의 Map. 키가 Long 타입에 주의. } else { // 호출 실패. 하단 에러코드 참고 } } }) |
API Reference: DataStore.INSTANCE.getUsersData
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
import com.hive.DataStore; import com.hive.ResultAPI; String key = "your data key"; DataStore.INSTANCE.getUsersData(key, (result, key1, usersData) -> { if (result.isSuccess()) { // 호출 성공 // key : 입력한 키 // usersData : PlayerId-값 형태의 Map. 키가 Long 타입에 주의. } else { // 호출 실패. 하단 에러코드 참고 } }); |
API Reference: DataStoreInterface.getUsersData
1 2 3 4 5 6 7 8 9 10 11 12 13 |
import HIVEService let key = "your data key" DataStoreInterface.getUsersData(key) { result, key, usersData in if result.isSuccess() { // 호출 성공 // key : 입력한 키 // usersData : PlayerId-값 형태의 Map. 키가 Int64 타입에 주의. } else { // 호출 실패. 하단 에러코드 참고 } } |
API Reference: HIVEDataStore getUsersData
1 2 3 4 5 6 7 8 9 10 11 12 13 |
#import <HIVEService/HIVEService-Swift.h> NSString* key = @"your data key"; [HIVEDataStore getUsersData: key handler: ^(HIVEResultAPI *result, NSString *key, NSDictionary<NSNumber *, NSString *> *usersData) { if ([result isSuccess]) { // success // key : 입력한 키 // usersData : PlayerId-값 형태의 Map. 키가 NSNumber * 타입에 주의. } else { // 호출 실패. 하단 에러코드 참고 } }]; |
에러 코드
Error Code | Message | Description |
RESPONSE_FAIL | DataStoreNotExistKey | 서버에 해당 키가 없을 경우 |
RESPONSE_FAIL | DataStoreNotExistColumn | 서버에 Column Family(table)이 없을 경우 |
RESPONSE_FAIL | DataStoreGameIsBeingInspected | 해당 게임의 데이터 스토어가 점검중인 경우 |
DEVELOPER_ERROR | DataStoreNotExistPublicKey | 공개키가 없을 경우. 콘솔 설정 확인 필요 |
NEED_INITIALIZE | DataStoreNotInitialized | SDK Setup이 되어 있지 않을 경우 (AuthV4.setup) |
INVALID_SESSION | DataStoreNeedSignIn | Sign-In 이 되어 있지 않을 경우 |
DEVELOPER_ERROR | DataStoreDisabled | 데이터 스토어 미사용으로 설정되어 있을 경우. 콘솔 설정 확인 필요 |
RESPONSE_FAIL | DataStoreResponseError | 서버에 연결은 됐으나 작업에 실패했을 경우. 에러 메시지 확인 필요 |
INVALID_PARAM | DataStoreInvalidParam | set() API 호출 과정에서 잘못 입력된 파라미터로 실패한 경우 |