파이어 베이스의 데이터 베이스 패키지를 연동하여, 프로젝트 간의 데이터 교환 기능을 구현했습니다.
본 문서는 그중 데이터 저장 기능부를 작성했습니다.
기능 구현에 필요한 SDK는 FirebaseDatabase 패키지였습니다.
해당 SDK는 구글 파이어베이스의 홈페이지에서 다운로드가 가능합니다.
데이터 베이스 연동은 기본적으로 파이어베이스 홈페이지에서 안내하는 것을 따라하면 됩니다.
다만, 프로젝트 키의 SHA를 입력해야하는 부분이 있는데, 해당 주소는 생성한(연동한) 빌드 프로젝트 키를 cmd창을 이용하여 확인이 가능합니다.
cmd 창을 켜서 키가 저장된 폴더로 이동합니다.
명령어는 아래와 같습니다.
드라이브 간 이동 == 드라이브명:
디렉터리 간 이동 == cd "주소"
키가 위치한 폴더에 도착했다면, 아래 명령어를 입력함으로써 SHA 지문 확인이 가능합니다.
keytool -list -v -keystore "key이름"
이후, 연동한 프로젝트의 설정에 들어가서 SHA 지문을 설정해줍니다.
이렇게 지문을 생성한 이후에는, 구글 서비스.json을 새로 받아서 Asset폴더에 저장해주어야 합니다.
프로젝트의 스크립트 내에서 DB를 연결해줍니다.
즉 파이어베이스 앱이 사용할 DB URL 주소를 설정해주는 것입니다.
데이터베이스의 URL주소는
RealTime Database에서 가져올 수 있습니다.
파이어베이스 매니저는 파이어베이스와의 연동을 담당하는 매니저 클래스입니다.
그렇기에, 유저 데이터를 저장하는 것 또한 파이어베이스 매니저를 거치게 됩니다.
SaveUserData는 유저 데이터를 저장하는 함수를 호출하는 함수입니다.
현재는 어플리케이션 종료 시에만 호출되어, 데이터가 저장되도록 했습니다.
UserClass에는 상단 그림과 같이 여러 맴버 변수들이 존재하며, 각 변수들을 분해하여 데이터베이스에 저장합니다.
즉, 데이터 베이스의 트리 구조는 다음과 같습니다.
Default - userID - USER_UID(각 아이디의 고유번호) - UserData - inData(user class's data)
inData 노드가 아래 그림과 같이 실질적으로 유저 클래스의 데이터를 분해하여, 데이터를 저장하게 되는 곳입니다.
이렇게 UserClass 데이터를 분해하여, 오브젝트화하고 데이터베이스에 Import하는 함수가 DB_Writer() 함수입니다.
UserClass - userCharacter 변수를 저장하는 파트와
UserClass - userEquippedWeapon 변수를 저장하는 파트입니다.
UserClass의 userEquippedEquipment ~ userLastConnectTime 까지의 데이터를 저장하는 파트입니다.
나머지 모든 데이터를 저장하는 파트입니다.
리스트 데이터는 위의 함수를 이용하여, 일괄적으로 DB 쓰기 처리합니다.
<T> Where를 이용하여 코드를 간결하게 줄이지 않는 이유는, DB에 장비와 무기와 관련된 전체 정보를 저장하기 위함입니다.
이러한 데이터의 저장에는 주의해야할 점이 있습니다.
그것은 UserClass 객체를 편집없이 바로 데이터 베이스에 삽입 시, 올바르게 데이터가 저장되지 않는다는 것입니다.
여기서 해야하는 과정이 오브젝트 화 입니다.
파이어베이스는 기본적으로 JSON 형태의 데이터를 다루기 때문에, 데이터를 오브젝트에서 Dictionary로 변환하여 파이어베이스에 저장하는 것이 좋습니다. JSON 형식은 키-값 쌍을 사용하며, Dictionary 또한 이러한 특성을 가진 데이터 구조이기 때문에 파이어베이스와의 통신에 유리합니다.
특히 캐릭터 클래스나 엘리멘트 클래스 등에서는 파이어 베이스가 지원하지 않는 속성(열거형 등)의 데이터를 보유하고 있기 때문에, 데이터를 수정해야할 필요가 있습니다.
이러한 작업은 ToDictionary() 메서드를 통해 이루어집니다.
사용자 정의 클래스(ItemClass, WeaponAndEquipCls 등)나 객체를 Dictionary로 변환하는 작업은 해당 클래스의 속성들을 파이어베이스에서 지원하는 데이터 형식(Dictionaryt<string, object>)으로 매핑하는 과정을 수행합니다.
아이템 클래스의 데이터를 Dictionary<string,object> 형식으로 가공해서 Return하는 함수입니다.
여기서 string은 Json의 킷값으로, object는 Json의 Value로 활용될 것입니다.
캐릭터 클래스 또한 마찬가지입니다.
클래스의 맴버 변수들을 object화 하여, 딕셔너리에 Add하고 리턴하여, 파이어베이스 클래스의 SetValueAsync() 함수를 통해서 데이터를 저장합니다.