728x90
오늘 학습한 내용
1) 저장&불러오기 시스템에서의 마이그레이션 기능 구현
저장 데이터 구조 변경 시 이전 버전의 데이터를 자동으로 변환해 최신 구조에 맞추는 마이그레이션 시스템을 도입했습니다. 이를 통해 유저 데이터의 호환성과 안정성을 확보했습니다.
문제 및 해결 과정
1) 문제 (게임 업데이트 후 이전 저장 데이터가 불러와지지 않음)
게임의 저장 데이터 구조가 변경되며, 구버전에서 저장된 데이터를 역직렬화할 때 오류가 발생하거나 필드가 누락되는 문제가 있었습니다.
시도한 해결 방법
- SaveData 구조체에 version 필드 추가
- 불러오기 시 version을 기준으로 데이터 구조를 점진적으로 변환하는 MigrateData() 함수 작성
- 필드 삭제/추가에 대비하여 [JsonExtensionData]를 사용해 미지정 필드도 버리지 않고 보존함
예시 – PlayerData 구조
[Serializable]
public struct PlayerData
{
[JsonProperty("gold")]
public int gold;
[JsonExtensionData]
public Dictionary<string, JToken> extraPlayerFields;
}
예시 – 마이그레이션 처리
// 버전 1 -> 버전 2 (예시로 language 필드 추가)
if (data.version == 1)
{
data.settings = new SettingsData
{
bgmVolume = Mathf.Clamp(data.settings.bgmVolume, 0f, 1f),
sfxVolume = Mathf.Clamp(data.settings.sfxVolume, 0f, 1f),
language = "en", // 기본 언어 설정
extraSettingsFields = data.settings.extraSettingsFields ?? new Dictionary<string, JToken>()
};
data.version = 2;
}
// 버전 2 -> 버전 3 (PlayerData의 nickName 삭제)
if (data.version == 2)
{
data.player = new PlayerData
{
gold = Mathf.Max(0, data.player.gold),
extraPlayerFields = new Dictionary<string, JToken>()
};
data.version = 3;
}
결과
- 구조 변경이 발생해도 데이터 유실 없이 안정적으로 로드할 수 있게 되었습니다.
- 역직렬화 예외 없이 하위 호환성을 유지할 수 있었으며 구조 변경 시에도 수월하게 마이그레이션 처리를 할 수 있게 되었습니다.
- 개발 중 구조 변경에 유연하게 대응할 수 있어, 장기적인 유지보수 측면에서도 유리하다고 판단했습니다.
새롭게 알게 된 점
데이터 버전 관리의 중요성
구조가 자주 바뀌는 게임일수록 version 필드를 활용한 마이그레이션 설계가 필수적입니다.
JsonExtensionData의 유용성
예기치 못한 필드 변경에 대응할 수 있는 강력한 기능입니다. 유연한 구조 변경을 위해 이용할 가치가 있습니다.
클라우드 저장 구조 설계 시 고려 사항
기본값 설정, 유효성 검사, 예외 처리 등을 반드시 함께 고려해야 합니다. 데이터 구조만 짜는 것으로는 부족합니다.
728x90
'내일배움캠프' 카테고리의 다른 글
내일배움캠프 Unity - TIL : 25.04.17 (0) | 2025.04.17 |
---|---|
내일배움캠프 Unity - TIL : 25.04.16 (0) | 2025.04.16 |
내일배움캠프 Unity - TIL : 25.04.14 (0) | 2025.04.14 |
내일배움캠프 Unity - TIL : 25.04.09 (0) | 2025.04.09 |
내일배움캠프 Unity - TIL : 25.04.04 (1) | 2025.04.04 |